@remotion/webcodecs 4.0.228 → 4.0.229

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 (40) hide show
  1. package/dist/audio-decoder-config.js +3 -0
  2. package/dist/calculate-progress.d.ts +2 -2
  3. package/dist/calculate-progress.js +3 -3
  4. package/dist/can-copy-audio-track.d.ts +8 -0
  5. package/dist/can-copy-audio-track.js +10 -0
  6. package/dist/can-copy-video-track.d.ts +8 -0
  7. package/dist/can-copy-video-track.js +13 -0
  8. package/dist/can-reencode-audio-track.d.ts +7 -0
  9. package/dist/can-reencode-audio-track.js +21 -0
  10. package/dist/can-reencode-audio.d.ts +7 -0
  11. package/dist/can-reencode-audio.js +21 -0
  12. package/dist/can-reencode-video-track.d.ts +6 -0
  13. package/dist/can-reencode-video-track.js +15 -0
  14. package/dist/can-reencode-video.d.ts +6 -0
  15. package/dist/can-reencode-video.js +15 -0
  16. package/dist/codec-id.d.ts +7 -2
  17. package/dist/codec-id.js +7 -0
  18. package/dist/convert-encoded-chunk.d.ts +2 -0
  19. package/dist/convert-encoded-chunk.js +15 -0
  20. package/dist/convert-media.d.ts +16 -7
  21. package/dist/convert-media.js +15 -12
  22. package/dist/esm/index.mjs +294 -178
  23. package/dist/index.d.ts +8 -1
  24. package/dist/index.js +12 -1
  25. package/dist/on-audio-track.d.ts +4 -4
  26. package/dist/on-audio-track.js +21 -21
  27. package/dist/on-frame.d.ts +11 -0
  28. package/dist/on-frame.js +32 -0
  29. package/dist/on-video-track.d.ts +7 -6
  30. package/dist/on-video-track.js +24 -20
  31. package/dist/polyfill-encoded-audio-chunk.d.ts +3 -0
  32. package/dist/polyfill-encoded-audio-chunk.js +5 -0
  33. package/dist/resolve-audio-action.d.ts +15 -11
  34. package/dist/resolve-audio-action.js +23 -21
  35. package/dist/resolve-video-action.d.ts +14 -11
  36. package/dist/resolve-video-action.js +17 -24
  37. package/dist/video-encoder-config.d.ts +6 -1
  38. package/dist/video-encoder-config.js +6 -1
  39. package/dist/video-encoder.d.ts +1 -1
  40. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -1,10 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createVideoEncoder = exports.createVideoDecoder = exports.convertMedia = exports.createAudioEncoder = exports.createAudioDecoder = void 0;
3
+ exports.createVideoEncoder = exports.createVideoDecoder = exports.convertMedia = exports.getAvailableVideoCodecs = exports.getAvailableAudioCodecs = exports.canReencodeVideoTrack = exports.canReencodeAudioTrack = exports.canCopyVideoTrack = exports.canCopyAudioTrack = exports.createAudioEncoder = exports.createAudioDecoder = void 0;
4
4
  var audio_decoder_1 = require("./audio-decoder");
5
5
  Object.defineProperty(exports, "createAudioDecoder", { enumerable: true, get: function () { return audio_decoder_1.createAudioDecoder; } });
6
6
  var audio_encoder_1 = require("./audio-encoder");
7
7
  Object.defineProperty(exports, "createAudioEncoder", { enumerable: true, get: function () { return audio_encoder_1.createAudioEncoder; } });
8
+ var can_copy_audio_track_1 = require("./can-copy-audio-track");
9
+ Object.defineProperty(exports, "canCopyAudioTrack", { enumerable: true, get: function () { return can_copy_audio_track_1.canCopyAudioTrack; } });
10
+ var can_copy_video_track_1 = require("./can-copy-video-track");
11
+ Object.defineProperty(exports, "canCopyVideoTrack", { enumerable: true, get: function () { return can_copy_video_track_1.canCopyVideoTrack; } });
12
+ var can_reencode_audio_track_1 = require("./can-reencode-audio-track");
13
+ Object.defineProperty(exports, "canReencodeAudioTrack", { enumerable: true, get: function () { return can_reencode_audio_track_1.canReencodeAudioTrack; } });
14
+ var can_reencode_video_track_1 = require("./can-reencode-video-track");
15
+ Object.defineProperty(exports, "canReencodeVideoTrack", { enumerable: true, get: function () { return can_reencode_video_track_1.canReencodeVideoTrack; } });
16
+ var codec_id_1 = require("./codec-id");
17
+ Object.defineProperty(exports, "getAvailableAudioCodecs", { enumerable: true, get: function () { return codec_id_1.getAvailableAudioCodecs; } });
18
+ Object.defineProperty(exports, "getAvailableVideoCodecs", { enumerable: true, get: function () { return codec_id_1.getAvailableVideoCodecs; } });
8
19
  var convert_media_1 = require("./convert-media");
9
20
  Object.defineProperty(exports, "convertMedia", { enumerable: true, get: function () { return convert_media_1.convertMedia; } });
10
21
  var video_decoder_1 = require("./video-decoder");
@@ -1,16 +1,16 @@
1
1
  import type { LogLevel, MediaFn, OnAudioTrack } from '@remotion/media-parser';
2
2
  import type { ConvertMediaAudioCodec } from './codec-id';
3
- import type { ConvertMediaState } from './convert-media';
3
+ import type { ConvertMediaContainer, ConvertMediaState } from './convert-media';
4
4
  import Error from './error-cause';
5
5
  import type { ResolveAudioActionFn } from './resolve-audio-action';
6
- export declare const makeAudioTrackHandler: ({ state, audioCodec, convertMediaState, controller, abortConversion, onMediaStateUpdate, onAudioTrack, bitrate, logLevel, }: {
6
+ export declare const makeAudioTrackHandler: ({ state, audioCodec, convertMediaState, controller, abortConversion, onMediaStateUpdate, onAudioTrack, logLevel, container, }: {
7
7
  state: MediaFn;
8
8
  audioCodec: ConvertMediaAudioCodec;
9
9
  convertMediaState: ConvertMediaState;
10
10
  controller: AbortController;
11
11
  abortConversion: (errCause: Error) => void;
12
12
  onMediaStateUpdate: null | ((state: ConvertMediaState) => void);
13
- onAudioTrack: ResolveAudioActionFn;
14
- bitrate: number;
13
+ onAudioTrack: ResolveAudioActionFn | null;
15
14
  logLevel: LogLevel;
15
+ container: ConvertMediaContainer;
16
16
  }) => OnAudioTrack;
@@ -8,32 +8,20 @@ const audio_decoder_1 = require("./audio-decoder");
8
8
  const audio_decoder_config_1 = require("./audio-decoder-config");
9
9
  const audio_encoder_1 = require("./audio-encoder");
10
10
  const audio_encoder_config_1 = require("./audio-encoder-config");
11
+ const convert_encoded_chunk_1 = require("./convert-encoded-chunk");
11
12
  const error_cause_1 = __importDefault(require("./error-cause"));
12
13
  const resolve_audio_action_1 = require("./resolve-audio-action");
13
- const makeAudioTrackHandler = ({ state, audioCodec, convertMediaState, controller, abortConversion, onMediaStateUpdate, onAudioTrack, bitrate, logLevel, }) => async (track) => {
14
- const audioEncoderConfig = await (0, audio_encoder_config_1.getAudioEncoderConfig)({
15
- codec: audioCodec,
16
- numberOfChannels: track.numberOfChannels,
17
- sampleRate: track.sampleRate,
18
- bitrate,
19
- });
20
- const audioDecoderConfig = await (0, audio_decoder_config_1.getAudioDecoderConfig)({
21
- codec: track.codec,
22
- numberOfChannels: track.numberOfChannels,
23
- sampleRate: track.sampleRate,
24
- description: track.description,
25
- });
26
- const audioOperation = await (0, resolve_audio_action_1.resolveAudioAction)({
27
- audioDecoderConfig,
28
- audioEncoderConfig,
14
+ const makeAudioTrackHandler = ({ state, audioCodec, convertMediaState, controller, abortConversion, onMediaStateUpdate, onAudioTrack, logLevel, container, }) => async (track) => {
15
+ const audioOperation = await (onAudioTrack !== null && onAudioTrack !== void 0 ? onAudioTrack : resolve_audio_action_1.defaultResolveAudioAction)({
29
16
  audioCodec,
30
17
  track,
31
- resolverFunction: onAudioTrack,
18
+ logLevel,
19
+ container,
32
20
  });
33
- if (audioOperation === 'drop') {
21
+ if (audioOperation.type === 'drop') {
34
22
  return null;
35
23
  }
36
- if (audioOperation === 'copy') {
24
+ if (audioOperation.type === 'copy') {
37
25
  const addedTrack = await state.addTrack({
38
26
  type: 'audio',
39
27
  codec: audioCodec,
@@ -42,11 +30,23 @@ const makeAudioTrackHandler = ({ state, audioCodec, convertMediaState, controlle
42
30
  codecPrivate: track.codecPrivate,
43
31
  });
44
32
  return async (audioSample) => {
45
- await state.addSample(new EncodedAudioChunk(audioSample), addedTrack.trackNumber, false);
33
+ await state.addSample(audioSample, addedTrack.trackNumber, false);
46
34
  convertMediaState.encodedAudioFrames++;
47
35
  onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
48
36
  };
49
37
  }
38
+ const audioEncoderConfig = await (0, audio_encoder_config_1.getAudioEncoderConfig)({
39
+ numberOfChannels: track.numberOfChannels,
40
+ sampleRate: track.sampleRate,
41
+ codec: audioOperation.audioCodec,
42
+ bitrate: audioOperation.bitrate,
43
+ });
44
+ const audioDecoderConfig = await (0, audio_decoder_config_1.getAudioDecoderConfig)({
45
+ codec: track.codec,
46
+ numberOfChannels: track.numberOfChannels,
47
+ sampleRate: track.sampleRate,
48
+ description: track.description,
49
+ });
50
50
  if (!audioEncoderConfig) {
51
51
  abortConversion(new error_cause_1.default(`Could not configure audio encoder of track ${track.trackId}`));
52
52
  return null;
@@ -64,7 +64,7 @@ const makeAudioTrackHandler = ({ state, audioCodec, convertMediaState, controlle
64
64
  });
65
65
  const audioEncoder = (0, audio_encoder_1.createAudioEncoder)({
66
66
  onChunk: async (chunk) => {
67
- await state.addSample(chunk, trackNumber, false);
67
+ await state.addSample((0, convert_encoded_chunk_1.convertEncodedChunk)(chunk), trackNumber, false);
68
68
  convertMediaState.encodedAudioFrames++;
69
69
  onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
70
70
  },
@@ -0,0 +1,11 @@
1
+ import type { VideoTrack } from '@remotion/media-parser';
2
+ import type { ConvertMediaOnMediaStateUpdate, ConvertMediaOnVideoFrame, ConvertMediaState } from './convert-media';
3
+ import type { WebCodecsVideoEncoder } from './video-encoder';
4
+ export declare const onFrame: ({ frame, onVideoFrame, videoEncoder, onMediaStateUpdate, track, convertMediaState, }: {
5
+ frame: VideoFrame;
6
+ onVideoFrame: ConvertMediaOnVideoFrame | null;
7
+ videoEncoder: WebCodecsVideoEncoder;
8
+ onMediaStateUpdate: ConvertMediaOnMediaStateUpdate | null;
9
+ track: VideoTrack;
10
+ convertMediaState: ConvertMediaState;
11
+ }) => Promise<void>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.onFrame = void 0;
4
+ const onFrame = async ({ frame, onVideoFrame, videoEncoder, onMediaStateUpdate, track, convertMediaState, }) => {
5
+ const newFrame = onVideoFrame ? await onVideoFrame({ frame, track }) : frame;
6
+ if (newFrame.codedHeight !== frame.codedHeight) {
7
+ throw new Error(`Returned VideoFrame of track ${track.trackId} has different codedHeight (${newFrame.codedHeight}) than the input frame (${frame.codedHeight})`);
8
+ }
9
+ if (newFrame.codedWidth !== frame.codedWidth) {
10
+ throw new Error(`Returned VideoFrame of track ${track.trackId} has different codedWidth (${newFrame.codedWidth}) than the input frame (${frame.codedWidth})`);
11
+ }
12
+ if (newFrame.displayWidth !== frame.displayWidth) {
13
+ throw new Error(`Returned VideoFrame of track ${track.trackId} has different displayWidth (${newFrame.displayWidth}) than the input frame (${newFrame.displayHeight})`);
14
+ }
15
+ if (newFrame.displayHeight !== frame.displayHeight) {
16
+ throw new Error(`Returned VideoFrame of track ${track.trackId} has different displayHeight (${newFrame.displayHeight}) than the input frame (${newFrame.displayHeight})`);
17
+ }
18
+ if (newFrame.timestamp !== frame.timestamp) {
19
+ throw new Error(`Returned VideoFrame of track ${track.trackId} has different timestamp (${newFrame.timestamp}) than the input frame (${newFrame.timestamp}). When calling new VideoFrame(), pass {timestamp: frame.timestamp} as second argument`);
20
+ }
21
+ if (newFrame.duration !== frame.duration) {
22
+ throw new Error(`Returned VideoFrame of track ${track.trackId} has different duration (${newFrame.duration}) than the input frame (${newFrame.duration}). When calling new VideoFrame(), pass {duration: frame.duration} as second argument`);
23
+ }
24
+ await videoEncoder.encodeFrame(newFrame, newFrame.timestamp);
25
+ convertMediaState.decodedVideoFrames++;
26
+ onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
27
+ newFrame.close();
28
+ if (frame !== newFrame) {
29
+ frame.close();
30
+ }
31
+ };
32
+ exports.onFrame = onFrame;
@@ -1,16 +1,17 @@
1
- import type { LogLevel, MediaFn, OnVideoTrack, VideoTrack } from '@remotion/media-parser';
1
+ import type { LogLevel, MediaFn, OnVideoTrack } from '@remotion/media-parser';
2
2
  import type { ConvertMediaVideoCodec } from './codec-id';
3
- import type { ConvertMediaState } from './convert-media';
3
+ import type { ConvertMediaContainer, ConvertMediaOnMediaStateUpdate, ConvertMediaOnVideoFrame, ConvertMediaState } from './convert-media';
4
4
  import Error from './error-cause';
5
5
  import type { ResolveVideoActionFn } from './resolve-video-action';
6
- export declare const makeVideoTrackHandler: ({ state, onVideoFrame, onMediaStateUpdate, abortConversion, convertMediaState, controller, videoCodec, onVideoTrack, logLevel, }: {
6
+ export declare const makeVideoTrackHandler: ({ state, onVideoFrame, onMediaStateUpdate, abortConversion, convertMediaState, controller, videoCodec, onVideoTrack, logLevel, container, }: {
7
7
  state: MediaFn;
8
- onVideoFrame: null | ((frame: VideoFrame, track: VideoTrack) => Promise<void>);
9
- onMediaStateUpdate: null | ((state: ConvertMediaState) => void);
8
+ onVideoFrame: null | ConvertMediaOnVideoFrame;
9
+ onMediaStateUpdate: null | ConvertMediaOnMediaStateUpdate;
10
10
  abortConversion: (errCause: Error) => void;
11
11
  convertMediaState: ConvertMediaState;
12
12
  controller: AbortController;
13
13
  videoCodec: ConvertMediaVideoCodec;
14
- onVideoTrack: ResolveVideoActionFn;
14
+ onVideoTrack: ResolveVideoActionFn | null;
15
15
  logLevel: LogLevel;
16
+ container: ConvertMediaContainer;
16
17
  }) => OnVideoTrack;
@@ -4,33 +4,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.makeVideoTrackHandler = void 0;
7
+ const convert_encoded_chunk_1 = require("./convert-encoded-chunk");
7
8
  const error_cause_1 = __importDefault(require("./error-cause"));
9
+ const on_frame_1 = require("./on-frame");
8
10
  const resolve_video_action_1 = require("./resolve-video-action");
9
11
  const video_decoder_1 = require("./video-decoder");
10
12
  const video_decoder_config_1 = require("./video-decoder-config");
11
13
  const video_encoder_1 = require("./video-encoder");
12
14
  const video_encoder_config_1 = require("./video-encoder-config");
13
- const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortConversion, convertMediaState, controller, videoCodec, onVideoTrack, logLevel, }) => async (track) => {
15
+ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortConversion, convertMediaState, controller, videoCodec, onVideoTrack, logLevel, container, }) => async (track) => {
14
16
  if (controller.signal.aborted) {
15
17
  throw new error_cause_1.default('Aborted');
16
18
  }
17
- const videoEncoderConfig = await (0, video_encoder_config_1.getVideoEncoderConfig)({
18
- codec: videoCodec === 'vp9' ? 'vp09.00.10.08' : videoCodec,
19
- height: track.displayAspectHeight,
20
- width: track.displayAspectWidth,
21
- });
22
- const videoDecoderConfig = await (0, video_decoder_config_1.getVideoDecoderConfigWithHardwareAcceleration)(track);
23
- const videoOperation = await (0, resolve_video_action_1.resolveVideoAction)({
24
- videoDecoderConfig,
25
- videoEncoderConfig,
19
+ const videoOperation = await (onVideoTrack !== null && onVideoTrack !== void 0 ? onVideoTrack : resolve_video_action_1.defaultResolveVideoAction)({
26
20
  track,
27
21
  videoCodec,
28
- resolverFunction: onVideoTrack,
22
+ logLevel,
23
+ container,
29
24
  });
30
- if (videoOperation === 'drop') {
25
+ if (videoOperation.type === 'drop') {
31
26
  return null;
32
27
  }
33
- if (videoOperation === 'copy') {
28
+ if (videoOperation.type === 'copy') {
34
29
  const videoTrack = await state.addTrack({
35
30
  type: 'video',
36
31
  color: track.color,
@@ -40,11 +35,17 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
40
35
  codecPrivate: track.codecPrivate,
41
36
  });
42
37
  return async (sample) => {
43
- await state.addSample(new EncodedVideoChunk(sample), videoTrack.trackNumber, true);
38
+ await state.addSample(sample, videoTrack.trackNumber, true);
44
39
  convertMediaState.decodedVideoFrames++;
45
40
  onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
46
41
  };
47
42
  }
43
+ const videoEncoderConfig = await (0, video_encoder_config_1.getVideoEncoderConfig)({
44
+ codec: videoOperation.videoCodec,
45
+ height: track.displayAspectHeight,
46
+ width: track.displayAspectWidth,
47
+ });
48
+ const videoDecoderConfig = await (0, video_decoder_config_1.getVideoDecoderConfigWithHardwareAcceleration)(track);
48
49
  if (videoEncoderConfig === null) {
49
50
  abortConversion(new error_cause_1.default(`Could not configure video encoder of track ${track.trackId}`));
50
51
  return null;
@@ -63,7 +64,7 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
63
64
  });
64
65
  const videoEncoder = (0, video_encoder_1.createVideoEncoder)({
65
66
  onChunk: async (chunk) => {
66
- await state.addSample(chunk, trackNumber, true);
67
+ await state.addSample((0, convert_encoded_chunk_1.convertEncodedChunk)(chunk), trackNumber, true);
67
68
  convertMediaState.encodedVideoFrames++;
68
69
  onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
69
70
  },
@@ -79,11 +80,14 @@ const makeVideoTrackHandler = ({ state, onVideoFrame, onMediaStateUpdate, abortC
79
80
  const videoDecoder = (0, video_decoder_1.createVideoDecoder)({
80
81
  config: videoDecoderConfig,
81
82
  onFrame: async (frame) => {
82
- await (onVideoFrame === null || onVideoFrame === void 0 ? void 0 : onVideoFrame(frame, track));
83
- await videoEncoder.encodeFrame(frame);
84
- convertMediaState.decodedVideoFrames++;
85
- onMediaStateUpdate === null || onMediaStateUpdate === void 0 ? void 0 : onMediaStateUpdate({ ...convertMediaState });
86
- frame.close();
83
+ await (0, on_frame_1.onFrame)({
84
+ convertMediaState,
85
+ frame,
86
+ onMediaStateUpdate,
87
+ track,
88
+ videoEncoder,
89
+ onVideoFrame,
90
+ });
87
91
  },
88
92
  onError: (err) => {
89
93
  abortConversion(new error_cause_1.default(`Video decoder of track ${track.trackId} failed (see .cause of this error)`, {
@@ -0,0 +1,3 @@
1
+ import type { AudioSample } from '@remotion/media-parser';
2
+ import type { AudioOrVideoSample } from '@remotion/media-parser/src/create/cluster';
3
+ export declare const polyfillAudioChunk: (audioSample: AudioSample) => AudioOrVideoSample;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.polyfillAudioChunk = void 0;
4
+ const polyfillAudioChunk = (audioSample) => { };
5
+ exports.polyfillAudioChunk = polyfillAudioChunk;
@@ -1,15 +1,19 @@
1
- import type { AudioTrack } from '@remotion/media-parser';
1
+ import type { AudioTrack, LogLevel } from '@remotion/media-parser';
2
2
  import type { ConvertMediaAudioCodec } from './codec-id';
3
- export type AudioOperation = 'reencode' | 'copy' | 'drop';
3
+ import type { ConvertMediaContainer } from './convert-media';
4
+ export type AudioOperation = {
5
+ type: 'reencode';
6
+ bitrate: number;
7
+ audioCodec: ConvertMediaAudioCodec;
8
+ } | {
9
+ type: 'copy';
10
+ } | {
11
+ type: 'drop';
12
+ };
4
13
  export type ResolveAudioActionFn = (options: {
5
- canReencode: boolean;
6
- canCopy: boolean;
7
- }) => AudioOperation | Promise<AudioOperation>;
8
- export declare const defaultResolveAudioAction: ResolveAudioActionFn;
9
- export declare const resolveAudioAction: ({ audioDecoderConfig, audioEncoderConfig, track, audioCodec, resolverFunction, }: {
10
- audioDecoderConfig: AudioDecoderConfig | null;
11
- audioEncoderConfig: AudioEncoderConfig | null;
12
14
  track: AudioTrack;
13
15
  audioCodec: ConvertMediaAudioCodec;
14
- resolverFunction: ResolveAudioActionFn;
15
- }) => Promise<AudioOperation>;
16
+ logLevel: LogLevel;
17
+ container: ConvertMediaContainer;
18
+ }) => AudioOperation | Promise<AudioOperation>;
19
+ export declare const defaultResolveAudioAction: ResolveAudioActionFn;
@@ -1,30 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveAudioAction = exports.defaultResolveAudioAction = void 0;
4
- const canCopyAudioTrack = (inputCodec, outputCodec) => {
5
- if (outputCodec === 'opus') {
6
- return inputCodec === 'opus';
7
- }
8
- throw new Error(`Unhandled codec: ${outputCodec}`);
9
- };
10
- const defaultResolveAudioAction = ({ canReencode, canCopy, }) => {
3
+ exports.defaultResolveAudioAction = void 0;
4
+ const can_copy_audio_track_1 = require("./can-copy-audio-track");
5
+ const can_reencode_audio_track_1 = require("./can-reencode-audio-track");
6
+ const log_1 = require("./log");
7
+ const DEFAULT_BITRATE = 128000;
8
+ const defaultResolveAudioAction = async ({ track, audioCodec, logLevel, container, }) => {
9
+ const bitrate = DEFAULT_BITRATE;
10
+ const canCopy = (0, can_copy_audio_track_1.canCopyAudioTrack)({
11
+ inputCodec: track.codecWithoutConfig,
12
+ outputCodec: audioCodec,
13
+ container,
14
+ });
11
15
  if (canCopy) {
12
- return 'copy';
16
+ log_1.Log.verbose(logLevel, `Track ${track.trackId} (audio): Can copy = ${canCopy}, action = copy`);
17
+ return Promise.resolve({ type: 'copy' });
13
18
  }
19
+ const canReencode = await (0, can_reencode_audio_track_1.canReencodeAudioTrack)({
20
+ audioCodec,
21
+ track,
22
+ bitrate,
23
+ });
14
24
  if (canReencode) {
15
- return 'reencode';
25
+ log_1.Log.verbose(logLevel, `Track ${track.trackId} (audio): Can re-encode = ${canReencode}, can copy = ${canCopy}, action = reencode`);
26
+ return Promise.resolve({ type: 'reencode', bitrate, audioCodec });
16
27
  }
28
+ log_1.Log.verbose(logLevel, `Track ${track.trackId} (audio): Can re-encode = ${canReencode}, can copy = ${canCopy}, action = drop`);
17
29
  // TODO: Make a fail option?
18
- return 'drop';
30
+ return Promise.resolve({ type: 'drop' });
19
31
  };
20
32
  exports.defaultResolveAudioAction = defaultResolveAudioAction;
21
- const resolveAudioAction = async ({ audioDecoderConfig, audioEncoderConfig, track, audioCodec, resolverFunction, }) => {
22
- const canReencode = Boolean(audioDecoderConfig && audioEncoderConfig);
23
- const canCopy = canCopyAudioTrack(track.codecWithoutConfig, audioCodec);
24
- const resolved = await resolverFunction({
25
- canReencode,
26
- canCopy,
27
- });
28
- return resolved;
29
- };
30
- exports.resolveAudioAction = resolveAudioAction;
@@ -1,15 +1,18 @@
1
- import type { VideoTrack } from '@remotion/media-parser';
1
+ import type { LogLevel, VideoTrack } from '@remotion/media-parser';
2
2
  import type { ConvertMediaVideoCodec } from './codec-id';
3
- export type VideoOperation = 'reencode' | 'copy' | 'drop';
3
+ import type { ConvertMediaContainer } from './convert-media';
4
+ export type VideoOperation = {
5
+ type: 'reencode';
6
+ videoCodec: ConvertMediaVideoCodec;
7
+ } | {
8
+ type: 'copy';
9
+ } | {
10
+ type: 'drop';
11
+ };
4
12
  export type ResolveVideoActionFn = (options: {
5
- canReencode: boolean;
6
- canCopy: boolean;
7
- }) => VideoOperation | Promise<VideoOperation>;
8
- export declare const defaultResolveVideoAction: ResolveVideoActionFn;
9
- export declare const resolveVideoAction: ({ videoDecoderConfig, videoEncoderConfig, track, videoCodec, resolverFunction, }: {
10
- videoDecoderConfig: VideoDecoderConfig | null;
11
- videoEncoderConfig: VideoEncoderConfig | null;
12
13
  videoCodec: ConvertMediaVideoCodec;
13
14
  track: VideoTrack;
14
- resolverFunction: ResolveVideoActionFn;
15
- }) => Promise<VideoOperation>;
15
+ logLevel: LogLevel;
16
+ container: ConvertMediaContainer;
17
+ }) => VideoOperation | Promise<VideoOperation>;
18
+ export declare const defaultResolveVideoAction: ResolveVideoActionFn;
@@ -1,33 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveVideoAction = exports.defaultResolveVideoAction = void 0;
4
- const canCopyVideoTrack = (inputCodec, outputCodec) => {
5
- if (outputCodec === 'vp8') {
6
- return inputCodec === 'vp8';
7
- }
8
- if (outputCodec === 'vp9') {
9
- return inputCodec === 'vp9';
10
- }
11
- throw new Error(`Unhandled codec: ${outputCodec}`);
12
- };
13
- const defaultResolveVideoAction = ({ canReencode, canCopy, }) => {
3
+ exports.defaultResolveVideoAction = void 0;
4
+ const can_copy_video_track_1 = require("./can-copy-video-track");
5
+ const can_reencode_video_track_1 = require("./can-reencode-video-track");
6
+ const log_1 = require("./log");
7
+ const defaultResolveVideoAction = async ({ track, videoCodec, logLevel, container, }) => {
8
+ const canCopy = (0, can_copy_video_track_1.canCopyVideoTrack)({
9
+ inputCodec: track.codecWithoutConfig,
10
+ outputCodec: videoCodec,
11
+ container,
12
+ });
14
13
  if (canCopy) {
15
- return 'copy';
14
+ log_1.Log.verbose(logLevel, `Track ${track.trackId} (video): Can copy, therefore copying`);
15
+ return Promise.resolve({ type: 'copy' });
16
16
  }
17
+ const canReencode = await (0, can_reencode_video_track_1.canReencodeVideoTrack)({ videoCodec, track });
17
18
  if (canReencode) {
18
- return 'reencode';
19
+ log_1.Log.verbose(logLevel, `Track ${track.trackId} (video): Cannot copy, but re-enconde, therefore re-encoding`);
20
+ return Promise.resolve({ type: 'reencode', videoCodec });
19
21
  }
22
+ log_1.Log.verbose(logLevel, `Track ${track.trackId} (video): Can neither copy nor re-encode, therefore dropping`);
20
23
  // TODO: Make a fail option?
21
- return 'drop';
24
+ return Promise.resolve({ type: 'drop' });
22
25
  };
23
26
  exports.defaultResolveVideoAction = defaultResolveVideoAction;
24
- const resolveVideoAction = async ({ videoDecoderConfig, videoEncoderConfig, track, videoCodec, resolverFunction, }) => {
25
- const canReencode = Boolean(videoDecoderConfig && videoEncoderConfig);
26
- const canCopy = canCopyVideoTrack(track.codecWithoutConfig, videoCodec);
27
- const resolved = await resolverFunction({
28
- canReencode,
29
- canCopy,
30
- });
31
- return resolved;
32
- };
33
- exports.resolveVideoAction = resolveVideoAction;
@@ -1 +1,6 @@
1
- export declare const getVideoEncoderConfig: (config: VideoEncoderConfig) => Promise<VideoEncoderConfig | null>;
1
+ import type { ConvertMediaVideoCodec } from './codec-id';
2
+ export declare const getVideoEncoderConfig: ({ width, height, codec, }: {
3
+ width: number;
4
+ height: number;
5
+ codec: ConvertMediaVideoCodec;
6
+ }) => Promise<VideoEncoderConfig | null>;
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getVideoEncoderConfig = void 0;
4
- const getVideoEncoderConfig = async (config) => {
4
+ const getVideoEncoderConfig = async ({ width, height, codec, }) => {
5
5
  if (typeof VideoEncoder === 'undefined') {
6
6
  return null;
7
7
  }
8
+ const config = {
9
+ codec: codec === 'vp9' ? 'vp09.00.10.08' : codec,
10
+ height,
11
+ width,
12
+ };
8
13
  const hardware = {
9
14
  ...config,
10
15
  hardwareAcceleration: 'prefer-hardware',
@@ -1,6 +1,6 @@
1
1
  import type { LogLevel } from '@remotion/media-parser';
2
2
  export type WebCodecsVideoEncoder = {
3
- encodeFrame: (videoFrame: VideoFrame) => Promise<void>;
3
+ encodeFrame: (videoFrame: VideoFrame, timestamp: number) => Promise<void>;
4
4
  waitForFinish: () => Promise<void>;
5
5
  close: () => void;
6
6
  flush: () => Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/webcodecs",
3
- "version": "4.0.228",
3
+ "version": "4.0.229",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/esm/index.mjs",
@@ -15,15 +15,15 @@
15
15
  "dist"
16
16
  ],
17
17
  "author": "Jonny Burger <jonny@remotion.dev>",
18
- "license": "SEE LICENSE IN LICENSE.md",
18
+ "license": "Remotion License (See https://remotion.dev/docs/webcodecs#license)",
19
19
  "dependencies": {
20
- "@remotion/media-parser": "4.0.228"
20
+ "@remotion/media-parser": "4.0.229"
21
21
  },
22
22
  "peerDependencies": {},
23
23
  "devDependencies": {
24
24
  "@types/dom-webcodecs": "0.1.11",
25
25
  "eslint": "9.14.0",
26
- "@remotion/eslint-config-internal": "4.0.228"
26
+ "@remotion/eslint-config-internal": "4.0.229"
27
27
  },
28
28
  "keywords": [],
29
29
  "publishConfig": {