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.
- package/dist/bundles/mediabunny.cjs +697 -40
- package/dist/bundles/mediabunny.min.cjs +10 -9
- package/dist/bundles/mediabunny.min.mjs +10 -9
- package/dist/bundles/mediabunny.mjs +697 -40
- package/dist/mediabunny.d.ts +27 -6
- package/dist/modules/shared/ac3-misc.d.ts +12 -0
- package/dist/modules/shared/ac3-misc.d.ts.map +1 -0
- package/dist/modules/shared/ac3-misc.js +11 -0
- package/dist/modules/src/adts/adts-muxer.d.ts.map +1 -1
- package/dist/modules/src/adts/adts-muxer.js +1 -4
- package/dist/modules/src/codec-data.d.ts +92 -0
- package/dist/modules/src/codec-data.d.ts.map +1 -1
- package/dist/modules/src/codec-data.js +263 -0
- package/dist/modules/src/codec.d.ts +3 -3
- package/dist/modules/src/codec.d.ts.map +1 -1
- package/dist/modules/src/codec.js +37 -3
- package/dist/modules/src/conversion.d.ts.map +1 -1
- package/dist/modules/src/conversion.js +11 -6
- package/dist/modules/src/encode.d.ts +2 -2
- package/dist/modules/src/encode.d.ts.map +1 -1
- package/dist/modules/src/encode.js +2 -0
- package/dist/modules/src/isobmff/isobmff-boxes.d.ts.map +1 -1
- package/dist/modules/src/isobmff/isobmff-boxes.js +66 -2
- package/dist/modules/src/isobmff/isobmff-demuxer.d.ts.map +1 -1
- package/dist/modules/src/isobmff/isobmff-demuxer.js +49 -1
- package/dist/modules/src/isobmff/isobmff-muxer.d.ts +1 -0
- package/dist/modules/src/isobmff/isobmff-muxer.d.ts.map +1 -1
- package/dist/modules/src/isobmff/isobmff-muxer.js +2 -1
- package/dist/modules/src/matroska/ebml.d.ts.map +1 -1
- package/dist/modules/src/matroska/ebml.js +2 -0
- package/dist/modules/src/matroska/matroska-demuxer.d.ts.map +1 -1
- package/dist/modules/src/matroska/matroska-demuxer.js +8 -0
- package/dist/modules/src/media-source.d.ts.map +1 -1
- package/dist/modules/src/media-source.js +6 -17
- package/dist/modules/src/mpeg-ts/mpeg-ts-demuxer.d.ts.map +1 -1
- package/dist/modules/src/mpeg-ts/mpeg-ts-demuxer.js +157 -2
- package/dist/modules/src/mpeg-ts/mpeg-ts-misc.d.ts +3 -0
- package/dist/modules/src/mpeg-ts/mpeg-ts-misc.d.ts.map +1 -1
- package/dist/modules/src/mpeg-ts/mpeg-ts-muxer.d.ts.map +1 -1
- package/dist/modules/src/mpeg-ts/mpeg-ts-muxer.js +62 -8
- package/dist/modules/src/output-format.d.ts +15 -0
- package/dist/modules/src/output-format.d.ts.map +1 -1
- package/dist/modules/src/output-format.js +26 -2
- package/dist/modules/src/packet.d.ts +8 -2
- package/dist/modules/src/packet.d.ts.map +1 -1
- package/dist/modules/src/packet.js +4 -1
- package/dist/modules/src/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -7
- package/src/adts/adts-muxer.ts +1 -4
- package/src/codec-data.ts +359 -0
- package/src/codec.ts +31 -3
- package/src/conversion.ts +14 -6
- package/src/encode.ts +4 -2
- package/src/isobmff/isobmff-boxes.ts +79 -1
- package/src/isobmff/isobmff-demuxer.ts +54 -0
- package/src/isobmff/isobmff-muxer.ts +3 -1
- package/src/matroska/ebml.ts +2 -0
- package/src/matroska/matroska-demuxer.ts +6 -0
- package/src/media-source.ts +9 -19
- package/src/mpeg-ts/mpeg-ts-demuxer.ts +186 -1
- package/src/mpeg-ts/mpeg-ts-misc.ts +3 -0
- package/src/mpeg-ts/mpeg-ts-muxer.ts +56 -7
- package/src/output-format.ts +43 -2
- 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
|
|
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 = [
|
|
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
|
|
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.
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24206
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 &&
|
|
27565
|
-
throw new TypeError("options.trim.start, when provided, must be a
|
|
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 &&
|
|
27568
|
-
throw new TypeError("options.trim.end, when provided, must be a
|
|
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);
|