@remotion/webcodecs 4.0.251 → 4.0.253

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 (68) hide show
  1. package/dist/audio-decoder.d.ts +3 -2
  2. package/dist/audio-decoder.js +11 -9
  3. package/dist/audio-encoder.d.ts +4 -3
  4. package/dist/audio-encoder.js +10 -9
  5. package/dist/auto-select-writer.d.ts +1 -1
  6. package/dist/can-copy-video-track.js +2 -1
  7. package/dist/choose-correct-hevc-profile.d.ts +5 -0
  8. package/dist/choose-correct-hevc-profile.js +42 -0
  9. package/dist/controller.d.ts +16 -0
  10. package/dist/controller.js +16 -0
  11. package/dist/convert-media.d.ts +6 -6
  12. package/dist/convert-media.js +53 -21
  13. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +11 -0
  14. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.js +29 -11
  15. package/dist/create/iso-base-media/codec-specific/hvc1.d.ts +2 -0
  16. package/dist/create/iso-base-media/codec-specific/hvc1.js +48 -0
  17. package/dist/create/iso-base-media/create-iso-base-media.js +8 -4
  18. package/dist/create/iso-base-media/serialize-track.js +3 -1
  19. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-hvcc.d.ts +1 -0
  20. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-hvcc.js +16 -0
  21. package/dist/create/matroska/cluster.d.ts +1 -1
  22. package/dist/create/matroska/create-matroska-media.js +8 -4
  23. package/dist/create/matroska/matroska-trackentry.js +3 -0
  24. package/dist/create/matroska/matroska-utils.d.ts +1 -1
  25. package/dist/create/media-fn.d.ts +2 -3
  26. package/dist/create/wav/create-wav.js +8 -4
  27. package/dist/emitter.d.ts +20 -0
  28. package/dist/emitter.js +29 -0
  29. package/dist/esm/buffer.mjs +5 -22
  30. package/dist/esm/index.mjs +633 -159
  31. package/dist/esm/web-fs.mjs +4 -22
  32. package/dist/get-available-containers.d.ts +1 -2
  33. package/dist/get-available-containers.js +3 -3
  34. package/dist/get-available-video-codecs.d.ts +1 -2
  35. package/dist/get-available-video-codecs.js +3 -4
  36. package/dist/get-codec-string.d.ts +7 -0
  37. package/dist/get-codec-string.js +21 -0
  38. package/dist/hevc-levels.d.ts +13 -0
  39. package/dist/hevc-levels.js +233 -0
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.js +3 -1
  42. package/dist/io-manager/io-synchronizer.d.ts +4 -3
  43. package/dist/io-manager/io-synchronizer.js +19 -14
  44. package/dist/io-manager/make-timeout-promise.d.ts +6 -1
  45. package/dist/io-manager/make-timeout-promise.js +23 -5
  46. package/dist/on-audio-track.d.ts +2 -2
  47. package/dist/on-audio-track.js +13 -16
  48. package/dist/on-video-track.d.ts +2 -2
  49. package/dist/on-video-track.js +10 -14
  50. package/dist/select-container-creator.d.ts +1 -1
  51. package/dist/test/remux-serverside.test.js +2 -2
  52. package/dist/throttled-state-update.d.ts +1 -1
  53. package/dist/throttled-state-update.js +2 -2
  54. package/dist/video-decoder.d.ts +3 -2
  55. package/dist/video-decoder.js +10 -8
  56. package/dist/video-encoder-config.js +4 -6
  57. package/dist/video-encoder.d.ts +4 -3
  58. package/dist/video-encoder.js +13 -8
  59. package/dist/wav-audio-encoder.d.ts +1 -1
  60. package/dist/wav-audio-encoder.js +2 -2
  61. package/dist/webcodecs-controller.d.ts +16 -0
  62. package/dist/webcodecs-controller.js +16 -0
  63. package/dist/writers/buffer-implementation/writer.d.ts +1 -1
  64. package/dist/writers/buffer-implementation/writer.js +5 -4
  65. package/dist/writers/buffer.d.ts +1 -1
  66. package/dist/writers/web-fs.d.ts +1 -1
  67. package/dist/writers/web-fs.js +4 -4
  68. package/package.json +5 -5
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createHvccBox = void 0;
4
+ const matroska_utils_1 = require("../../../../../../matroska/matroska-utils");
5
+ const primitives_1 = require("../../../../../primitives");
6
+ const createHvccBox = (privateData) => {
7
+ if (!privateData) {
8
+ throw new Error('privateData is required');
9
+ }
10
+ return (0, primitives_1.addSize)((0, matroska_utils_1.combineUint8Arrays)([
11
+ // type
12
+ (0, primitives_1.stringsToUint8Array)('hvcC'),
13
+ privateData,
14
+ ]));
15
+ };
16
+ exports.createHvccBox = createHvccBox;
@@ -1,6 +1,6 @@
1
+ import type { Writer } from '@remotion/media-parser';
1
2
  import { type AudioOrVideoSample } from '@remotion/media-parser';
2
3
  import type { LogLevel } from '../../log';
3
- import type { Writer } from '../../writers/writer';
4
4
  export declare const timestampToClusterTimestamp: (timestamp: number, timescale: number) => number;
5
5
  export declare const canFitInCluster: ({ clusterStartTimestamp, chunk, timescale, }: {
6
6
  clusterStartTimestamp: number;
@@ -16,7 +16,11 @@ const timescale = 1000000;
16
16
  const createMatroskaMedia = async ({ writer, onBytesProgress, onMillisecondsProgress, filename, logLevel, progressTracker, }) => {
17
17
  var _a, _b, _c, _d, _e, _f, _g;
18
18
  const header = (0, matroska_header_1.makeMatroskaHeader)();
19
- const w = await writer.createContent({ filename, mimeType: 'video/webm' });
19
+ const w = await writer.createContent({
20
+ filename,
21
+ mimeType: 'video/webm',
22
+ logLevel,
23
+ });
20
24
  await w.write(header.bytes);
21
25
  const matroskaInfo = (0, matroska_info_1.makeMatroskaInfo)({
22
26
  timescale,
@@ -149,8 +153,8 @@ const createMatroskaMedia = async ({ writer, onBytesProgress, onMillisecondsProg
149
153
  }
150
154
  });
151
155
  },
152
- save: () => {
153
- return w.save();
156
+ getBlob: async () => {
157
+ return w.getBlob();
154
158
  },
155
159
  remove: async () => {
156
160
  await w.remove();
@@ -177,12 +181,12 @@ const createMatroskaMedia = async ({ writer, onBytesProgress, onMillisecondsProg
177
181
  });
178
182
  await updateSeekWrite();
179
183
  await w.write((0, matroska_cues_1.createMatroskaCues)(cues).bytes);
180
- await w.waitForFinish();
181
184
  const segmentSize = w.getWrittenByteCount() -
182
185
  segmentOffset -
183
186
  (0, matroska_utils_1.matroskaToHex)(matroskaElements.Segment).byteLength -
184
187
  matroska_segment_1.MATROSKA_SEGMENT_MIN_VINT_WIDTH;
185
188
  await updateSegmentSize(segmentSize);
189
+ await w.finish();
186
190
  },
187
191
  };
188
192
  };
@@ -67,6 +67,9 @@ const makeAudioCodecId = (codecId) => {
67
67
  if (codecId === 'aac') {
68
68
  return 'A_AAC';
69
69
  }
70
+ if (codecId === 'ac3') {
71
+ return 'A_AC3';
72
+ }
70
73
  if (codecId === 'mp3') {
71
74
  return 'A_MPEG/L3';
72
75
  }
@@ -19,7 +19,7 @@ export type EbmlParsedOrUint8Array<T extends Ebml> = {
19
19
  value: EbmlValueOrUint8Array<T>;
20
20
  minVintWidth: number | null;
21
21
  };
22
- export declare const measureEBMLVarInt: (value: number) => 2 | 1 | 4 | 3 | 5 | 6;
22
+ export declare const measureEBMLVarInt: (value: number) => 2 | 1 | 6 | 5 | 3 | 4;
23
23
  export declare const getVariableInt: (value: number, minWidth: number | null) => Uint8Array;
24
24
  export declare const makeMatroskaBytes: (fields: PossibleEbmlOrUint8Array) => BytesAndOffset;
25
25
  export type PossibleEbmlOrUint8Array = Prettify<{
@@ -1,10 +1,9 @@
1
- import type { AudioOrVideoSample } from '@remotion/media-parser';
1
+ import type { AudioOrVideoSample, WriterInterface } from '@remotion/media-parser';
2
2
  import type { LogLevel } from '../log';
3
- import type { WriterInterface } from '../writers/writer';
4
3
  import type { MakeTrackAudio, MakeTrackVideo } from './make-track-info';
5
4
  import type { ProgressTracker } from './progress-tracker';
6
5
  export type MediaFn = {
7
- save: () => Promise<Blob>;
6
+ getBlob: () => Promise<Blob>;
8
7
  remove: () => Promise<void>;
9
8
  addSample: (options: {
10
9
  chunk: AudioOrVideoSample;
@@ -16,7 +16,11 @@ const numberTo16BitLittleEndian = (num) => {
16
16
  const BIT_DEPTH = 16;
17
17
  const BYTES_PER_SAMPLE = BIT_DEPTH / 8;
18
18
  const createWav = async ({ filename, logLevel, onBytesProgress, onMillisecondsProgress, writer, progressTracker, }) => {
19
- const w = await writer.createContent({ filename, mimeType: 'audio/wav' });
19
+ const w = await writer.createContent({
20
+ filename,
21
+ mimeType: 'audio/wav',
22
+ logLevel,
23
+ });
20
24
  await w.write(new Uint8Array([0x52, 0x49, 0x46, 0x46])); // "RIFF"
21
25
  const sizePosition = w.getWrittenByteCount();
22
26
  await w.write(new Uint8Array([0x00, 0x00, 0x00, 0x00])); // Remaining size
@@ -64,8 +68,8 @@ const createWav = async ({ filename, logLevel, onBytesProgress, onMillisecondsPr
64
68
  };
65
69
  const waitForFinishPromises = [];
66
70
  return {
67
- save: () => {
68
- return w.save();
71
+ getBlob: () => {
72
+ return w.getBlob();
69
73
  },
70
74
  remove: () => {
71
75
  return w.remove();
@@ -89,7 +93,7 @@ const createWav = async ({ filename, logLevel, onBytesProgress, onMillisecondsPr
89
93
  await Promise.all(waitForFinishPromises.map((p) => p()));
90
94
  await operationProm.current;
91
95
  await updateSize();
92
- await w.waitForFinish();
96
+ await w.finish();
93
97
  },
94
98
  addTrack: async (track) => {
95
99
  if (track.type !== 'audio') {
@@ -0,0 +1,20 @@
1
+ type MediaParserEventMap = {
2
+ pause: undefined;
3
+ resume: undefined;
4
+ };
5
+ export type MediaParserEventTypes = keyof MediaParserEventMap;
6
+ export type CallbackListener<T extends MediaParserEventTypes> = (data: {
7
+ detail: MediaParserEventMap[T];
8
+ }) => void;
9
+ type MediaParserListeners = {
10
+ [EventType in MediaParserEventTypes]: CallbackListener<EventType>[];
11
+ };
12
+ export declare class MediaParserEmitter {
13
+ listeners: MediaParserListeners;
14
+ addEventListener<Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>): void;
15
+ removeEventListener<Q extends MediaParserEventTypes>(name: Q, callback: CallbackListener<Q>): void;
16
+ private dispatchEvent;
17
+ dispatchPause: () => void;
18
+ dispatchResume: () => void;
19
+ }
20
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaParserEmitter = void 0;
4
+ class MediaParserEmitter {
5
+ constructor() {
6
+ this.listeners = {
7
+ pause: [],
8
+ resume: [],
9
+ };
10
+ this.dispatchPause = () => {
11
+ this.dispatchEvent('pause', undefined);
12
+ };
13
+ this.dispatchResume = () => {
14
+ this.dispatchEvent('resume', undefined);
15
+ };
16
+ }
17
+ addEventListener(name, callback) {
18
+ this.listeners[name].push(callback);
19
+ }
20
+ removeEventListener(name, callback) {
21
+ this.listeners[name] = this.listeners[name].filter((l) => l !== callback);
22
+ }
23
+ dispatchEvent(dispatchName, context) {
24
+ this.listeners[dispatchName].forEach((callback) => {
25
+ callback({ detail: context });
26
+ });
27
+ }
28
+ }
29
+ exports.MediaParserEmitter = MediaParserEmitter;
@@ -1,21 +1,3 @@
1
- var __create = Object.create;
2
- var __getProtoOf = Object.getPrototypeOf;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __toESM = (mod, isNodeMode, target) => {
7
- target = mod != null ? __create(__getProtoOf(mod)) : {};
8
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
- for (let key of __getOwnPropNames(mod))
10
- if (!__hasOwnProp.call(to, key))
11
- __defProp(to, key, {
12
- get: () => mod[key],
13
- enumerable: true
14
- });
15
- return to;
16
- };
17
- var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
18
-
19
1
  // src/writers/buffer-implementation/writer.ts
20
2
  var createContent = ({ filename, mimeType }) => {
21
3
  const buf = new ArrayBuffer(0, {
@@ -42,10 +24,14 @@ var createContent = ({ filename, mimeType }) => {
42
24
  writPromise = writPromise.then(() => write(arr));
43
25
  return writPromise;
44
26
  },
45
- save: () => {
27
+ finish: async () => {
28
+ await writPromise;
46
29
  if (removed) {
47
30
  return Promise.reject(new Error("Already called .remove() on the result"));
48
31
  }
32
+ return Promise.resolve();
33
+ },
34
+ getBlob() {
49
35
  const arr = new Uint8Array(buf);
50
36
  return Promise.resolve(new File([arr.slice()], filename, { type: mimeType }));
51
37
  },
@@ -57,9 +43,6 @@ var createContent = ({ filename, mimeType }) => {
57
43
  updateDataAt: (position, newData) => {
58
44
  writPromise = writPromise.then(() => updateDataAt(position, newData));
59
45
  return writPromise;
60
- },
61
- waitForFinish: async () => {
62
- await writPromise;
63
46
  }
64
47
  };
65
48
  return Promise.resolve(writer);