mediabunny 1.32.2 → 1.34.0

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 (64) hide show
  1. package/dist/bundles/mediabunny.cjs +697 -40
  2. package/dist/bundles/mediabunny.min.cjs +10 -9
  3. package/dist/bundles/mediabunny.min.mjs +10 -9
  4. package/dist/bundles/mediabunny.mjs +697 -40
  5. package/dist/mediabunny.d.ts +27 -6
  6. package/dist/modules/shared/ac3-misc.d.ts +12 -0
  7. package/dist/modules/shared/ac3-misc.d.ts.map +1 -0
  8. package/dist/modules/shared/ac3-misc.js +11 -0
  9. package/dist/modules/src/adts/adts-muxer.d.ts.map +1 -1
  10. package/dist/modules/src/adts/adts-muxer.js +1 -4
  11. package/dist/modules/src/codec-data.d.ts +92 -0
  12. package/dist/modules/src/codec-data.d.ts.map +1 -1
  13. package/dist/modules/src/codec-data.js +263 -0
  14. package/dist/modules/src/codec.d.ts +3 -3
  15. package/dist/modules/src/codec.d.ts.map +1 -1
  16. package/dist/modules/src/codec.js +37 -3
  17. package/dist/modules/src/conversion.d.ts.map +1 -1
  18. package/dist/modules/src/conversion.js +11 -6
  19. package/dist/modules/src/encode.d.ts +2 -2
  20. package/dist/modules/src/encode.d.ts.map +1 -1
  21. package/dist/modules/src/encode.js +2 -0
  22. package/dist/modules/src/isobmff/isobmff-boxes.d.ts.map +1 -1
  23. package/dist/modules/src/isobmff/isobmff-boxes.js +66 -2
  24. package/dist/modules/src/isobmff/isobmff-demuxer.d.ts.map +1 -1
  25. package/dist/modules/src/isobmff/isobmff-demuxer.js +49 -1
  26. package/dist/modules/src/isobmff/isobmff-muxer.d.ts +1 -0
  27. package/dist/modules/src/isobmff/isobmff-muxer.d.ts.map +1 -1
  28. package/dist/modules/src/isobmff/isobmff-muxer.js +2 -1
  29. package/dist/modules/src/matroska/ebml.d.ts.map +1 -1
  30. package/dist/modules/src/matroska/ebml.js +2 -0
  31. package/dist/modules/src/matroska/matroska-demuxer.d.ts.map +1 -1
  32. package/dist/modules/src/matroska/matroska-demuxer.js +8 -0
  33. package/dist/modules/src/media-source.d.ts.map +1 -1
  34. package/dist/modules/src/media-source.js +6 -17
  35. package/dist/modules/src/mpeg-ts/mpeg-ts-demuxer.d.ts.map +1 -1
  36. package/dist/modules/src/mpeg-ts/mpeg-ts-demuxer.js +157 -2
  37. package/dist/modules/src/mpeg-ts/mpeg-ts-misc.d.ts +3 -0
  38. package/dist/modules/src/mpeg-ts/mpeg-ts-misc.d.ts.map +1 -1
  39. package/dist/modules/src/mpeg-ts/mpeg-ts-muxer.d.ts.map +1 -1
  40. package/dist/modules/src/mpeg-ts/mpeg-ts-muxer.js +62 -8
  41. package/dist/modules/src/output-format.d.ts +15 -0
  42. package/dist/modules/src/output-format.d.ts.map +1 -1
  43. package/dist/modules/src/output-format.js +26 -2
  44. package/dist/modules/src/packet.d.ts +8 -2
  45. package/dist/modules/src/packet.d.ts.map +1 -1
  46. package/dist/modules/src/packet.js +4 -1
  47. package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +8 -7
  49. package/src/adts/adts-muxer.ts +1 -4
  50. package/src/codec-data.ts +359 -0
  51. package/src/codec.ts +31 -3
  52. package/src/conversion.ts +14 -6
  53. package/src/encode.ts +4 -2
  54. package/src/isobmff/isobmff-boxes.ts +79 -1
  55. package/src/isobmff/isobmff-demuxer.ts +54 -0
  56. package/src/isobmff/isobmff-muxer.ts +3 -1
  57. package/src/matroska/ebml.ts +2 -0
  58. package/src/matroska/matroska-demuxer.ts +6 -0
  59. package/src/media-source.ts +9 -19
  60. package/src/mpeg-ts/mpeg-ts-demuxer.ts +186 -1
  61. package/src/mpeg-ts/mpeg-ts-misc.ts +3 -0
  62. package/src/mpeg-ts/mpeg-ts-muxer.ts +56 -7
  63. package/src/output-format.ts +43 -2
  64. package/src/packet.ts +4 -1
@@ -937,7 +937,9 @@ var Mediabunny = (() => {
937
937
  "opus",
938
938
  "mp3",
939
939
  "vorbis",
940
- "flac"
940
+ "flac",
941
+ "ac3",
942
+ "eac3"
941
943
  ];
942
944
  var AUDIO_CODECS = [
943
945
  ...NON_PCM_AUDIO_CODECS,
@@ -1340,6 +1342,10 @@ var Mediabunny = (() => {
1340
1342
  return "vorbis";
1341
1343
  } else if (codec === "flac") {
1342
1344
  return "flac";
1345
+ } else if (codec === "ac3") {
1346
+ return "ac-3";
1347
+ } else if (codec === "eac3") {
1348
+ return "ec-3";
1343
1349
  } else if (PCM_AUDIO_CODECS.includes(codec)) {
1344
1350
  return codec;
1345
1351
  }
@@ -1371,6 +1377,10 @@ var Mediabunny = (() => {
1371
1377
  return "vorbis";
1372
1378
  } else if (codec === "flac") {
1373
1379
  return "flac";
1380
+ } else if (codec === "ac3") {
1381
+ return "ac-3";
1382
+ } else if (codec === "eac3") {
1383
+ return "ec-3";
1374
1384
  } else if (codec && PCM_AUDIO_CODECS.includes(codec)) {
1375
1385
  return codec;
1376
1386
  }
@@ -1503,6 +1513,10 @@ var Mediabunny = (() => {
1503
1513
  return "vorbis";
1504
1514
  } else if (codecString === "flac") {
1505
1515
  return "flac";
1516
+ } else if (codecString === "ac-3" || codecString === "ac3") {
1517
+ return "ac3";
1518
+ } else if (codecString === "ec-3" || codecString === "eac3") {
1519
+ return "eac3";
1506
1520
  } else if (codecString === "ulaw") {
1507
1521
  return "ulaw";
1508
1522
  } else if (codecString === "alaw") {
@@ -1573,7 +1587,7 @@ var Mediabunny = (() => {
1573
1587
  }
1574
1588
  if (!VALID_VIDEO_CODEC_STRING_PREFIXES.some((prefix) => metadata.decoderConfig.codec.startsWith(prefix))) {
1575
1589
  throw new TypeError(
1576
- "Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry."
1590
+ "Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the Mediabunny Codec Registry."
1577
1591
  );
1578
1592
  }
1579
1593
  if (!Number.isInteger(metadata.decoderConfig.codedWidth) || metadata.decoderConfig.codedWidth <= 0) {
@@ -1654,7 +1668,18 @@ var Mediabunny = (() => {
1654
1668
  }
1655
1669
  }
1656
1670
  };
1657
- var VALID_AUDIO_CODEC_STRING_PREFIXES = ["mp4a", "mp3", "opus", "vorbis", "flac", "ulaw", "alaw", "pcm"];
1671
+ var VALID_AUDIO_CODEC_STRING_PREFIXES = [
1672
+ "mp4a",
1673
+ "mp3",
1674
+ "opus",
1675
+ "vorbis",
1676
+ "flac",
1677
+ "ulaw",
1678
+ "alaw",
1679
+ "pcm",
1680
+ "ac-3",
1681
+ "ec-3"
1682
+ ];
1658
1683
  var validateAudioChunkMetadata = (metadata) => {
1659
1684
  if (!metadata) {
1660
1685
  throw new TypeError("Audio chunk metadata must be provided.");
@@ -1673,7 +1698,7 @@ var Mediabunny = (() => {
1673
1698
  }
1674
1699
  if (!VALID_AUDIO_CODEC_STRING_PREFIXES.some((prefix) => metadata.decoderConfig.codec.startsWith(prefix))) {
1675
1700
  throw new TypeError(
1676
- "Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry."
1701
+ "Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the Mediabunny Codec Registry."
1677
1702
  );
1678
1703
  }
1679
1704
  if (!Number.isInteger(metadata.decoderConfig.sampleRate) || metadata.decoderConfig.sampleRate <= 0) {
@@ -1734,6 +1759,14 @@ var Mediabunny = (() => {
1734
1759
  "Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/."
1735
1760
  );
1736
1761
  }
1762
+ } else if (metadata.decoderConfig.codec.startsWith("ac-3") || metadata.decoderConfig.codec.startsWith("ac3")) {
1763
+ if (metadata.decoderConfig.codec !== "ac-3") {
1764
+ throw new TypeError('Audio chunk metadata decoder configuration codec string for AC-3 must be "ac-3".');
1765
+ }
1766
+ } else if (metadata.decoderConfig.codec.startsWith("ec-3") || metadata.decoderConfig.codec.startsWith("eac3")) {
1767
+ if (metadata.decoderConfig.codec !== "ec-3") {
1768
+ throw new TypeError('Audio chunk metadata decoder configuration codec string for EC-3 must be "ec-3".');
1769
+ }
1737
1770
  } else if (metadata.decoderConfig.codec.startsWith("pcm") || metadata.decoderConfig.codec.startsWith("ulaw") || metadata.decoderConfig.codec.startsWith("alaw")) {
1738
1771
  if (!PCM_AUDIO_CODECS.includes(metadata.decoderConfig.codec)) {
1739
1772
  throw new TypeError(
@@ -2018,6 +2051,10 @@ var Mediabunny = (() => {
2018
2051
  return unsynchsafed;
2019
2052
  };
2020
2053
 
2054
+ // shared/ac3-misc.ts
2055
+ var AC3_SAMPLE_RATES = [48e3, 44100, 32e3];
2056
+ var EAC3_REDUCED_SAMPLE_RATES = [24e3, 22050, 16e3];
2057
+
2021
2058
  // src/codec-data.ts
2022
2059
  var iterateNalUnitsInAnnexB = function* (packetData) {
2023
2060
  let i = 0;
@@ -3973,6 +4010,285 @@ var Mediabunny = (() => {
3973
4010
  }
3974
4011
  return commentHeader;
3975
4012
  };
4013
+ var AC3_ACMOD_CHANNEL_COUNTS = [2, 1, 2, 3, 3, 4, 4, 5];
4014
+ var parseAc3SyncFrame = (data) => {
4015
+ if (data.length < 7) {
4016
+ return null;
4017
+ }
4018
+ if (data[0] !== 11 || data[1] !== 119) {
4019
+ return null;
4020
+ }
4021
+ const bitstream = new Bitstream(data);
4022
+ bitstream.skipBits(16);
4023
+ bitstream.skipBits(16);
4024
+ const fscod = bitstream.readBits(2);
4025
+ if (fscod === 3) {
4026
+ return null;
4027
+ }
4028
+ const frmsizecod = bitstream.readBits(6);
4029
+ const bsid = bitstream.readBits(5);
4030
+ if (bsid > 8) {
4031
+ return null;
4032
+ }
4033
+ const bsmod = bitstream.readBits(3);
4034
+ const acmod = bitstream.readBits(3);
4035
+ if ((acmod & 1) !== 0 && acmod !== 1) {
4036
+ bitstream.skipBits(2);
4037
+ }
4038
+ if ((acmod & 4) !== 0) {
4039
+ bitstream.skipBits(2);
4040
+ }
4041
+ if (acmod === 2) {
4042
+ bitstream.skipBits(2);
4043
+ }
4044
+ const lfeon = bitstream.readBits(1);
4045
+ const bitRateCode = Math.floor(frmsizecod / 2);
4046
+ return { fscod, bsid, bsmod, acmod, lfeon, bitRateCode };
4047
+ };
4048
+ var AC3_FRAME_SIZES = [
4049
+ // frmsizecod, [48kHz, 44.1kHz, 32kHz] in bytes
4050
+ 64 * 2,
4051
+ 69 * 2,
4052
+ 96 * 2,
4053
+ 64 * 2,
4054
+ 70 * 2,
4055
+ 96 * 2,
4056
+ 80 * 2,
4057
+ 87 * 2,
4058
+ 120 * 2,
4059
+ 80 * 2,
4060
+ 88 * 2,
4061
+ 120 * 2,
4062
+ 96 * 2,
4063
+ 104 * 2,
4064
+ 144 * 2,
4065
+ 96 * 2,
4066
+ 105 * 2,
4067
+ 144 * 2,
4068
+ 112 * 2,
4069
+ 121 * 2,
4070
+ 168 * 2,
4071
+ 112 * 2,
4072
+ 122 * 2,
4073
+ 168 * 2,
4074
+ 128 * 2,
4075
+ 139 * 2,
4076
+ 192 * 2,
4077
+ 128 * 2,
4078
+ 140 * 2,
4079
+ 192 * 2,
4080
+ 160 * 2,
4081
+ 174 * 2,
4082
+ 240 * 2,
4083
+ 160 * 2,
4084
+ 175 * 2,
4085
+ 240 * 2,
4086
+ 192 * 2,
4087
+ 208 * 2,
4088
+ 288 * 2,
4089
+ 192 * 2,
4090
+ 209 * 2,
4091
+ 288 * 2,
4092
+ 224 * 2,
4093
+ 243 * 2,
4094
+ 336 * 2,
4095
+ 224 * 2,
4096
+ 244 * 2,
4097
+ 336 * 2,
4098
+ 256 * 2,
4099
+ 278 * 2,
4100
+ 384 * 2,
4101
+ 256 * 2,
4102
+ 279 * 2,
4103
+ 384 * 2,
4104
+ 320 * 2,
4105
+ 348 * 2,
4106
+ 480 * 2,
4107
+ 320 * 2,
4108
+ 349 * 2,
4109
+ 480 * 2,
4110
+ 384 * 2,
4111
+ 417 * 2,
4112
+ 576 * 2,
4113
+ 384 * 2,
4114
+ 418 * 2,
4115
+ 576 * 2,
4116
+ 448 * 2,
4117
+ 487 * 2,
4118
+ 672 * 2,
4119
+ 448 * 2,
4120
+ 488 * 2,
4121
+ 672 * 2,
4122
+ 512 * 2,
4123
+ 557 * 2,
4124
+ 768 * 2,
4125
+ 512 * 2,
4126
+ 558 * 2,
4127
+ 768 * 2,
4128
+ 640 * 2,
4129
+ 696 * 2,
4130
+ 960 * 2,
4131
+ 640 * 2,
4132
+ 697 * 2,
4133
+ 960 * 2,
4134
+ 768 * 2,
4135
+ 835 * 2,
4136
+ 1152 * 2,
4137
+ 768 * 2,
4138
+ 836 * 2,
4139
+ 1152 * 2,
4140
+ 896 * 2,
4141
+ 975 * 2,
4142
+ 1344 * 2,
4143
+ 896 * 2,
4144
+ 976 * 2,
4145
+ 1344 * 2,
4146
+ 1024 * 2,
4147
+ 1114 * 2,
4148
+ 1536 * 2,
4149
+ 1024 * 2,
4150
+ 1115 * 2,
4151
+ 1536 * 2,
4152
+ 1152 * 2,
4153
+ 1253 * 2,
4154
+ 1728 * 2,
4155
+ 1152 * 2,
4156
+ 1254 * 2,
4157
+ 1728 * 2,
4158
+ 1280 * 2,
4159
+ 1393 * 2,
4160
+ 1920 * 2,
4161
+ 1280 * 2,
4162
+ 1394 * 2,
4163
+ 1920 * 2
4164
+ ];
4165
+ var AC3_SAMPLES_PER_FRAME = 1536;
4166
+ var AC3_REGISTRATION_DESCRIPTOR = new Uint8Array([5, 4, 65, 67, 45, 51]);
4167
+ var EAC3_REGISTRATION_DESCRIPTOR = new Uint8Array([5, 4, 69, 65, 67, 51]);
4168
+ var EAC3_NUMBLKS_TABLE = [1, 2, 3, 6];
4169
+ var parseEac3SyncFrame = (data) => {
4170
+ if (data.length < 6) {
4171
+ return null;
4172
+ }
4173
+ if (data[0] !== 11 || data[1] !== 119) {
4174
+ return null;
4175
+ }
4176
+ const bitstream = new Bitstream(data);
4177
+ bitstream.skipBits(16);
4178
+ const strmtyp = bitstream.readBits(2);
4179
+ bitstream.skipBits(3);
4180
+ if (strmtyp !== 0 && strmtyp !== 2) {
4181
+ return null;
4182
+ }
4183
+ const frmsiz = bitstream.readBits(11);
4184
+ const fscod = bitstream.readBits(2);
4185
+ let fscod2 = 0;
4186
+ let numblkscod;
4187
+ if (fscod === 3) {
4188
+ fscod2 = bitstream.readBits(2);
4189
+ numblkscod = 3;
4190
+ } else {
4191
+ numblkscod = bitstream.readBits(2);
4192
+ }
4193
+ const acmod = bitstream.readBits(3);
4194
+ const lfeon = bitstream.readBits(1);
4195
+ const bsid = bitstream.readBits(5);
4196
+ if (bsid < 11 || bsid > 16) {
4197
+ return null;
4198
+ }
4199
+ const numblks = EAC3_NUMBLKS_TABLE[numblkscod];
4200
+ let fs;
4201
+ if (fscod < 3) {
4202
+ fs = AC3_SAMPLE_RATES[fscod] / 1e3;
4203
+ } else {
4204
+ fs = EAC3_REDUCED_SAMPLE_RATES[fscod2] / 1e3;
4205
+ }
4206
+ const dataRate = Math.round((frmsiz + 1) * fs / (numblks * 16));
4207
+ const bsmod = 0;
4208
+ const numDepSub = 0;
4209
+ const chanLoc = 0;
4210
+ const substream = {
4211
+ fscod,
4212
+ fscod2,
4213
+ bsid,
4214
+ bsmod,
4215
+ acmod,
4216
+ lfeon,
4217
+ numDepSub,
4218
+ chanLoc
4219
+ };
4220
+ return {
4221
+ dataRate,
4222
+ substreams: [substream]
4223
+ };
4224
+ };
4225
+ var parseEac3Config = (data) => {
4226
+ if (data.length < 2) {
4227
+ return null;
4228
+ }
4229
+ const bitstream = new Bitstream(data);
4230
+ const dataRate = bitstream.readBits(13);
4231
+ const numIndSub = bitstream.readBits(3);
4232
+ const substreams = [];
4233
+ for (let i = 0; i <= numIndSub; i++) {
4234
+ if (Math.ceil(bitstream.pos / 8) + 3 > data.length) {
4235
+ break;
4236
+ }
4237
+ const fscod = bitstream.readBits(2);
4238
+ const bsid = bitstream.readBits(5);
4239
+ bitstream.skipBits(1);
4240
+ bitstream.skipBits(1);
4241
+ const bsmod = bitstream.readBits(3);
4242
+ const acmod = bitstream.readBits(3);
4243
+ const lfeon = bitstream.readBits(1);
4244
+ bitstream.skipBits(3);
4245
+ const numDepSub = bitstream.readBits(4);
4246
+ let chanLoc = 0;
4247
+ if (numDepSub > 0) {
4248
+ chanLoc = bitstream.readBits(9);
4249
+ } else {
4250
+ bitstream.skipBits(1);
4251
+ }
4252
+ substreams.push({
4253
+ fscod,
4254
+ fscod2: null,
4255
+ bsid,
4256
+ bsmod,
4257
+ acmod,
4258
+ lfeon,
4259
+ numDepSub,
4260
+ chanLoc
4261
+ });
4262
+ }
4263
+ if (substreams.length === 0) {
4264
+ return null;
4265
+ }
4266
+ return { dataRate, substreams };
4267
+ };
4268
+ var getEac3SampleRate = (config) => {
4269
+ const sub = config.substreams[0];
4270
+ assert(sub);
4271
+ if (sub.fscod < 3) {
4272
+ return AC3_SAMPLE_RATES[sub.fscod];
4273
+ } else if (sub.fscod2 !== null && sub.fscod2 < 3) {
4274
+ return EAC3_REDUCED_SAMPLE_RATES[sub.fscod2];
4275
+ }
4276
+ return null;
4277
+ };
4278
+ var getEac3ChannelCount = (config) => {
4279
+ const sub = config.substreams[0];
4280
+ assert(sub);
4281
+ let channels = AC3_ACMOD_CHANNEL_COUNTS[sub.acmod] + sub.lfeon;
4282
+ if (sub.numDepSub > 0) {
4283
+ const CHAN_LOC_COUNTS = [2, 2, 1, 1, 2, 2, 2, 1, 1];
4284
+ for (let bit = 0; bit < 9; bit++) {
4285
+ if (sub.chanLoc & 1 << 8 - bit) {
4286
+ channels += CHAN_LOC_COUNTS[bit];
4287
+ }
4288
+ }
4289
+ }
4290
+ return channels;
4291
+ };
3976
4292
 
3977
4293
  // src/demuxer.ts
3978
4294
  var Demuxer = class {
@@ -8087,6 +8403,10 @@ var Mediabunny = (() => {
8087
8403
  track.info.codec = "ulaw";
8088
8404
  } else if (lowercaseBoxName === "alaw") {
8089
8405
  track.info.codec = "alaw";
8406
+ } else if (lowercaseBoxName === "ac-3") {
8407
+ track.info.codec = "ac3";
8408
+ } else if (lowercaseBoxName === "ec-3") {
8409
+ track.info.codec = "eac3";
8090
8410
  } else {
8091
8411
  console.warn(`Unsupported audio codec (sample entry type '${sampleBoxInfo.name}').`);
8092
8412
  }
@@ -8532,6 +8852,47 @@ var Mediabunny = (() => {
8532
8852
  }
8533
8853
  ;
8534
8854
  break;
8855
+ case "dac3":
8856
+ {
8857
+ const track = this.currentTrack;
8858
+ if (!track) {
8859
+ break;
8860
+ }
8861
+ assert(track.info?.type === "audio");
8862
+ const bytes2 = readBytes(slice, 3);
8863
+ const bitstream = new Bitstream(bytes2);
8864
+ const fscod = bitstream.readBits(2);
8865
+ bitstream.skipBits(5 + 3);
8866
+ const acmod = bitstream.readBits(3);
8867
+ const lfeon = bitstream.readBits(1);
8868
+ if (fscod < 3) {
8869
+ track.info.sampleRate = AC3_SAMPLE_RATES[fscod];
8870
+ }
8871
+ track.info.numberOfChannels = AC3_ACMOD_CHANNEL_COUNTS[acmod] + lfeon;
8872
+ }
8873
+ ;
8874
+ break;
8875
+ case "dec3":
8876
+ {
8877
+ const track = this.currentTrack;
8878
+ if (!track) {
8879
+ break;
8880
+ }
8881
+ assert(track.info?.type === "audio");
8882
+ const bytes2 = readBytes(slice, boxInfo.contentSize);
8883
+ const config = parseEac3Config(bytes2);
8884
+ if (!config) {
8885
+ console.warn("Invalid dec3 box contents, ignoring.");
8886
+ break;
8887
+ }
8888
+ const sampleRate = getEac3SampleRate(config);
8889
+ if (sampleRate !== null) {
8890
+ track.info.sampleRate = sampleRate;
8891
+ }
8892
+ track.info.numberOfChannels = getEac3ChannelCount(config);
8893
+ }
8894
+ ;
8895
+ break;
8535
8896
  case "stts":
8536
8897
  {
8537
8898
  const track = this.currentTrack;
@@ -10399,6 +10760,8 @@ var Mediabunny = (() => {
10399
10760
  "opus": "A_OPUS",
10400
10761
  "vorbis": "A_VORBIS",
10401
10762
  "flac": "A_FLAC",
10763
+ "ac3": "A_AC3",
10764
+ "eac3": "A_EAC3",
10402
10765
  "pcm-u8": "A_PCM/INT/LIT",
10403
10766
  "pcm-s16": "A_PCM/INT/LIT",
10404
10767
  "pcm-s16be": "A_PCM/INT/BIG",
@@ -11064,6 +11427,12 @@ var Mediabunny = (() => {
11064
11427
  } else if (codecIdWithoutSuffix === CODEC_STRING_MAP.flac) {
11065
11428
  this.currentTrack.info.codec = "flac";
11066
11429
  this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;
11430
+ } else if (codecIdWithoutSuffix === CODEC_STRING_MAP.ac3) {
11431
+ this.currentTrack.info.codec = "ac3";
11432
+ this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;
11433
+ } else if (codecIdWithoutSuffix === CODEC_STRING_MAP.eac3) {
11434
+ this.currentTrack.info.codec = "eac3";
11435
+ this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;
11067
11436
  } else if (this.currentTrack.codecId === "A_PCM/INT/LIT") {
11068
11437
  if (this.currentTrack.info.bitDepth === 8) {
11069
11438
  this.currentTrack.info.codec = "pcm-u8";
@@ -14910,7 +15279,19 @@ var Mediabunny = (() => {
14910
15279
  const elementaryPid = bitstream.readBits(13);
14911
15280
  bitstream.skipBits(6);
14912
15281
  const esInfoLength = bitstream.readBits(10);
14913
- bitstream.skipBits(8 * esInfoLength);
15282
+ const esInfoEndPos = bitstream.pos + 8 * esInfoLength;
15283
+ let hasAc3Descriptor = false;
15284
+ let hasEac3Descriptor = false;
15285
+ while (bitstream.pos < esInfoEndPos) {
15286
+ const descriptorTag = bitstream.readBits(8);
15287
+ const descriptorLength = bitstream.readBits(8);
15288
+ if (descriptorTag === 106) {
15289
+ hasAc3Descriptor = true;
15290
+ } else if (descriptorTag === 122 || descriptorTag === 204) {
15291
+ hasEac3Descriptor = true;
15292
+ }
15293
+ bitstream.skipBits(8 * descriptorLength);
15294
+ }
14914
15295
  let info = null;
14915
15296
  switch (streamType) {
14916
15297
  case 3 /* MP3_MPEG1 */:
@@ -14950,6 +15331,52 @@ var Mediabunny = (() => {
14950
15331
  }
14951
15332
  ;
14952
15333
  break;
15334
+ case 129 /* AC3_SYSTEM_A */:
15335
+ {
15336
+ info = {
15337
+ type: "audio",
15338
+ codec: "ac3",
15339
+ aacCodecInfo: null,
15340
+ numberOfChannels: -1,
15341
+ sampleRate: -1
15342
+ };
15343
+ }
15344
+ ;
15345
+ break;
15346
+ case 135 /* EAC3_SYSTEM_A */:
15347
+ {
15348
+ info = {
15349
+ type: "audio",
15350
+ codec: "eac3",
15351
+ aacCodecInfo: null,
15352
+ numberOfChannels: -1,
15353
+ sampleRate: -1
15354
+ };
15355
+ }
15356
+ ;
15357
+ break;
15358
+ case 6 /* PRIVATE_DATA */:
15359
+ {
15360
+ if (hasEac3Descriptor) {
15361
+ info = {
15362
+ type: "audio",
15363
+ codec: "eac3",
15364
+ aacCodecInfo: null,
15365
+ numberOfChannels: -1,
15366
+ sampleRate: -1
15367
+ };
15368
+ } else if (hasAc3Descriptor) {
15369
+ info = {
15370
+ type: "audio",
15371
+ codec: "ac3",
15372
+ aacCodecInfo: null,
15373
+ numberOfChannels: -1,
15374
+ sampleRate: -1
15375
+ };
15376
+ }
15377
+ }
15378
+ ;
15379
+ break;
14953
15380
  default: {
14954
15381
  console.warn(`Unsupported stream_type 0x${streamType.toString(16)}; ignoring stream.`);
14955
15382
  }
@@ -15051,6 +15478,37 @@ var Mediabunny = (() => {
15051
15478
  elementaryStream.info.numberOfChannels = result.header.channel === 3 ? 1 : 2;
15052
15479
  elementaryStream.info.sampleRate = result.header.sampleRate;
15053
15480
  elementaryStream.initialized = true;
15481
+ } else if (elementaryStream.info.codec === "ac3") {
15482
+ const frameInfo = parseAc3SyncFrame(pesPacket.data);
15483
+ if (!frameInfo) {
15484
+ throw new Error(
15485
+ "Invalid AC-3 audio stream; could not read sync frame from first packet."
15486
+ );
15487
+ }
15488
+ if (frameInfo.fscod === 3) {
15489
+ throw new Error(
15490
+ "Invalid AC-3 audio stream; reserved sample rate code found in first packet."
15491
+ );
15492
+ }
15493
+ elementaryStream.info.numberOfChannels = AC3_ACMOD_CHANNEL_COUNTS[frameInfo.acmod] + frameInfo.lfeon;
15494
+ elementaryStream.info.sampleRate = AC3_SAMPLE_RATES[frameInfo.fscod];
15495
+ elementaryStream.initialized = true;
15496
+ } else if (elementaryStream.info.codec === "eac3") {
15497
+ const frameInfo = parseEac3SyncFrame(pesPacket.data);
15498
+ if (!frameInfo) {
15499
+ throw new Error(
15500
+ "Invalid E-AC-3 audio stream; could not read sync frame from first packet."
15501
+ );
15502
+ }
15503
+ const sampleRate = getEac3SampleRate(frameInfo);
15504
+ if (sampleRate === null) {
15505
+ throw new Error(
15506
+ "Invalid E-AC-3 audio stream; reserved sample rate code found in first packet."
15507
+ );
15508
+ }
15509
+ elementaryStream.info.numberOfChannels = getEac3ChannelCount(frameInfo);
15510
+ elementaryStream.info.sampleRate = sampleRate;
15511
+ elementaryStream.initialized = true;
15054
15512
  } else {
15055
15513
  throw new Error("Unhandled.");
15056
15514
  }
@@ -15955,6 +16413,66 @@ var Mediabunny = (() => {
15955
16413
  } else {
15956
16414
  context.seekTo(possibleHeaderStartPos + 1);
15957
16415
  }
16416
+ } else if (codec === "ac3") {
16417
+ if (byte !== 11) {
16418
+ continue;
16419
+ }
16420
+ context.skip(-1);
16421
+ const possibleSyncPos = context.currentPos;
16422
+ let remaining2 = context.ensureBuffered(5);
16423
+ if (remaining2 instanceof Promise) remaining2 = await remaining2;
16424
+ if (remaining2 < 5) {
16425
+ return;
16426
+ }
16427
+ const headerBytes = context.readBytes(5);
16428
+ if (headerBytes[0] !== 11 || headerBytes[1] !== 119) {
16429
+ context.seekTo(possibleSyncPos + 1);
16430
+ continue;
16431
+ }
16432
+ const fscod = headerBytes[4] >> 6;
16433
+ const frmsizecod = headerBytes[4] & 63;
16434
+ if (fscod === 3 || frmsizecod > 37) {
16435
+ context.seekTo(possibleSyncPos + 1);
16436
+ continue;
16437
+ }
16438
+ const frameSize = AC3_FRAME_SIZES[3 * frmsizecod + fscod];
16439
+ assert(frameSize !== void 0);
16440
+ context.seekTo(possibleSyncPos);
16441
+ remaining2 = context.ensureBuffered(frameSize);
16442
+ if (remaining2 instanceof Promise) remaining2 = await remaining2;
16443
+ const duration = Math.round(
16444
+ AC3_SAMPLES_PER_FRAME * TIMESCALE / elementaryStream.info.sampleRate
16445
+ );
16446
+ return context.supplyPacket(remaining2, duration);
16447
+ } else if (codec === "eac3") {
16448
+ if (byte !== 11) {
16449
+ continue;
16450
+ }
16451
+ context.skip(-1);
16452
+ const possibleSyncPos = context.currentPos;
16453
+ let remaining2 = context.ensureBuffered(5);
16454
+ if (remaining2 instanceof Promise) remaining2 = await remaining2;
16455
+ if (remaining2 < 5) {
16456
+ return;
16457
+ }
16458
+ const headerBytes = context.readBytes(5);
16459
+ if (headerBytes[0] !== 11 || headerBytes[1] !== 119) {
16460
+ context.seekTo(possibleSyncPos + 1);
16461
+ continue;
16462
+ }
16463
+ const frmsiz = (headerBytes[2] & 7) << 8 | headerBytes[3];
16464
+ const frameSize = (frmsiz + 1) * 2;
16465
+ const fscod = headerBytes[4] >> 6;
16466
+ const numblkscod = fscod === 3 ? 3 : headerBytes[4] >> 4 & 3;
16467
+ const numblks = EAC3_NUMBLKS_TABLE[numblkscod];
16468
+ context.seekTo(possibleSyncPos);
16469
+ remaining2 = context.ensureBuffered(frameSize);
16470
+ if (remaining2 instanceof Promise) remaining2 = await remaining2;
16471
+ const samplesPerFrame = numblks * 256;
16472
+ const duration = Math.round(
16473
+ samplesPerFrame * TIMESCALE / elementaryStream.info.sampleRate
16474
+ );
16475
+ return context.supplyPacket(remaining2, duration);
15958
16476
  } else {
15959
16477
  throw new Error("Unhandled.");
15960
16478
  }
@@ -20150,6 +20668,63 @@ var Mediabunny = (() => {
20150
20668
  u8(8 * sampleSize)
20151
20669
  ]);
20152
20670
  };
20671
+ var dac3 = (trackData) => {
20672
+ const frameInfo = parseAc3SyncFrame(trackData.info.firstPacket.data);
20673
+ if (!frameInfo) {
20674
+ throw new Error(
20675
+ "Couldn't extract AC-3 frame info from the audio packet. Ensure the packets contain valid AC-3 sync frames (as specified in ETSI TS 102 366)."
20676
+ );
20677
+ }
20678
+ const bytes2 = new Uint8Array(3);
20679
+ const bitstream = new Bitstream(bytes2);
20680
+ bitstream.writeBits(2, frameInfo.fscod);
20681
+ bitstream.writeBits(5, frameInfo.bsid);
20682
+ bitstream.writeBits(3, frameInfo.bsmod);
20683
+ bitstream.writeBits(3, frameInfo.acmod);
20684
+ bitstream.writeBits(1, frameInfo.lfeon);
20685
+ bitstream.writeBits(5, frameInfo.bitRateCode);
20686
+ bitstream.writeBits(5, 0);
20687
+ return box("dac3", [...bytes2]);
20688
+ };
20689
+ var dec3 = (trackData) => {
20690
+ const frameInfo = parseEac3SyncFrame(trackData.info.firstPacket.data);
20691
+ if (!frameInfo) {
20692
+ throw new Error(
20693
+ "Couldn't extract E-AC-3 frame info from the audio packet. Ensure the packets contain valid E-AC-3 sync frames (as specified in ETSI TS 102 366)."
20694
+ );
20695
+ }
20696
+ let totalBits = 16;
20697
+ for (const sub of frameInfo.substreams) {
20698
+ totalBits += 23;
20699
+ if (sub.numDepSub > 0) {
20700
+ totalBits += 9;
20701
+ } else {
20702
+ totalBits += 1;
20703
+ }
20704
+ }
20705
+ const size = Math.ceil(totalBits / 8);
20706
+ const bytes2 = new Uint8Array(size);
20707
+ const bitstream = new Bitstream(bytes2);
20708
+ bitstream.writeBits(13, frameInfo.dataRate);
20709
+ bitstream.writeBits(3, frameInfo.substreams.length - 1);
20710
+ for (const sub of frameInfo.substreams) {
20711
+ bitstream.writeBits(2, sub.fscod);
20712
+ bitstream.writeBits(5, sub.bsid);
20713
+ bitstream.writeBits(1, 0);
20714
+ bitstream.writeBits(1, 0);
20715
+ bitstream.writeBits(3, sub.bsmod);
20716
+ bitstream.writeBits(3, sub.acmod);
20717
+ bitstream.writeBits(1, sub.lfeon);
20718
+ bitstream.writeBits(3, 0);
20719
+ bitstream.writeBits(4, sub.numDepSub);
20720
+ if (sub.numDepSub > 0) {
20721
+ bitstream.writeBits(9, sub.chanLoc);
20722
+ } else {
20723
+ bitstream.writeBits(1, 0);
20724
+ }
20725
+ }
20726
+ return box("dec3", [...bytes2]);
20727
+ };
20153
20728
  var subtitleSampleDescription = (compressionType, trackData) => box(compressionType, [
20154
20729
  Array(6).fill(0),
20155
20730
  // Reserved
@@ -20818,6 +21393,10 @@ var Mediabunny = (() => {
20818
21393
  return "raw ";
20819
21394
  case "pcm-s8":
20820
21395
  return "sowt";
21396
+ case "ac3":
21397
+ return "ac-3";
21398
+ case "eac3":
21399
+ return "ec-3";
20821
21400
  }
20822
21401
  if (isQuickTime) {
20823
21402
  switch (codec) {
@@ -20879,6 +21458,10 @@ var Mediabunny = (() => {
20879
21458
  return esds;
20880
21459
  case "flac":
20881
21460
  return dfLa;
21461
+ case "ac3":
21462
+ return dac3;
21463
+ case "eac3":
21464
+ return dec3;
20882
21465
  }
20883
21466
  if (isQuickTime) {
20884
21467
  switch (codec) {
@@ -21576,9 +22159,10 @@ var Mediabunny = (() => {
21576
22159
  sampleRate: meta.decoderConfig.sampleRate,
21577
22160
  decoderConfig,
21578
22161
  requiresPcmTransformation: !this.isFragmented && PCM_AUDIO_CODECS.includes(track.source._codec),
21579
- requiresAdtsStripping
22162
+ requiresAdtsStripping,
22163
+ firstPacket: packet
21580
22164
  },
21581
- timescale: meta.decoderConfig.sampleRate,
22165
+ timescale: decoderConfig.sampleRate,
21582
22166
  samples: [],
21583
22167
  sampleQueue: [],
21584
22168
  timestampProcessingQueue: [],
@@ -23806,10 +24390,40 @@ ${cue.notes ?? ""}`;
23806
24390
  validateAudioChunkMetadata(meta);
23807
24391
  assert(meta?.decoderConfig);
23808
24392
  const codec = track.source._codec;
23809
- assert(codec === "aac" || codec === "mp3");
23810
- const streamType = codec === "aac" ? 15 /* AAC */ : 3 /* MP3_MPEG1 */;
24393
+ assert(codec === "aac" || codec === "mp3" || codec === "ac3" || codec === "eac3");
24394
+ let streamType;
24395
+ let streamId;
24396
+ switch (codec) {
24397
+ case "aac":
24398
+ {
24399
+ streamType = 15 /* AAC */;
24400
+ streamId = AUDIO_STREAM_ID_BASE + this.audioTrackIndex++;
24401
+ }
24402
+ ;
24403
+ break;
24404
+ case "mp3":
24405
+ {
24406
+ streamType = 3 /* MP3_MPEG1 */;
24407
+ streamId = AUDIO_STREAM_ID_BASE + this.audioTrackIndex++;
24408
+ }
24409
+ ;
24410
+ break;
24411
+ case "ac3":
24412
+ {
24413
+ streamType = 129 /* AC3_SYSTEM_A */;
24414
+ streamId = 189;
24415
+ }
24416
+ ;
24417
+ break;
24418
+ case "eac3":
24419
+ {
24420
+ streamType = 135 /* EAC3_SYSTEM_A */;
24421
+ streamId = 189;
24422
+ }
24423
+ ;
24424
+ break;
24425
+ }
23811
24426
  const pid = FIRST_TRACK_PID + this.trackDatas.length;
23812
- const streamId = AUDIO_STREAM_ID_BASE + this.audioTrackIndex++;
23813
24427
  const newTrackData = {
23814
24428
  track,
23815
24429
  pid,
@@ -23958,7 +24572,7 @@ ${cue.notes ?? ""}`;
23958
24572
  }
23959
24573
  prepareAudioPacket(trackData, packet, meta) {
23960
24574
  const codec = trackData.track.source._codec;
23961
- if (codec === "mp3") {
24575
+ if (codec === "mp3" || codec === "ac3" || codec === "eac3") {
23962
24576
  return packet.data;
23963
24577
  }
23964
24578
  if (trackData.inputIsAdts === null) {
@@ -24186,7 +24800,16 @@ ${cue.notes ?? ""}`;
24186
24800
  view2.setUint32(12, computeMpegTsCrc32(PAT_SECTION.subarray(0, 12)), false);
24187
24801
  }
24188
24802
  var buildPmt = (trackDatas) => {
24189
- const sectionLength = 9 + trackDatas.length * 5 + 4;
24803
+ let totalEsBytes = 0;
24804
+ for (const trackData of trackDatas) {
24805
+ totalEsBytes += 5;
24806
+ if (trackData.streamType === 129 /* AC3_SYSTEM_A */) {
24807
+ totalEsBytes += AC3_REGISTRATION_DESCRIPTOR.length;
24808
+ } else if (trackData.streamType === 135 /* EAC3_SYSTEM_A */) {
24809
+ totalEsBytes += EAC3_REGISTRATION_DESCRIPTOR.length;
24810
+ }
24811
+ }
24812
+ const sectionLength = 9 + totalEsBytes + 4;
24190
24813
  const section = new Uint8Array(3 + sectionLength - 4);
24191
24814
  const view2 = toDataView(section);
24192
24815
  section[0] = 2;
@@ -24202,8 +24825,20 @@ ${cue.notes ?? ""}`;
24202
24825
  section[offset++] = trackData.streamType;
24203
24826
  view2.setUint16(offset, 57344 | trackData.pid & 8191, false);
24204
24827
  offset += 2;
24205
- view2.setUint16(offset, 61440, false);
24206
- offset += 2;
24828
+ if (trackData.streamType === 129 /* AC3_SYSTEM_A */) {
24829
+ view2.setUint16(offset, 61440 | AC3_REGISTRATION_DESCRIPTOR.length, false);
24830
+ offset += 2;
24831
+ section.set(AC3_REGISTRATION_DESCRIPTOR, offset);
24832
+ offset += AC3_REGISTRATION_DESCRIPTOR.length;
24833
+ } else if (trackData.streamType === 135 /* EAC3_SYSTEM_A */) {
24834
+ view2.setUint16(offset, 61440 | EAC3_REGISTRATION_DESCRIPTOR.length, false);
24835
+ offset += 2;
24836
+ section.set(EAC3_REGISTRATION_DESCRIPTOR, offset);
24837
+ offset += EAC3_REGISTRATION_DESCRIPTOR.length;
24838
+ } else {
24839
+ view2.setUint16(offset, 61440, false);
24840
+ offset += 2;
24841
+ }
24207
24842
  }
24208
24843
  const crc = computeMpegTsCrc32(section);
24209
24844
  const result = new Uint8Array(section.length + 4);
@@ -24581,6 +25216,9 @@ ${cue.notes ?? ""}`;
24581
25216
  get supportsVideoRotationMetadata() {
24582
25217
  return true;
24583
25218
  }
25219
+ get supportsTimestampedMediaData() {
25220
+ return true;
25221
+ }
24584
25222
  /** @internal */
24585
25223
  _createMuxer(output) {
24586
25224
  return new IsobmffMuxer2(output, this);
@@ -24605,7 +25243,7 @@ ${cue.notes ?? ""}`;
24605
25243
  return [
24606
25244
  ...VIDEO_CODECS,
24607
25245
  ...NON_PCM_AUDIO_CODECS,
24608
- // These are supported via ISO/IEC 23003-5
25246
+ // These are supported via ISO/IEC 23003-5:
24609
25247
  "pcm-s16",
24610
25248
  "pcm-s16be",
24611
25249
  "pcm-s24",
@@ -24714,6 +25352,9 @@ ${cue.notes ?? ""}`;
24714
25352
  get supportsVideoRotationMetadata() {
24715
25353
  return false;
24716
25354
  }
25355
+ get supportsTimestampedMediaData() {
25356
+ return true;
25357
+ }
24717
25358
  };
24718
25359
  var WebMOutputFormat = class extends MkvOutputFormat2 {
24719
25360
  /** Creates a new {@link WebMOutputFormat} configured with the specified `options`. */
@@ -24788,6 +25429,9 @@ ${cue.notes ?? ""}`;
24788
25429
  get supportsVideoRotationMetadata() {
24789
25430
  return false;
24790
25431
  }
25432
+ get supportsTimestampedMediaData() {
25433
+ return false;
25434
+ }
24791
25435
  };
24792
25436
  var WavOutputFormat = class extends OutputFormat {
24793
25437
  /** Creates a new {@link WavOutputFormat} configured with the specified `options`. */
@@ -24839,6 +25483,9 @@ ${cue.notes ?? ""}`;
24839
25483
  get supportsVideoRotationMetadata() {
24840
25484
  return false;
24841
25485
  }
25486
+ get supportsTimestampedMediaData() {
25487
+ return false;
25488
+ }
24842
25489
  };
24843
25490
  var OggOutputFormat = class extends OutputFormat {
24844
25491
  /** Creates a new {@link OggOutputFormat} configured with the specified `options`. */
@@ -24886,6 +25533,9 @@ ${cue.notes ?? ""}`;
24886
25533
  get supportsVideoRotationMetadata() {
24887
25534
  return false;
24888
25535
  }
25536
+ get supportsTimestampedMediaData() {
25537
+ return false;
25538
+ }
24889
25539
  };
24890
25540
  var AdtsOutputFormat = class extends OutputFormat {
24891
25541
  /** Creates a new {@link AdtsOutputFormat} configured with the specified `options`. */
@@ -24927,6 +25577,9 @@ ${cue.notes ?? ""}`;
24927
25577
  get supportsVideoRotationMetadata() {
24928
25578
  return false;
24929
25579
  }
25580
+ get supportsTimestampedMediaData() {
25581
+ return false;
25582
+ }
24930
25583
  };
24931
25584
  var FlacOutputFormat = class extends OutputFormat {
24932
25585
  /** Creates a new {@link FlacOutputFormat} configured with the specified `options`. */
@@ -24965,6 +25618,9 @@ ${cue.notes ?? ""}`;
24965
25618
  get supportsVideoRotationMetadata() {
24966
25619
  return false;
24967
25620
  }
25621
+ get supportsTimestampedMediaData() {
25622
+ return false;
25623
+ }
24968
25624
  };
24969
25625
  var MpegTsOutputFormat = class extends OutputFormat {
24970
25626
  /** Creates a new {@link MpegTsOutputFormat} configured with the specified `options`. */
@@ -25006,12 +25662,15 @@ ${cue.notes ?? ""}`;
25006
25662
  getSupportedCodecs() {
25007
25663
  return [
25008
25664
  ...VIDEO_CODECS.filter((codec) => ["avc", "hevc"].includes(codec)),
25009
- ...AUDIO_CODECS.filter((codec) => ["aac", "mp3"].includes(codec))
25665
+ ...AUDIO_CODECS.filter((codec) => ["aac", "mp3", "ac3", "eac3"].includes(codec))
25010
25666
  ];
25011
25667
  }
25012
25668
  get supportsVideoRotationMetadata() {
25013
25669
  return false;
25014
25670
  }
25671
+ get supportsTimestampedMediaData() {
25672
+ return true;
25673
+ }
25015
25674
  };
25016
25675
 
25017
25676
  // src/encode.ts
@@ -25188,8 +25847,12 @@ ${cue.notes ?? ""}`;
25188
25847
  // 64kbps base for Opus
25189
25848
  mp3: 16e4,
25190
25849
  // 160kbps base for MP3
25191
- vorbis: 64e3
25850
+ vorbis: 64e3,
25192
25851
  // 64kbps base for Vorbis
25852
+ ac3: 384e3,
25853
+ // 384kbps base for AC-3
25854
+ eac3: 192e3
25855
+ // 192kbps base for E-AC-3
25193
25856
  };
25194
25857
  const baseBitrate = baseRates[codec];
25195
25858
  if (!baseBitrate) {
@@ -25567,7 +26230,6 @@ ${cue.notes ?? ""}`;
25567
26230
  * So, we keep track of the encoder error and throw it as soon as we get the chance.
25568
26231
  */
25569
26232
  this.error = null;
25570
- this.errorNeedsNewStack = true;
25571
26233
  }
25572
26234
  async add(videoSample, shouldClose, encodeOptions) {
25573
26235
  try {
@@ -25698,7 +26360,6 @@ ${cue.notes ?? ""}`;
25698
26360
  }
25699
26361
  }
25700
26362
  ensureEncoder(videoSample) {
25701
- const encoderError = new Error();
25702
26363
  this.ensureEncoderPromise = (async () => {
25703
26364
  const encoderConfig = buildVideoEncoderConfig({
25704
26365
  width: videoSample.codedWidth,
@@ -25725,7 +26386,6 @@ ${cue.notes ?? ""}`;
25725
26386
  this.encodingConfig.onEncodedPacket?.(packet, meta);
25726
26387
  void this.muxer.addEncodedVideoPacket(this.source._connectedTrack, packet, meta).catch((error) => {
25727
26388
  this.error ??= error;
25728
- this.errorNeedsNewStack = false;
25729
26389
  });
25730
26390
  };
25731
26391
  await this.customEncoder.init();
@@ -25764,9 +26424,9 @@ ${cue.notes ?? ""}`;
25764
26424
  this.encodingConfig.onEncodedPacket?.(packet, meta);
25765
26425
  void this.muxer.addEncodedVideoPacket(this.source._connectedTrack, packet, meta).catch((error) => {
25766
26426
  this.error ??= error;
25767
- this.errorNeedsNewStack = false;
25768
26427
  });
25769
26428
  };
26429
+ const stack = new Error("Encoding error").stack;
25770
26430
  this.encoder = new VideoEncoder({
25771
26431
  output: (chunk, meta) => {
25772
26432
  if (!this.alphaEncoder) {
@@ -25795,12 +26455,13 @@ ${cue.notes ?? ""}`;
25795
26455
  }
25796
26456
  },
25797
26457
  error: (error) => {
25798
- error.stack = encoderError.stack;
26458
+ error.stack = stack;
25799
26459
  this.error ??= error;
25800
26460
  }
25801
26461
  });
25802
26462
  this.encoder.configure(encoderConfig);
25803
26463
  if (this.encodingConfig.alpha === "keep") {
26464
+ const stack2 = new Error("Encoding error").stack;
25804
26465
  this.alphaEncoder = new VideoEncoder({
25805
26466
  // We ignore the alpha chunk's metadata
25806
26467
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -25818,7 +26479,7 @@ ${cue.notes ?? ""}`;
25818
26479
  }
25819
26480
  },
25820
26481
  error: (error) => {
25821
- error.stack = encoderError.stack;
26482
+ error.stack = stack2;
25822
26483
  this.error ??= error;
25823
26484
  }
25824
26485
  });
@@ -25862,9 +26523,6 @@ ${cue.notes ?? ""}`;
25862
26523
  }
25863
26524
  checkForEncoderError() {
25864
26525
  if (this.error) {
25865
- if (this.errorNeedsNewStack) {
25866
- this.error.stack = new Error().stack;
25867
- }
25868
26526
  throw this.error;
25869
26527
  }
25870
26528
  }
@@ -26391,7 +27049,6 @@ ${cue.notes ?? ""}`;
26391
27049
  * So, we keep track of the encoder error and throw it as soon as we get the chance.
26392
27050
  */
26393
27051
  this.error = null;
26394
- this.errorNeedsNewStack = true;
26395
27052
  }
26396
27053
  async add(audioSample, shouldClose) {
26397
27054
  try {
@@ -26525,7 +27182,6 @@ ${cue.notes ?? ""}`;
26525
27182
  }
26526
27183
  }
26527
27184
  ensureEncoder(audioSample) {
26528
- const encoderError = new Error();
26529
27185
  this.ensureEncoderPromise = (async () => {
26530
27186
  const { numberOfChannels, sampleRate } = audioSample;
26531
27187
  const encoderConfig = buildAudioEncoderConfig({
@@ -26552,7 +27208,6 @@ ${cue.notes ?? ""}`;
26552
27208
  this.encodingConfig.onEncodedPacket?.(packet, meta);
26553
27209
  void this.muxer.addEncodedAudioPacket(this.source._connectedTrack, packet, meta).catch((error) => {
26554
27210
  this.error ??= error;
26555
- this.errorNeedsNewStack = false;
26556
27211
  });
26557
27212
  };
26558
27213
  await this.customEncoder.init();
@@ -26568,6 +27223,7 @@ ${cue.notes ?? ""}`;
26568
27223
  `This specific encoder configuration (${encoderConfig.codec}, ${encoderConfig.bitrate} bps, ${encoderConfig.numberOfChannels} channels, ${encoderConfig.sampleRate} Hz) is not supported by this browser. Consider using another codec or changing your audio parameters.`
26569
27224
  );
26570
27225
  }
27226
+ const stack = new Error("Encoding error").stack;
26571
27227
  this.encoder = new AudioEncoder({
26572
27228
  output: (chunk, meta) => {
26573
27229
  if (this.encodingConfig.codec === "aac" && meta?.decoderConfig) {
@@ -26593,11 +27249,10 @@ ${cue.notes ?? ""}`;
26593
27249
  this.encodingConfig.onEncodedPacket?.(packet, meta);
26594
27250
  void this.muxer.addEncodedAudioPacket(this.source._connectedTrack, packet, meta).catch((error) => {
26595
27251
  this.error ??= error;
26596
- this.errorNeedsNewStack = false;
26597
27252
  });
26598
27253
  },
26599
27254
  error: (error) => {
26600
- error.stack = encoderError.stack;
27255
+ error.stack = stack;
26601
27256
  this.error ??= error;
26602
27257
  }
26603
27258
  });
@@ -26731,9 +27386,6 @@ ${cue.notes ?? ""}`;
26731
27386
  }
26732
27387
  checkForEncoderError() {
26733
27388
  if (this.error) {
26734
- if (this.errorNeedsNewStack) {
26735
- this.error.stack = new Error().stack;
26736
- }
26737
27389
  throw this.error;
26738
27390
  }
26739
27391
  }
@@ -27561,11 +28213,11 @@ ${cue.notes ?? ""}`;
27561
28213
  if (options.trim !== void 0 && (!options.trim || typeof options.trim !== "object")) {
27562
28214
  throw new TypeError("options.trim, when provided, must be an object.");
27563
28215
  }
27564
- if (options.trim?.start !== void 0 && (!Number.isFinite(options.trim.start) || options.trim.start < 0)) {
27565
- throw new TypeError("options.trim.start, when provided, must be a non-negative number.");
28216
+ if (options.trim?.start !== void 0 && !Number.isFinite(options.trim.start)) {
28217
+ throw new TypeError("options.trim.start, when provided, must be a finite number.");
27566
28218
  }
27567
- if (options.trim?.end !== void 0 && (!Number.isFinite(options.trim.end) || options.trim.end < 0)) {
27568
- throw new TypeError("options.trim.end, when provided, must be a non-negative number.");
28219
+ if (options.trim?.end !== void 0 && !Number.isFinite(options.trim.end)) {
28220
+ throw new TypeError("options.trim.end, when provided, must be a finite number.");
27569
28221
  }
27570
28222
  if (options.trim?.start !== void 0 && options.trim.end !== void 0 && options.trim.start >= options.trim.end) {
27571
28223
  throw new TypeError("options.trim.start must be less than options.trim.end.");
@@ -27600,7 +28252,7 @@ ${cue.notes ?? ""}`;
27600
28252
  // those out by default.
27601
28253
  0
27602
28254
  );
27603
- this._endTimestamp = this._options.trim?.end ?? Infinity;
28255
+ this._endTimestamp = Math.max(this._options.trim?.end ?? Infinity, this._startTimestamp);
27604
28256
  const inputTracks = await this.input.getTracks();
27605
28257
  const outputTrackCounts = this.output.format.getSupportedTrackCounts();
27606
28258
  let nVideo = 1;
@@ -27732,6 +28384,11 @@ Tracks were discarded because your environment is not able to encode any of the
27732
28384
  The @mediabunny/mp3-encoder extension package provides support for encoding MP3.`
27733
28385
  );
27734
28386
  }
28387
+ if (codecs.includes("ac3") || codecs.includes("eac3")) {
28388
+ elements.push(
28389
+ "\nThe @mediabunny/ac3 extension package provides support for encoding and decoding AC-3/E-AC-3."
28390
+ );
28391
+ }
27735
28392
  } else {
27736
28393
  elements.push("\nCheck the discardedTracks field for more info.");
27737
28394
  }
@@ -28126,7 +28783,7 @@ The @mediabunny/mp3-encoder extension package provides support for encoding MP3.
28126
28783
  const firstTimestamp = await track.getFirstTimestamp();
28127
28784
  let numberOfChannels = trackOptions.numberOfChannels ?? originalNumberOfChannels;
28128
28785
  let sampleRate = trackOptions.sampleRate ?? originalSampleRate;
28129
- let needsResample = numberOfChannels !== originalNumberOfChannels || sampleRate !== originalSampleRate || firstTimestamp < this._startTimestamp;
28786
+ let needsResample = numberOfChannels !== originalNumberOfChannels || sampleRate !== originalSampleRate || firstTimestamp < this._startTimestamp || firstTimestamp > this._startTimestamp && !this.output.format.supportsTimestampedMediaData;
28130
28787
  let audioCodecs = this.output.format.getSupportedAudioCodecs();
28131
28788
  if (!trackOptions.forceTranscode && !trackOptions.bitrate && !needsResample && audioCodecs.includes(sourceCodec) && (!trackOptions.codec || trackOptions.codec === sourceCodec) && !trackOptions.process) {
28132
28789
  const source = new EncodedAudioPacketSource(sourceCodec);