@remotion/webcodecs 4.0.305 → 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.
Files changed (55) hide show
  1. package/dist/audio-decoder.d.ts +15 -10
  2. package/dist/audio-decoder.js +49 -52
  3. package/dist/audio-encoder.d.ts +5 -5
  4. package/dist/audio-encoder.js +20 -42
  5. package/dist/can-copy-audio-track.d.ts +3 -1
  6. package/dist/can-copy-audio-track.js +10 -1
  7. package/dist/can-copy-video-track.d.ts +3 -1
  8. package/dist/can-copy-video-track.js +10 -1
  9. package/dist/convert-media.js +2 -2
  10. package/dist/copy-audio-track.d.ts +11 -0
  11. package/dist/copy-audio-track.js +31 -0
  12. package/dist/copy-video-track.d.ts +11 -0
  13. package/dist/copy-video-track.js +32 -0
  14. package/dist/create/event-emitter.d.ts +0 -1
  15. package/dist/create/matroska/matroska-utils.d.ts +1 -1
  16. package/dist/create/progress-tracker.d.ts +0 -2
  17. package/dist/create/progress-tracker.js +3 -20
  18. package/dist/create-audio-decoder.d.ts +24 -0
  19. package/dist/create-audio-decoder.js +112 -0
  20. package/dist/create-video-decoder.d.ts +23 -0
  21. package/dist/create-video-decoder.js +89 -0
  22. package/dist/esm/index.mjs +794 -631
  23. package/dist/get-wave-audio-decoder.d.ts +7 -2
  24. package/dist/get-wave-audio-decoder.js +27 -13
  25. package/dist/index.d.ts +4 -4
  26. package/dist/index.js +5 -5
  27. package/dist/io-manager/io-synchronizer.d.ts +5 -13
  28. package/dist/io-manager/io-synchronizer.js +29 -74
  29. package/dist/io-manager/make-timeout-promise.d.ts +1 -1
  30. package/dist/io-manager/make-timeout-promise.js +8 -4
  31. package/dist/is-different-video-codec.d.ts +11 -0
  32. package/dist/is-different-video-codec.js +36 -0
  33. package/dist/on-audio-track.d.ts +2 -2
  34. package/dist/on-audio-track.js +16 -150
  35. package/dist/on-frame.d.ts +2 -4
  36. package/dist/on-frame.js +8 -9
  37. package/dist/on-video-track.d.ts +2 -2
  38. package/dist/on-video-track.js +19 -129
  39. package/dist/processing-queue.d.ts +18 -0
  40. package/dist/processing-queue.js +47 -0
  41. package/dist/reencode-audio-track.d.ts +18 -0
  42. package/dist/reencode-audio-track.js +164 -0
  43. package/dist/reencode-video-track.d.ts +19 -0
  44. package/dist/reencode-video-track.js +151 -0
  45. package/dist/sort-video-frames.d.ts +4 -3
  46. package/dist/sort-video-frames.js +7 -3
  47. package/dist/video-decoder.d.ts +14 -8
  48. package/dist/video-decoder.js +37 -72
  49. package/dist/video-encoder.d.ts +6 -5
  50. package/dist/video-encoder.js +16 -40
  51. package/dist/wav-audio-encoder.d.ts +4 -1
  52. package/dist/wav-audio-encoder.js +3 -2
  53. package/package.json +5 -5
  54. package/dist/select-container-creator.d.ts +0 -2
  55. package/dist/select-container-creator.js +0 -19
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAudioDecoder = exports.internalCreateAudioDecoder = void 0;
4
+ const get_wave_audio_decoder_1 = require("./get-wave-audio-decoder");
5
+ const io_synchronizer_1 = require("./io-manager/io-synchronizer");
6
+ const internalCreateAudioDecoder = ({ onFrame, onError, controller, config, logLevel, }) => {
7
+ if (controller &&
8
+ controller._internals._mediaParserController._internals.signal.aborted) {
9
+ throw new Error('Not creating audio decoder, already aborted');
10
+ }
11
+ const ioSynchronizer = (0, io_synchronizer_1.makeIoSynchronizer)({
12
+ logLevel,
13
+ label: 'Audio decoder',
14
+ controller,
15
+ });
16
+ if (config.codec === 'pcm-s16') {
17
+ return (0, get_wave_audio_decoder_1.getWaveAudioDecoder)({
18
+ onFrame,
19
+ config,
20
+ sampleFormat: 's16',
21
+ logLevel,
22
+ ioSynchronizer,
23
+ onError,
24
+ });
25
+ }
26
+ const audioDecoder = new AudioDecoder({
27
+ async output(frame) {
28
+ try {
29
+ await onFrame(frame);
30
+ }
31
+ catch (err) {
32
+ frame.close();
33
+ onError(err);
34
+ }
35
+ ioSynchronizer.onOutput(frame.timestamp + (frame.duration ?? 0));
36
+ },
37
+ error(error) {
38
+ onError(error);
39
+ },
40
+ });
41
+ const close = () => {
42
+ if (controller) {
43
+ controller._internals._mediaParserController._internals.signal.removeEventListener('abort',
44
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
45
+ onAbort);
46
+ }
47
+ if (audioDecoder.state === 'closed') {
48
+ return;
49
+ }
50
+ audioDecoder.close();
51
+ };
52
+ const onAbort = () => {
53
+ close();
54
+ };
55
+ if (controller) {
56
+ controller._internals._mediaParserController._internals.signal.addEventListener('abort', onAbort);
57
+ }
58
+ audioDecoder.configure(config);
59
+ const decode = async (audioSample) => {
60
+ if (audioDecoder.state === 'closed') {
61
+ return;
62
+ }
63
+ try {
64
+ await controller?._internals._mediaParserController._internals.checkForAbortAndPause();
65
+ }
66
+ catch (err) {
67
+ onError(err);
68
+ return;
69
+ }
70
+ // Don't flush, it messes up the audio
71
+ const chunk = audioSample instanceof EncodedAudioChunk
72
+ ? audioSample
73
+ : new EncodedAudioChunk(audioSample);
74
+ audioDecoder.decode(chunk);
75
+ // https://test-streams.mux.dev/x36xhzz/url_0/url_525/193039199_mp4_h264_aac_hd_7.ts
76
+ // has a 16 byte audio sample at the end which chrome does not decode
77
+ // Might be empty audio
78
+ // For now only reporting chunks that are bigger than that
79
+ // 16 was chosen arbitrarily, can be improved
80
+ if (chunk.byteLength > 16) {
81
+ ioSynchronizer.inputItem(chunk.timestamp);
82
+ }
83
+ };
84
+ return {
85
+ decode,
86
+ close,
87
+ flush: async () => {
88
+ // Firefox might throw "Needs to be configured first"
89
+ try {
90
+ await audioDecoder.flush();
91
+ }
92
+ catch { }
93
+ await ioSynchronizer.waitForQueueSize(0);
94
+ },
95
+ waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize,
96
+ reset: () => {
97
+ audioDecoder.reset();
98
+ audioDecoder.configure(config);
99
+ },
100
+ };
101
+ };
102
+ exports.internalCreateAudioDecoder = internalCreateAudioDecoder;
103
+ const createAudioDecoder = ({ track, onFrame, onError, controller, logLevel, }) => {
104
+ return (0, exports.internalCreateAudioDecoder)({
105
+ onFrame,
106
+ onError,
107
+ controller: controller ?? null,
108
+ config: track,
109
+ logLevel: logLevel ?? 'error',
110
+ });
111
+ };
112
+ exports.createAudioDecoder = createAudioDecoder;
@@ -0,0 +1,23 @@
1
+ import type { MediaParserLogLevel } from '@remotion/media-parser';
2
+ import type { WebCodecsController } from './webcodecs-controller';
3
+ export type WebCodecsVideoDecoder = {
4
+ decode: (videoSample: EncodedVideoChunkInit | EncodedVideoChunk) => void;
5
+ close: () => void;
6
+ flush: () => Promise<void>;
7
+ waitForQueueToBeLessThan: (items: number) => Promise<void>;
8
+ reset: () => void;
9
+ };
10
+ export declare const internalCreateVideoDecoder: ({ onFrame, onError, controller, config, logLevel, }: {
11
+ onFrame: (frame: VideoFrame) => Promise<void> | void;
12
+ onError: (error: Error) => void;
13
+ controller: WebCodecsController | null;
14
+ config: VideoDecoderConfig;
15
+ logLevel: MediaParserLogLevel;
16
+ }) => WebCodecsVideoDecoder;
17
+ export declare const createVideoDecoder: ({ onFrame, onError, controller, track, logLevel, }: {
18
+ track: VideoDecoderConfig;
19
+ onFrame: (frame: VideoFrame) => Promise<void> | void;
20
+ onError: (error: Error) => void;
21
+ controller?: WebCodecsController;
22
+ logLevel?: MediaParserLogLevel;
23
+ }) => WebCodecsVideoDecoder;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createVideoDecoder = exports.internalCreateVideoDecoder = void 0;
4
+ const io_synchronizer_1 = require("./io-manager/io-synchronizer");
5
+ const internalCreateVideoDecoder = ({ onFrame, onError, controller, config, logLevel, }) => {
6
+ const ioSynchronizer = (0, io_synchronizer_1.makeIoSynchronizer)({
7
+ logLevel,
8
+ label: 'Video decoder',
9
+ controller,
10
+ });
11
+ const videoDecoder = new VideoDecoder({
12
+ async output(frame) {
13
+ try {
14
+ await onFrame(frame);
15
+ }
16
+ catch (err) {
17
+ onError(err);
18
+ frame.close();
19
+ }
20
+ ioSynchronizer.onOutput(frame.timestamp);
21
+ },
22
+ error(error) {
23
+ onError(error);
24
+ },
25
+ });
26
+ const close = () => {
27
+ if (controller) {
28
+ controller._internals._mediaParserController._internals.signal.removeEventListener('abort',
29
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
30
+ onAbort);
31
+ }
32
+ if (videoDecoder.state === 'closed') {
33
+ return;
34
+ }
35
+ videoDecoder.close();
36
+ };
37
+ const onAbort = () => {
38
+ close();
39
+ };
40
+ if (controller) {
41
+ controller._internals._mediaParserController._internals.signal.addEventListener('abort', onAbort);
42
+ }
43
+ videoDecoder.configure(config);
44
+ const decode = async (sample) => {
45
+ if (videoDecoder.state === 'closed') {
46
+ return;
47
+ }
48
+ try {
49
+ await controller?._internals._mediaParserController._internals.checkForAbortAndPause();
50
+ }
51
+ catch (err) {
52
+ onError(err);
53
+ return;
54
+ }
55
+ const encodedChunk = sample instanceof EncodedVideoChunk
56
+ ? sample
57
+ : new EncodedVideoChunk(sample);
58
+ videoDecoder.decode(encodedChunk);
59
+ ioSynchronizer.inputItem(sample.timestamp);
60
+ };
61
+ return {
62
+ decode,
63
+ close,
64
+ flush: async () => {
65
+ // Firefox might throw "Needs to be configured first"
66
+ try {
67
+ await videoDecoder.flush();
68
+ }
69
+ catch { }
70
+ await ioSynchronizer.waitForQueueSize(0);
71
+ },
72
+ waitForQueueToBeLessThan: ioSynchronizer.waitForQueueSize,
73
+ reset: () => {
74
+ videoDecoder.reset();
75
+ videoDecoder.configure(config);
76
+ },
77
+ };
78
+ };
79
+ exports.internalCreateVideoDecoder = internalCreateVideoDecoder;
80
+ const createVideoDecoder = ({ onFrame, onError, controller, track, logLevel, }) => {
81
+ return (0, exports.internalCreateVideoDecoder)({
82
+ onFrame,
83
+ onError,
84
+ controller: controller ?? null,
85
+ config: track,
86
+ logLevel: logLevel ?? 'info',
87
+ });
88
+ };
89
+ exports.createVideoDecoder = createVideoDecoder;