@remotion/webcodecs 4.0.250 → 4.0.252

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 (54) hide show
  1. package/dist/auto-select-writer.d.ts +1 -1
  2. package/dist/can-copy-audio-track.d.ts +2 -2
  3. package/dist/can-copy-video-track.d.ts +2 -2
  4. package/dist/can-copy-video-track.js +2 -1
  5. package/dist/choose-correct-hevc-profile.d.ts +5 -0
  6. package/dist/choose-correct-hevc-profile.js +42 -0
  7. package/dist/convert-media.d.ts +6 -5
  8. package/dist/convert-media.js +7 -5
  9. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.d.ts +11 -0
  10. package/dist/create/iso-base-media/codec-specific/create-codec-specific-data.js +29 -11
  11. package/dist/create/iso-base-media/codec-specific/hvc1.d.ts +2 -0
  12. package/dist/create/iso-base-media/codec-specific/hvc1.js +48 -0
  13. package/dist/create/iso-base-media/create-iso-base-media.js +8 -4
  14. package/dist/create/iso-base-media/serialize-track.js +3 -1
  15. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-hvcc.d.ts +1 -0
  16. package/dist/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-hvcc.js +16 -0
  17. package/dist/create/matroska/cluster.d.ts +1 -1
  18. package/dist/create/matroska/create-matroska-media.js +8 -4
  19. package/dist/create/matroska/matroska-trackentry.js +6 -0
  20. package/dist/create/media-fn.d.ts +2 -3
  21. package/dist/create/wav/create-wav.js +8 -4
  22. package/dist/esm/buffer.mjs +5 -22
  23. package/dist/esm/index.mjs +435 -65
  24. package/dist/esm/web-fs.mjs +10 -25
  25. package/dist/get-available-containers.d.ts +1 -2
  26. package/dist/get-available-containers.js +3 -3
  27. package/dist/get-available-video-codecs.d.ts +1 -2
  28. package/dist/get-available-video-codecs.js +3 -4
  29. package/dist/get-codec-string.d.ts +7 -0
  30. package/dist/get-codec-string.js +21 -0
  31. package/dist/hevc-levels.d.ts +13 -0
  32. package/dist/hevc-levels.js +233 -0
  33. package/dist/index.d.ts +0 -1
  34. package/dist/on-audio-track-handler.d.ts +2 -2
  35. package/dist/on-audio-track.js +1 -0
  36. package/dist/on-video-track-handler.d.ts +2 -2
  37. package/dist/test/create-matroska.test.js +13 -13
  38. package/dist/test/remux-serverside.test.js +6 -2
  39. package/dist/test/stsd.test.js +2 -4
  40. package/dist/video-encoder-config.js +4 -6
  41. package/dist/video-encoder.js +4 -0
  42. package/dist/writers/buffer-implementation/writer.d.ts +1 -1
  43. package/dist/writers/buffer-implementation/writer.js +5 -4
  44. package/dist/writers/buffer.d.ts +1 -1
  45. package/dist/writers/web-fs.d.ts +1 -1
  46. package/dist/writers/web-fs.js +10 -7
  47. package/package.json +5 -5
  48. package/dist/esm/node-writer.mjs +0 -92
  49. package/dist/test/remux-serverside.d.ts +0 -1
  50. package/dist/test/remux-serverside.js +0 -12
  51. package/dist/writers/fs.d.ts +0 -4
  52. package/dist/writers/fs.js +0 -78
  53. package/dist/writers/node-writer.d.ts +0 -4
  54. package/dist/writers/node-writer.js +0 -77
@@ -97,9 +97,12 @@ var createContent = async ({ filename }) => {
97
97
  const directoryHandle = await navigator.storage.getDirectory();
98
98
  const actualFilename = `__remotion_mediaparser:${filename}`;
99
99
  const remove = async () => {
100
- await directoryHandle.removeEntry(actualFilename, {
101
- recursive: true
102
- });
100
+ try {
101
+ await directoryHandle.removeEntry(actualFilename, {
102
+ recursive: true
103
+ });
104
+ } catch {
105
+ }
103
106
  };
104
107
  await remove();
105
108
  const fileHandle = await directoryHandle.getFileHandle(actualFilename, {
@@ -122,11 +125,14 @@ var createContent = async ({ filename }) => {
122
125
  writPromise = writPromise.then(() => write(arr));
123
126
  return writPromise;
124
127
  },
125
- save: async () => {
128
+ finish: async () => {
129
+ await writPromise;
126
130
  try {
127
131
  await writable.close();
128
132
  } catch {
129
133
  }
134
+ },
135
+ async getBlob() {
130
136
  const newHandle = await directoryHandle.getFileHandle(actualFilename, {
131
137
  create: true
132
138
  });
@@ -138,9 +144,6 @@ var createContent = async ({ filename }) => {
138
144
  writPromise = writPromise.then(() => updateDataAt(position, data));
139
145
  return writPromise;
140
146
  },
141
- waitForFinish: async () => {
142
- await writPromise;
143
- },
144
147
  remove
145
148
  };
146
149
  return writer;
@@ -189,10 +192,14 @@ var createContent2 = ({ filename, mimeType }) => {
189
192
  writPromise = writPromise.then(() => write(arr));
190
193
  return writPromise;
191
194
  },
192
- save: () => {
195
+ finish: async () => {
196
+ await writPromise;
193
197
  if (removed) {
194
198
  return Promise.reject(new Error("Already called .remove() on the result"));
195
199
  }
200
+ return Promise.resolve();
201
+ },
202
+ getBlob() {
196
203
  const arr = new Uint8Array(buf);
197
204
  return Promise.resolve(new File([arr.slice()], filename, { type: mimeType }));
198
205
  },
@@ -204,9 +211,6 @@ var createContent2 = ({ filename, mimeType }) => {
204
211
  updateDataAt: (position, newData) => {
205
212
  writPromise = writPromise.then(() => updateDataAt(position, newData));
206
213
  return writPromise;
207
- },
208
- waitForFinish: async () => {
209
- await writPromise;
210
214
  }
211
215
  };
212
216
  return Promise.resolve(writer);
@@ -909,7 +913,7 @@ var canCopyVideoTrack = ({
909
913
  return inputTrack.codecWithoutConfig === "vp8" || inputTrack.codecWithoutConfig === "vp9";
910
914
  }
911
915
  if (outputContainer === "mp4") {
912
- return inputTrack.codecWithoutConfig === "h264" && (inputContainer === "mp4" || inputContainer === "avi");
916
+ return (inputTrack.codecWithoutConfig === "h264" || inputTrack.codecWithoutConfig === "h265") && (inputContainer === "mp4" || inputContainer === "avi");
913
917
  }
914
918
  if (outputContainer === "wav") {
915
919
  return false;
@@ -1046,6 +1050,284 @@ var chooseCorrectAvc1Profile = ({
1046
1050
  return `avc1.6400${profile.hex}`;
1047
1051
  };
1048
1052
 
1053
+ // src/hevc-levels.ts
1054
+ var hevcLevels = [
1055
+ {
1056
+ level: "3.1",
1057
+ maxBitrateMainTier: 1e4,
1058
+ maxBitrateHighTier: null,
1059
+ maxResolutionsAndFrameRates: [
1060
+ {
1061
+ width: 720,
1062
+ height: 480,
1063
+ fps: 84.3
1064
+ },
1065
+ {
1066
+ width: 720,
1067
+ height: 576,
1068
+ fps: 75
1069
+ },
1070
+ {
1071
+ width: 960,
1072
+ height: 540,
1073
+ fps: 60
1074
+ },
1075
+ {
1076
+ width: 1280,
1077
+ height: 720,
1078
+ fps: 33.7
1079
+ }
1080
+ ]
1081
+ },
1082
+ {
1083
+ level: "4",
1084
+ maxBitrateMainTier: 12000,
1085
+ maxBitrateHighTier: 30000,
1086
+ maxResolutionsAndFrameRates: [
1087
+ {
1088
+ width: 1280,
1089
+ height: 720,
1090
+ fps: 68
1091
+ },
1092
+ {
1093
+ width: 1920,
1094
+ height: 1080,
1095
+ fps: 32
1096
+ },
1097
+ {
1098
+ width: 2048,
1099
+ height: 1080,
1100
+ fps: 30
1101
+ }
1102
+ ]
1103
+ },
1104
+ {
1105
+ level: "4.1",
1106
+ maxBitrateMainTier: 20000,
1107
+ maxBitrateHighTier: 50000,
1108
+ maxResolutionsAndFrameRates: [
1109
+ {
1110
+ width: 1280,
1111
+ height: 720,
1112
+ fps: 136
1113
+ },
1114
+ {
1115
+ width: 1920,
1116
+ height: 1080,
1117
+ fps: 64
1118
+ },
1119
+ {
1120
+ width: 2048,
1121
+ height: 1080,
1122
+ fps: 60
1123
+ }
1124
+ ]
1125
+ },
1126
+ {
1127
+ level: "5",
1128
+ maxBitrateMainTier: 25000,
1129
+ maxBitrateHighTier: 1e5,
1130
+ maxResolutionsAndFrameRates: [
1131
+ {
1132
+ width: 1920,
1133
+ height: 1080,
1134
+ fps: 128
1135
+ },
1136
+ {
1137
+ width: 2048,
1138
+ height: 1080,
1139
+ fps: 120
1140
+ },
1141
+ {
1142
+ width: 3840,
1143
+ height: 2160,
1144
+ fps: 32
1145
+ },
1146
+ {
1147
+ width: 4096,
1148
+ height: 2160,
1149
+ fps: 30
1150
+ }
1151
+ ]
1152
+ },
1153
+ {
1154
+ level: "5.1",
1155
+ maxBitrateMainTier: 40000,
1156
+ maxBitrateHighTier: 160000,
1157
+ maxResolutionsAndFrameRates: [
1158
+ {
1159
+ width: 1920,
1160
+ height: 1080,
1161
+ fps: 256
1162
+ },
1163
+ {
1164
+ width: 2048,
1165
+ height: 1080,
1166
+ fps: 240
1167
+ },
1168
+ {
1169
+ width: 3840,
1170
+ height: 2160,
1171
+ fps: 64
1172
+ },
1173
+ {
1174
+ width: 4096,
1175
+ height: 2160,
1176
+ fps: 60
1177
+ }
1178
+ ]
1179
+ },
1180
+ {
1181
+ level: "5.2",
1182
+ maxBitrateMainTier: 60000,
1183
+ maxBitrateHighTier: 240000,
1184
+ maxResolutionsAndFrameRates: [
1185
+ {
1186
+ width: 2048,
1187
+ height: 1080,
1188
+ fps: 300
1189
+ },
1190
+ {
1191
+ width: 3840,
1192
+ height: 2160,
1193
+ fps: 128
1194
+ },
1195
+ {
1196
+ width: 4096,
1197
+ height: 2160,
1198
+ fps: 120
1199
+ }
1200
+ ]
1201
+ },
1202
+ {
1203
+ level: "6",
1204
+ maxBitrateMainTier: 60000,
1205
+ maxBitrateHighTier: 240000,
1206
+ maxResolutionsAndFrameRates: [
1207
+ {
1208
+ width: 3840,
1209
+ height: 2160,
1210
+ fps: 128
1211
+ },
1212
+ {
1213
+ width: 4096,
1214
+ height: 2160,
1215
+ fps: 120
1216
+ },
1217
+ {
1218
+ width: 7680,
1219
+ height: 4320,
1220
+ fps: 32
1221
+ },
1222
+ {
1223
+ width: 8192,
1224
+ height: 4320,
1225
+ fps: 30
1226
+ }
1227
+ ]
1228
+ },
1229
+ {
1230
+ level: "6.1",
1231
+ maxBitrateMainTier: 120000,
1232
+ maxBitrateHighTier: 480000,
1233
+ maxResolutionsAndFrameRates: [
1234
+ {
1235
+ width: 3840,
1236
+ height: 2160,
1237
+ fps: 256
1238
+ },
1239
+ {
1240
+ width: 4096,
1241
+ height: 2160,
1242
+ fps: 240
1243
+ },
1244
+ {
1245
+ width: 7680,
1246
+ height: 4320,
1247
+ fps: 64
1248
+ },
1249
+ {
1250
+ width: 8192,
1251
+ height: 4320,
1252
+ fps: 60
1253
+ }
1254
+ ]
1255
+ },
1256
+ {
1257
+ level: "6.2",
1258
+ maxBitrateMainTier: 240000,
1259
+ maxBitrateHighTier: 800000,
1260
+ maxResolutionsAndFrameRates: [
1261
+ {
1262
+ width: 3840,
1263
+ height: 2160,
1264
+ fps: 512
1265
+ },
1266
+ {
1267
+ width: 4096,
1268
+ height: 2160,
1269
+ fps: 480
1270
+ },
1271
+ {
1272
+ width: 7680,
1273
+ height: 4320,
1274
+ fps: 128
1275
+ },
1276
+ {
1277
+ width: 8192,
1278
+ height: 4320,
1279
+ fps: 120
1280
+ }
1281
+ ]
1282
+ }
1283
+ ];
1284
+
1285
+ // src/choose-correct-hevc-profile.ts
1286
+ var chooseCorrectHevcProfile = ({
1287
+ width,
1288
+ height,
1289
+ fps
1290
+ }) => {
1291
+ const profile = hevcLevels.find((p) => {
1292
+ return p.maxResolutionsAndFrameRates.some((max) => {
1293
+ if (width > max.width) {
1294
+ return false;
1295
+ }
1296
+ if (height > max.height) {
1297
+ return false;
1298
+ }
1299
+ const fallbackFps = fps ?? 60;
1300
+ return fallbackFps <= max.fps;
1301
+ });
1302
+ });
1303
+ if (!profile) {
1304
+ throw new Error(`No suitable HEVC profile found for ${width}x${height}@${fps}fps`);
1305
+ }
1306
+ return `hvc1.${1}.${0}.${"L"}${Math.round(Number(profile.level) * 30)}.${"b0"}`;
1307
+ };
1308
+
1309
+ // src/get-codec-string.ts
1310
+ var getCodecStringForEncoder = ({
1311
+ codec,
1312
+ fps,
1313
+ height,
1314
+ width
1315
+ }) => {
1316
+ if (codec === "h264") {
1317
+ return chooseCorrectAvc1Profile({ fps, height, width });
1318
+ }
1319
+ if (codec === "h265") {
1320
+ return chooseCorrectHevcProfile({ fps, height, width });
1321
+ }
1322
+ if (codec === "vp8") {
1323
+ return "vp8";
1324
+ }
1325
+ if (codec === "vp9") {
1326
+ return "vp09.00.10.08";
1327
+ }
1328
+ throw new Error(`Unknown codec: ${codec}`);
1329
+ };
1330
+
1049
1331
  // src/video-encoder-config.ts
1050
1332
  var getVideoEncoderConfig = async ({
1051
1333
  codec,
@@ -1057,10 +1339,12 @@ var getVideoEncoderConfig = async ({
1057
1339
  return null;
1058
1340
  }
1059
1341
  const config = {
1060
- codec: codec === "h264" ? chooseCorrectAvc1Profile({ fps, height, width }) : codec === "vp9" ? "vp09.00.10.08" : codec,
1342
+ codec: getCodecStringForEncoder({ codec, fps, height, width }),
1061
1343
  height,
1062
1344
  width,
1063
- bitrate: isSafari() ? 3000000 : undefined
1345
+ bitrate: isSafari() ? 3000000 : undefined,
1346
+ bitrateMode: codec === "vp9" && !isSafari() ? "quantizer" : undefined,
1347
+ framerate: fps ?? undefined
1064
1348
  };
1065
1349
  const hardware = {
1066
1350
  ...config,
@@ -1219,6 +1503,29 @@ var generateOutputFilename = (source, container) => {
1219
1503
  return `${withoutExtension}.${container}`;
1220
1504
  };
1221
1505
 
1506
+ // src/get-available-containers.ts
1507
+ var availableContainers = ["webm", "mp4", "wav"];
1508
+ var getAvailableContainers = () => {
1509
+ return availableContainers;
1510
+ };
1511
+
1512
+ // src/get-available-video-codecs.ts
1513
+ var availableVideoCodecs = ["vp8", "vp9", "h264", "h265"];
1514
+ var getAvailableVideoCodecs = ({
1515
+ container
1516
+ }) => {
1517
+ if (container === "mp4") {
1518
+ return ["h264", "h265"];
1519
+ }
1520
+ if (container === "webm") {
1521
+ return ["vp8", "vp9"];
1522
+ }
1523
+ if (container === "wav") {
1524
+ return [];
1525
+ }
1526
+ throw new Error(`Unsupported container: ${container}`);
1527
+ };
1528
+
1222
1529
  // src/on-audio-track.ts
1223
1530
  import {
1224
1531
  MediaParserInternals as MediaParserInternals3
@@ -1372,7 +1679,8 @@ var makeAudioTrackHandler = ({
1372
1679
  const codecPrivate = audioOperation.audioCodec === "aac" ? MediaParserInternals3.createAacCodecPrivate({
1373
1680
  audioObjectType: 2,
1374
1681
  sampleRate: track.sampleRate,
1375
- channelConfiguration: track.numberOfChannels
1682
+ channelConfiguration: track.numberOfChannels,
1683
+ codecPrivate: null
1376
1684
  }) : null;
1377
1685
  const { trackNumber } = await state.addTrack({
1378
1686
  type: "audio",
@@ -1767,7 +2075,10 @@ var createVideoEncoder = ({
1767
2075
  }
1768
2076
  const keyFrame = framesProcessed % 40 === 0;
1769
2077
  encoder.encode(convertToCorrectVideoFrame({ videoFrame: frame, outputCodec }), {
1770
- keyFrame
2078
+ keyFrame,
2079
+ vp9: {
2080
+ quantizer: 36
2081
+ }
1771
2082
  });
1772
2083
  ioSynchronizer.inputItem(frame.timestamp, keyFrame);
1773
2084
  framesProcessed++;
@@ -2476,6 +2787,17 @@ var createAvccBox = (privateData) => {
2476
2787
  ]));
2477
2788
  };
2478
2789
 
2790
+ // src/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-hvcc.ts
2791
+ var createHvccBox = (privateData) => {
2792
+ if (!privateData) {
2793
+ throw new Error("privateData is required");
2794
+ }
2795
+ return addSize(combineUint8Arrays([
2796
+ stringsToUint8Array("hvcC"),
2797
+ privateData
2798
+ ]));
2799
+ };
2800
+
2479
2801
  // src/create/iso-base-media/trak/mdia/minf/stbl/stsd/create-pasp.ts
2480
2802
  var createPasp = (x, y) => {
2481
2803
  return addSize(combineUint8Arrays([
@@ -2519,6 +2841,40 @@ var createAvc1Data = ({
2519
2841
  ]));
2520
2842
  };
2521
2843
 
2844
+ // src/create/iso-base-media/codec-specific/hvc1.ts
2845
+ var createHvc1Data = ({
2846
+ compressorName,
2847
+ depth,
2848
+ height,
2849
+ horizontalResolution,
2850
+ hvccBox,
2851
+ pasp,
2852
+ verticalResolution,
2853
+ width
2854
+ }) => {
2855
+ return addSize(combineUint8Arrays([
2856
+ stringsToUint8Array("hvc1"),
2857
+ new Uint8Array([0, 0, 0, 0, 0, 0]),
2858
+ new Uint8Array([0, 1]),
2859
+ new Uint8Array([0, 0]),
2860
+ new Uint8Array([0, 0]),
2861
+ new Uint8Array([0, 0, 0, 0]),
2862
+ new Uint8Array([0, 0, 0, 0]),
2863
+ new Uint8Array([0, 0, 0, 0]),
2864
+ numberTo16BitUIntOrInt(width),
2865
+ numberTo16BitUIntOrInt(height),
2866
+ setFixedPointSignedOrUnsigned1616Number(horizontalResolution),
2867
+ setFixedPointSignedOrUnsigned1616Number(verticalResolution),
2868
+ new Uint8Array([0, 0, 0, 0]),
2869
+ numberTo16BitUIntOrInt(1),
2870
+ stringToPascalString(compressorName),
2871
+ numberTo16BitUIntOrInt(depth),
2872
+ numberTo16BitUIntOrInt(-1),
2873
+ hvccBox,
2874
+ pasp
2875
+ ]));
2876
+ };
2877
+
2522
2878
  // src/create/iso-base-media/codec-specific/mp4a.ts
2523
2879
  var createMp4a = ({
2524
2880
  sampleRate,
@@ -2571,17 +2927,33 @@ var createMp4a = ({
2571
2927
  // src/create/iso-base-media/codec-specific/create-codec-specific-data.ts
2572
2928
  var createCodecSpecificData = (track) => {
2573
2929
  if (track.type === "video") {
2574
- return createAvc1Data({
2575
- avccBox: createAvccBox(track.codecPrivate),
2576
- compressorName: "WebCodecs",
2577
- depth: 24,
2578
- horizontalResolution: 72,
2579
- verticalResolution: 72,
2580
- height: track.height,
2581
- width: track.width,
2582
- pasp: createPasp(1, 1),
2583
- type: "avc1-data"
2584
- });
2930
+ if (track.codec === "h264") {
2931
+ return createAvc1Data({
2932
+ avccBox: createAvccBox(track.codecPrivate),
2933
+ compressorName: "WebCodecs",
2934
+ depth: 24,
2935
+ horizontalResolution: 72,
2936
+ verticalResolution: 72,
2937
+ height: track.height,
2938
+ width: track.width,
2939
+ pasp: createPasp(1, 1),
2940
+ type: "avc1-data"
2941
+ });
2942
+ }
2943
+ if (track.codec === "h265") {
2944
+ return createHvc1Data({
2945
+ hvccBox: createHvccBox(track.codecPrivate),
2946
+ compressorName: "WebCodecs",
2947
+ depth: 24,
2948
+ horizontalResolution: 72,
2949
+ verticalResolution: 72,
2950
+ height: track.height,
2951
+ width: track.width,
2952
+ pasp: createPasp(1, 1),
2953
+ type: "hvc1-data"
2954
+ });
2955
+ }
2956
+ throw new Error("Unsupported codec specific data " + track.codec);
2585
2957
  }
2586
2958
  if (track.type === "audio") {
2587
2959
  return createMp4a({
@@ -3038,7 +3410,7 @@ var serializeTrack = ({
3038
3410
  samplePositions,
3039
3411
  timescale
3040
3412
  }) => {
3041
- if (track.codec !== "h264" && track.codec !== "aac") {
3413
+ if (track.codec !== "h264" && track.codec !== "h265" && track.codec !== "aac") {
3042
3414
  throw new Error("Currently only H.264 and AAC is supported");
3043
3415
  }
3044
3416
  return createTrak({
@@ -3147,7 +3519,11 @@ var createIsoBaseMedia = async ({
3147
3519
  majorBrand: "isom",
3148
3520
  minorBrand: 512
3149
3521
  });
3150
- const w = await writer.createContent({ filename, mimeType: "video/mp4" });
3522
+ const w = await writer.createContent({
3523
+ filename,
3524
+ mimeType: "video/mp4",
3525
+ logLevel
3526
+ });
3151
3527
  await w.write(header);
3152
3528
  let globalDurationInUnits = 0;
3153
3529
  const lowestTrackTimestamps = {};
@@ -3263,8 +3639,8 @@ var createIsoBaseMedia = async ({
3263
3639
  };
3264
3640
  const waitForFinishPromises = [];
3265
3641
  return {
3266
- save: () => {
3267
- return w.save();
3642
+ getBlob: () => {
3643
+ return w.getBlob();
3268
3644
  },
3269
3645
  remove: async () => {
3270
3646
  await w.remove();
@@ -3305,7 +3681,7 @@ var createIsoBaseMedia = async ({
3305
3681
  await updateMoov();
3306
3682
  await updateMdatSize();
3307
3683
  MediaParserInternals6.Log.verbose(logLevel, "All write operations done. Waiting for finish...");
3308
- await w.waitForFinish();
3684
+ await w.finish();
3309
3685
  }
3310
3686
  };
3311
3687
  };
@@ -3740,12 +4116,18 @@ var makeAudioCodecId = (codecId) => {
3740
4116
  if (codecId === "aac") {
3741
4117
  return "A_AAC";
3742
4118
  }
4119
+ if (codecId === "ac3") {
4120
+ return "A_AC3";
4121
+ }
3743
4122
  if (codecId === "mp3") {
3744
4123
  return "A_MPEG/L3";
3745
4124
  }
3746
4125
  if (codecId === "vorbis") {
3747
4126
  return "A_VORBIS";
3748
4127
  }
4128
+ if (codecId === "flac") {
4129
+ return "A_FLAC";
4130
+ }
3749
4131
  if (codecId === "pcm-u8") {
3750
4132
  return "A_PCM/INT/LIT";
3751
4133
  }
@@ -3937,7 +4319,11 @@ var createMatroskaMedia = async ({
3937
4319
  progressTracker
3938
4320
  }) => {
3939
4321
  const header = makeMatroskaHeader();
3940
- const w = await writer.createContent({ filename, mimeType: "video/webm" });
4322
+ const w = await writer.createContent({
4323
+ filename,
4324
+ mimeType: "video/webm",
4325
+ logLevel
4326
+ });
3941
4327
  await w.write(header.bytes);
3942
4328
  const matroskaInfo = makeMatroskaInfo({
3943
4329
  timescale
@@ -4070,8 +4456,8 @@ var createMatroskaMedia = async ({
4070
4456
  }
4071
4457
  });
4072
4458
  },
4073
- save: () => {
4074
- return w.save();
4459
+ getBlob: async () => {
4460
+ return w.getBlob();
4075
4461
  },
4076
4462
  remove: async () => {
4077
4463
  await w.remove();
@@ -4098,9 +4484,9 @@ var createMatroskaMedia = async ({
4098
4484
  });
4099
4485
  await updateSeekWrite();
4100
4486
  await w.write(createMatroskaCues(cues).bytes);
4101
- await w.waitForFinish();
4102
4487
  const segmentSize = w.getWrittenByteCount() - segmentOffset - matroskaToHex(matroskaElements.Segment).byteLength - MATROSKA_SEGMENT_MIN_VINT_WIDTH;
4103
4488
  await updateSegmentSize(segmentSize);
4489
+ await w.finish();
4104
4490
  }
4105
4491
  };
4106
4492
  };
@@ -4127,7 +4513,11 @@ var createWav = async ({
4127
4513
  writer,
4128
4514
  progressTracker
4129
4515
  }) => {
4130
- const w = await writer.createContent({ filename, mimeType: "audio/wav" });
4516
+ const w = await writer.createContent({
4517
+ filename,
4518
+ mimeType: "audio/wav",
4519
+ logLevel
4520
+ });
4131
4521
  await w.write(new Uint8Array([82, 73, 70, 70]));
4132
4522
  const sizePosition = w.getWrittenByteCount();
4133
4523
  await w.write(new Uint8Array([0, 0, 0, 0]));
@@ -4177,8 +4567,8 @@ var createWav = async ({
4177
4567
  };
4178
4568
  const waitForFinishPromises = [];
4179
4569
  return {
4180
- save: () => {
4181
- return w.save();
4570
+ getBlob: () => {
4571
+ return w.getBlob();
4182
4572
  },
4183
4573
  remove: () => {
4184
4574
  return w.remove();
@@ -4202,7 +4592,7 @@ var createWav = async ({
4202
4592
  await Promise.all(waitForFinishPromises.map((p) => p()));
4203
4593
  await operationProm.current;
4204
4594
  await updateSize();
4205
- await w.waitForFinish();
4595
+ await w.finish();
4206
4596
  },
4207
4597
  addTrack: async (track) => {
4208
4598
  if (track.type !== "audio") {
@@ -4330,11 +4720,11 @@ var convertMedia = async function({
4330
4720
  if (userPassedAbortSignal?.aborted) {
4331
4721
  return Promise.reject(new error_cause_default("Aborted"));
4332
4722
  }
4333
- if (container !== "webm" && container !== "mp4" && container !== "wav") {
4334
- return Promise.reject(new TypeError('Only `to: "webm"`, `to: "mp4"` and `to: "wav"` is supported currently'));
4723
+ if (container !== "webm" && availableContainers.indexOf(container) === -1) {
4724
+ return Promise.reject(new TypeError(`Only the following values for "container" are supported currently: ${JSON.stringify(availableContainers)}`));
4335
4725
  }
4336
- if (videoCodec && videoCodec !== "vp8" && videoCodec !== "vp9") {
4337
- return Promise.reject(new TypeError('Only `videoCodec: "vp8"` and `videoCodec: "vp9"` are supported currently'));
4726
+ if (videoCodec && availableVideoCodecs.indexOf(videoCodec) === -1) {
4727
+ return Promise.reject(new TypeError(`Only the following values for "videoCodec" are supported currently: ${JSON.stringify(availableVideoCodecs)}`));
4338
4728
  }
4339
4729
  const { resolve, reject, getPromiseToImmediatelyReturn } = withResolversAndWaitForReturn();
4340
4730
  const controller = new AbortController;
@@ -4446,7 +4836,7 @@ var convertMedia = async function({
4446
4836
  return state.waitForFinish();
4447
4837
  }).then(() => {
4448
4838
  resolve({
4449
- save: state.save,
4839
+ save: state.getBlob,
4450
4840
  remove: state.remove,
4451
4841
  finalState: throttledState.get()
4452
4842
  });
@@ -4481,26 +4871,6 @@ var getAvailableAudioCodecs = ({
4481
4871
  }
4482
4872
  throw new Error(`Unsupported container: ${container}`);
4483
4873
  };
4484
- // src/get-available-containers.ts
4485
- var availableContainers = ["webm", "mp4", "wav"];
4486
- var getAvailableContainers = () => {
4487
- return availableContainers;
4488
- };
4489
- // src/get-available-video-codecs.ts
4490
- var getAvailableVideoCodecs = ({
4491
- container
4492
- }) => {
4493
- if (container === "mp4") {
4494
- return ["h264"];
4495
- }
4496
- if (container === "webm") {
4497
- return ["vp8", "vp9"];
4498
- }
4499
- if (container === "wav") {
4500
- return [];
4501
- }
4502
- throw new Error(`Unsupported container: ${container}`);
4503
- };
4504
4874
  // src/index.ts
4505
4875
  var WebCodecsInternals = {
4506
4876
  rotateAndResizeVideoFrame,