File: /home/dmstechonline/whatsapp.dmstech.online/node_modules/.vite/deps/mic-recorder-to-mp3.js
import {
__commonJS
} from "./chunk-ROME4SDB.js";
// node_modules/mic-recorder-to-mp3/dist/index.js
var require_dist = __commonJS({
"node_modules/mic-recorder-to-mp3/dist/index.js"(exports, module) {
(function(global, factory) {
typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.MicRecorder = factory();
})(exports, function() {
function new_byte$1(count) {
return new Int8Array(count);
}
function new_short(count) {
return new Int16Array(count);
}
function new_int$1(count) {
return new Int32Array(count);
}
function new_float$1(count) {
return new Float32Array(count);
}
function new_double$1(count) {
return new Float64Array(count);
}
function new_float_n$1(args) {
if (args.length == 1) {
return new_float$1(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_float_n$1(args));
}
return A;
}
function new_int_n$1(args) {
if (args.length == 1) {
return new_int$1(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_int_n$1(args));
}
return A;
}
function new_short_n(args) {
if (args.length == 1) {
return new_short(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_short_n(args));
}
return A;
}
function new_array_n$1(args) {
if (args.length == 1) {
return new Array(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_array_n$1(args));
}
return A;
}
var Arrays$1 = {};
Arrays$1.fill = function(a, fromIndex, toIndex, val) {
if (arguments.length == 2) {
for (var i = 0; i < a.length; i++) {
a[i] = arguments[1];
}
} else {
for (var i = fromIndex; i < toIndex; i++) {
a[i] = val;
}
}
};
var System$1 = {};
System$1.arraycopy = function(src, srcPos, dest, destPos, length) {
var srcEnd = srcPos + length;
while (srcPos < srcEnd)
dest[destPos++] = src[srcPos++];
};
var Util$1 = {};
Util$1.SQRT2 = 1.4142135623730951;
Util$1.FAST_LOG10 = function(x) {
return Math.log10(x);
};
Util$1.FAST_LOG10_X = function(x, y) {
return Math.log10(x) * y;
};
function ShortBlock$1(ordinal) {
this.ordinal = ordinal;
}
ShortBlock$1.short_block_allowed = new ShortBlock$1(0);
ShortBlock$1.short_block_coupled = new ShortBlock$1(1);
ShortBlock$1.short_block_dispensed = new ShortBlock$1(2);
ShortBlock$1.short_block_forced = new ShortBlock$1(3);
var Float$1 = {};
Float$1.MAX_VALUE = 34028235e31;
function VbrMode$1(ordinal) {
this.ordinal = ordinal;
}
VbrMode$1.vbr_off = new VbrMode$1(0);
VbrMode$1.vbr_mt = new VbrMode$1(1);
VbrMode$1.vbr_rh = new VbrMode$1(2);
VbrMode$1.vbr_abr = new VbrMode$1(3);
VbrMode$1.vbr_mtrh = new VbrMode$1(4);
VbrMode$1.vbr_default = VbrMode$1.vbr_mtrh;
var assert$1 = function(x) {
};
var common = {
"System": System$1,
"VbrMode": VbrMode$1,
"Float": Float$1,
"ShortBlock": ShortBlock$1,
"Util": Util$1,
"Arrays": Arrays$1,
"new_array_n": new_array_n$1,
"new_byte": new_byte$1,
"new_double": new_double$1,
"new_float": new_float$1,
"new_float_n": new_float_n$1,
"new_int": new_int$1,
"new_int_n": new_int_n$1,
"new_short": new_short,
"new_short_n": new_short_n,
"assert": assert$1
};
var System$6 = common.System;
var Util$6 = common.Util;
var Arrays$6 = common.Arrays;
var new_float$6 = common.new_float;
function NewMDCT() {
var enwindow = [
-477e-9 * 0.740951125354959 / 2384e-9,
103951e-9 * 0.740951125354959 / 2384e-9,
953674e-9 * 0.740951125354959 / 2384e-9,
2841473e-9 * 0.740951125354959 / 2384e-9,
0.035758972 * 0.740951125354959 / 2384e-9,
3401756e-9 * 0.740951125354959 / 2384e-9,
983715e-9 * 0.740951125354959 / 2384e-9,
99182e-9 * 0.740951125354959 / 2384e-9,
/* 15 */
12398e-9 * 0.740951125354959 / 2384e-9,
191212e-9 * 0.740951125354959 / 2384e-9,
2283096e-9 * 0.740951125354959 / 2384e-9,
0.016994476 * 0.740951125354959 / 2384e-9,
-0.018756866 * 0.740951125354959 / 2384e-9,
-2630711e-9 * 0.740951125354959 / 2384e-9,
-247478e-9 * 0.740951125354959 / 2384e-9,
-14782e-9 * 0.740951125354959 / 2384e-9,
0.9063471690191471,
0.1960342806591213,
-477e-9 * 0.773010453362737 / 2384e-9,
105858e-9 * 0.773010453362737 / 2384e-9,
930786e-9 * 0.773010453362737 / 2384e-9,
2521515e-9 * 0.773010453362737 / 2384e-9,
0.035694122 * 0.773010453362737 / 2384e-9,
3643036e-9 * 0.773010453362737 / 2384e-9,
991821e-9 * 0.773010453362737 / 2384e-9,
96321e-9 * 0.773010453362737 / 2384e-9,
/* 14 */
11444e-9 * 0.773010453362737 / 2384e-9,
165462e-9 * 0.773010453362737 / 2384e-9,
2110004e-9 * 0.773010453362737 / 2384e-9,
0.016112804 * 0.773010453362737 / 2384e-9,
-0.019634247 * 0.773010453362737 / 2384e-9,
-2803326e-9 * 0.773010453362737 / 2384e-9,
-277042e-9 * 0.773010453362737 / 2384e-9,
-16689e-9 * 0.773010453362737 / 2384e-9,
0.8206787908286602,
0.3901806440322567,
-477e-9 * 0.803207531480645 / 2384e-9,
107288e-9 * 0.803207531480645 / 2384e-9,
902653e-9 * 0.803207531480645 / 2384e-9,
2174854e-9 * 0.803207531480645 / 2384e-9,
0.035586357 * 0.803207531480645 / 2384e-9,
3858566e-9 * 0.803207531480645 / 2384e-9,
995159e-9 * 0.803207531480645 / 2384e-9,
9346e-8 * 0.803207531480645 / 2384e-9,
/* 13 */
10014e-9 * 0.803207531480645 / 2384e-9,
14019e-8 * 0.803207531480645 / 2384e-9,
1937389e-9 * 0.803207531480645 / 2384e-9,
0.015233517 * 0.803207531480645 / 2384e-9,
-0.020506859 * 0.803207531480645 / 2384e-9,
-2974033e-9 * 0.803207531480645 / 2384e-9,
-30756e-8 * 0.803207531480645 / 2384e-9,
-1812e-8 * 0.803207531480645 / 2384e-9,
0.7416505462720353,
0.5805693545089249,
-477e-9 * 0.831469612302545 / 2384e-9,
108242e-9 * 0.831469612302545 / 2384e-9,
868797e-9 * 0.831469612302545 / 2384e-9,
1800537e-9 * 0.831469612302545 / 2384e-9,
0.0354352 * 0.831469612302545 / 2384e-9,
4049301e-9 * 0.831469612302545 / 2384e-9,
994205e-9 * 0.831469612302545 / 2384e-9,
90599e-9 * 0.831469612302545 / 2384e-9,
/* 12 */
906e-8 * 0.831469612302545 / 2384e-9,
116348e-9 * 0.831469612302545 / 2384e-9,
1766682e-9 * 0.831469612302545 / 2384e-9,
0.014358521 * 0.831469612302545 / 2384e-9,
-0.021372318 * 0.831469612302545 / 2384e-9,
-314188e-8 * 0.831469612302545 / 2384e-9,
-339031e-9 * 0.831469612302545 / 2384e-9,
-1955e-8 * 0.831469612302545 / 2384e-9,
0.6681786379192989,
0.7653668647301797,
-477e-9 * 0.857728610000272 / 2384e-9,
108719e-9 * 0.857728610000272 / 2384e-9,
82922e-8 * 0.857728610000272 / 2384e-9,
1399517e-9 * 0.857728610000272 / 2384e-9,
0.035242081 * 0.857728610000272 / 2384e-9,
421524e-8 * 0.857728610000272 / 2384e-9,
989437e-9 * 0.857728610000272 / 2384e-9,
87261e-9 * 0.857728610000272 / 2384e-9,
/* 11 */
8106e-9 * 0.857728610000272 / 2384e-9,
93937e-9 * 0.857728610000272 / 2384e-9,
1597881e-9 * 0.857728610000272 / 2384e-9,
0.013489246 * 0.857728610000272 / 2384e-9,
-0.022228718 * 0.857728610000272 / 2384e-9,
-3306866e-9 * 0.857728610000272 / 2384e-9,
-371456e-9 * 0.857728610000272 / 2384e-9,
-21458e-9 * 0.857728610000272 / 2384e-9,
0.5993769336819237,
0.9427934736519954,
-477e-9 * 0.881921264348355 / 2384e-9,
108719e-9 * 0.881921264348355 / 2384e-9,
78392e-8 * 0.881921264348355 / 2384e-9,
971317e-9 * 0.881921264348355 / 2384e-9,
0.035007 * 0.881921264348355 / 2384e-9,
4357815e-9 * 0.881921264348355 / 2384e-9,
980854e-9 * 0.881921264348355 / 2384e-9,
83923e-9 * 0.881921264348355 / 2384e-9,
/* 10 */
7629e-9 * 0.881921264348355 / 2384e-9,
72956e-9 * 0.881921264348355 / 2384e-9,
1432419e-9 * 0.881921264348355 / 2384e-9,
0.012627602 * 0.881921264348355 / 2384e-9,
-0.02307415 * 0.881921264348355 / 2384e-9,
-3467083e-9 * 0.881921264348355 / 2384e-9,
-404358e-9 * 0.881921264348355 / 2384e-9,
-23365e-9 * 0.881921264348355 / 2384e-9,
0.5345111359507916,
1.111140466039205,
-954e-9 * 0.903989293123443 / 2384e-9,
108242e-9 * 0.903989293123443 / 2384e-9,
731945e-9 * 0.903989293123443 / 2384e-9,
515938e-9 * 0.903989293123443 / 2384e-9,
0.034730434 * 0.903989293123443 / 2384e-9,
4477024e-9 * 0.903989293123443 / 2384e-9,
968933e-9 * 0.903989293123443 / 2384e-9,
80585e-9 * 0.903989293123443 / 2384e-9,
/* 9 */
6676e-9 * 0.903989293123443 / 2384e-9,
52929e-9 * 0.903989293123443 / 2384e-9,
1269817e-9 * 0.903989293123443 / 2384e-9,
0.011775017 * 0.903989293123443 / 2384e-9,
-0.023907185 * 0.903989293123443 / 2384e-9,
-3622532e-9 * 0.903989293123443 / 2384e-9,
-438213e-9 * 0.903989293123443 / 2384e-9,
-25272e-9 * 0.903989293123443 / 2384e-9,
0.4729647758913199,
1.268786568327291,
-954e-9 * 0.9238795325112867 / 2384e-9,
106812e-9 * 0.9238795325112867 / 2384e-9,
674248e-9 * 0.9238795325112867 / 2384e-9,
33379e-9 * 0.9238795325112867 / 2384e-9,
0.034412861 * 0.9238795325112867 / 2384e-9,
4573822e-9 * 0.9238795325112867 / 2384e-9,
954151e-9 * 0.9238795325112867 / 2384e-9,
76771e-9 * 0.9238795325112867 / 2384e-9,
6199e-9 * 0.9238795325112867 / 2384e-9,
34332e-9 * 0.9238795325112867 / 2384e-9,
1111031e-9 * 0.9238795325112867 / 2384e-9,
0.010933399 * 0.9238795325112867 / 2384e-9,
-0.024725437 * 0.9238795325112867 / 2384e-9,
-3771782e-9 * 0.9238795325112867 / 2384e-9,
-472546e-9 * 0.9238795325112867 / 2384e-9,
-27657e-9 * 0.9238795325112867 / 2384e-9,
0.41421356237309503,
/* tan(PI/8) */
1.414213562373095,
-954e-9 * 0.941544065183021 / 2384e-9,
105381e-9 * 0.941544065183021 / 2384e-9,
610352e-9 * 0.941544065183021 / 2384e-9,
-475883e-9 * 0.941544065183021 / 2384e-9,
0.03405571 * 0.941544065183021 / 2384e-9,
4649162e-9 * 0.941544065183021 / 2384e-9,
935555e-9 * 0.941544065183021 / 2384e-9,
73433e-9 * 0.941544065183021 / 2384e-9,
/* 7 */
5245e-9 * 0.941544065183021 / 2384e-9,
17166e-9 * 0.941544065183021 / 2384e-9,
956535e-9 * 0.941544065183021 / 2384e-9,
0.010103703 * 0.941544065183021 / 2384e-9,
-0.025527 * 0.941544065183021 / 2384e-9,
-3914356e-9 * 0.941544065183021 / 2384e-9,
-507355e-9 * 0.941544065183021 / 2384e-9,
-30041e-9 * 0.941544065183021 / 2384e-9,
0.3578057213145241,
1.546020906725474,
-954e-9 * 0.956940335732209 / 2384e-9,
10252e-8 * 0.956940335732209 / 2384e-9,
539303e-9 * 0.956940335732209 / 2384e-9,
-1011848e-9 * 0.956940335732209 / 2384e-9,
0.033659935 * 0.956940335732209 / 2384e-9,
4703045e-9 * 0.956940335732209 / 2384e-9,
915051e-9 * 0.956940335732209 / 2384e-9,
70095e-9 * 0.956940335732209 / 2384e-9,
/* 6 */
4768e-9 * 0.956940335732209 / 2384e-9,
954e-9 * 0.956940335732209 / 2384e-9,
806808e-9 * 0.956940335732209 / 2384e-9,
9287834e-9 * 0.956940335732209 / 2384e-9,
-0.026310921 * 0.956940335732209 / 2384e-9,
-4048824e-9 * 0.956940335732209 / 2384e-9,
-542164e-9 * 0.956940335732209 / 2384e-9,
-32425e-9 * 0.956940335732209 / 2384e-9,
0.3033466836073424,
1.66293922460509,
-1431e-9 * 0.970031253194544 / 2384e-9,
99182e-9 * 0.970031253194544 / 2384e-9,
462532e-9 * 0.970031253194544 / 2384e-9,
-1573563e-9 * 0.970031253194544 / 2384e-9,
0.033225536 * 0.970031253194544 / 2384e-9,
4737377e-9 * 0.970031253194544 / 2384e-9,
891685e-9 * 0.970031253194544 / 2384e-9,
6628e-8 * 0.970031253194544 / 2384e-9,
/* 5 */
4292e-9 * 0.970031253194544 / 2384e-9,
-13828e-9 * 0.970031253194544 / 2384e-9,
66185e-8 * 0.970031253194544 / 2384e-9,
8487225e-9 * 0.970031253194544 / 2384e-9,
-0.02707386 * 0.970031253194544 / 2384e-9,
-4174709e-9 * 0.970031253194544 / 2384e-9,
-576973e-9 * 0.970031253194544 / 2384e-9,
-34809e-9 * 0.970031253194544 / 2384e-9,
0.2504869601913055,
1.76384252869671,
-1431e-9 * 0.98078528040323 / 2384e-9,
95367e-9 * 0.98078528040323 / 2384e-9,
378609e-9 * 0.98078528040323 / 2384e-9,
-2161503e-9 * 0.98078528040323 / 2384e-9,
0.032754898 * 0.98078528040323 / 2384e-9,
4752159e-9 * 0.98078528040323 / 2384e-9,
866413e-9 * 0.98078528040323 / 2384e-9,
62943e-9 * 0.98078528040323 / 2384e-9,
/* 4 */
3815e-9 * 0.98078528040323 / 2384e-9,
-2718e-8 * 0.98078528040323 / 2384e-9,
522137e-9 * 0.98078528040323 / 2384e-9,
7703304e-9 * 0.98078528040323 / 2384e-9,
-0.027815342 * 0.98078528040323 / 2384e-9,
-4290581e-9 * 0.98078528040323 / 2384e-9,
-611782e-9 * 0.98078528040323 / 2384e-9,
-3767e-8 * 0.98078528040323 / 2384e-9,
0.198912367379658,
1.847759065022573,
-1907e-9 * 0.989176509964781 / 2384e-9,
90122e-9 * 0.989176509964781 / 2384e-9,
288486e-9 * 0.989176509964781 / 2384e-9,
-2774239e-9 * 0.989176509964781 / 2384e-9,
0.03224802 * 0.989176509964781 / 2384e-9,
4748821e-9 * 0.989176509964781 / 2384e-9,
838757e-9 * 0.989176509964781 / 2384e-9,
59605e-9 * 0.989176509964781 / 2384e-9,
/* 3 */
3338e-9 * 0.989176509964781 / 2384e-9,
-39577e-9 * 0.989176509964781 / 2384e-9,
388145e-9 * 0.989176509964781 / 2384e-9,
6937027e-9 * 0.989176509964781 / 2384e-9,
-0.028532982 * 0.989176509964781 / 2384e-9,
-4395962e-9 * 0.989176509964781 / 2384e-9,
-646591e-9 * 0.989176509964781 / 2384e-9,
-40531e-9 * 0.989176509964781 / 2384e-9,
0.1483359875383474,
1.913880671464418,
-1907e-9 * 0.995184726672197 / 2384e-9,
844e-7 * 0.995184726672197 / 2384e-9,
191689e-9 * 0.995184726672197 / 2384e-9,
-3411293e-9 * 0.995184726672197 / 2384e-9,
0.03170681 * 0.995184726672197 / 2384e-9,
4728317e-9 * 0.995184726672197 / 2384e-9,
809669e-9 * 0.995184726672197 / 2384e-9,
5579e-8 * 0.995184726672197 / 2384e-9,
3338e-9 * 0.995184726672197 / 2384e-9,
-50545e-9 * 0.995184726672197 / 2384e-9,
259876e-9 * 0.995184726672197 / 2384e-9,
6189346e-9 * 0.995184726672197 / 2384e-9,
-0.029224873 * 0.995184726672197 / 2384e-9,
-4489899e-9 * 0.995184726672197 / 2384e-9,
-680923e-9 * 0.995184726672197 / 2384e-9,
-43392e-9 * 0.995184726672197 / 2384e-9,
0.09849140335716425,
1.961570560806461,
-2384e-9 * 0.998795456205172 / 2384e-9,
77724e-9 * 0.998795456205172 / 2384e-9,
88215e-9 * 0.998795456205172 / 2384e-9,
-4072189e-9 * 0.998795456205172 / 2384e-9,
0.031132698 * 0.998795456205172 / 2384e-9,
4691124e-9 * 0.998795456205172 / 2384e-9,
779152e-9 * 0.998795456205172 / 2384e-9,
52929e-9 * 0.998795456205172 / 2384e-9,
2861e-9 * 0.998795456205172 / 2384e-9,
-60558e-9 * 0.998795456205172 / 2384e-9,
137329e-9 * 0.998795456205172 / 2384e-9,
546217e-8 * 0.998795456205172 / 2384e-9,
-0.02989006 * 0.998795456205172 / 2384e-9,
-4570484e-9 * 0.998795456205172 / 2384e-9,
-714302e-9 * 0.998795456205172 / 2384e-9,
-46253e-9 * 0.998795456205172 / 2384e-9,
0.04912684976946725,
1.990369453344394,
0.035780907 * Util$6.SQRT2 * 0.5 / 2384e-9,
0.017876148 * Util$6.SQRT2 * 0.5 / 2384e-9,
3134727e-9 * Util$6.SQRT2 * 0.5 / 2384e-9,
2457142e-9 * Util$6.SQRT2 * 0.5 / 2384e-9,
971317e-9 * Util$6.SQRT2 * 0.5 / 2384e-9,
218868e-9 * Util$6.SQRT2 * 0.5 / 2384e-9,
101566e-9 * Util$6.SQRT2 * 0.5 / 2384e-9,
13828e-9 * Util$6.SQRT2 * 0.5 / 2384e-9,
0.030526638 / 2384e-9,
4638195e-9 / 2384e-9,
747204e-9 / 2384e-9,
49591e-9 / 2384e-9,
4756451e-9 / 2384e-9,
21458e-9 / 2384e-9,
-69618e-9 / 2384e-9
/* 2.384e-06/2.384e-06 */
];
var NS = 12;
var NL = 36;
var win = [
[
2382191739347913e-28,
6423305872147834e-28,
9400849094049688e-28,
1122435026096556e-27,
1183840321267481e-27,
1122435026096556e-27,
940084909404969e-27,
6423305872147839e-28,
2382191739347918e-28,
5456116108943412e-27,
4878985199565852e-27,
4240448995017367e-27,
3559909094758252e-27,
2858043359288075e-27,
2156177623817898e-27,
1475637723558783e-27,
8371015190102974e-28,
2599706096327376e-28,
-5456116108943412e-27,
-4878985199565852e-27,
-4240448995017367e-27,
-3559909094758252e-27,
-2858043359288076e-27,
-2156177623817898e-27,
-1475637723558783e-27,
-8371015190102975e-28,
-2599706096327376e-28,
-2382191739347923e-28,
-6423305872147843e-28,
-9400849094049696e-28,
-1122435026096556e-27,
-1183840321267481e-27,
-1122435026096556e-27,
-9400849094049694e-28,
-642330587214784e-27,
-2382191739347918e-28
],
[
2382191739347913e-28,
6423305872147834e-28,
9400849094049688e-28,
1122435026096556e-27,
1183840321267481e-27,
1122435026096556e-27,
9400849094049688e-28,
6423305872147841e-28,
2382191739347918e-28,
5456116108943413e-27,
4878985199565852e-27,
4240448995017367e-27,
3559909094758253e-27,
2858043359288075e-27,
2156177623817898e-27,
1475637723558782e-27,
8371015190102975e-28,
2599706096327376e-28,
-5461314069809755e-27,
-4921085770524055e-27,
-4343405037091838e-27,
-3732668368707687e-27,
-3093523840190885e-27,
-2430835727329465e-27,
-1734679010007751e-27,
-974825365660928e-27,
-2797435120168326e-28,
0,
0,
0,
0,
0,
0,
-2283748241799531e-28,
-4037858874020686e-28,
-2146547464825323e-28
],
[
0.1316524975873958,
/* win[SHORT_TYPE] */
0.414213562373095,
0.7673269879789602,
1.091308501069271,
/* tantab_l */
1.303225372841206,
1.56968557711749,
1.920982126971166,
2.414213562373094,
3.171594802363212,
4.510708503662055,
7.595754112725146,
22.90376554843115,
0.984807753012208,
/* cx */
0.6427876096865394,
0.3420201433256688,
0.9396926207859084,
-0.1736481776669303,
-0.7660444431189779,
0.8660254037844387,
0.5,
-0.5144957554275265,
/* ca */
-0.4717319685649723,
-0.3133774542039019,
-0.1819131996109812,
-0.09457419252642064,
-0.04096558288530405,
-0.01419856857247115,
-0.003699974673760037,
0.8574929257125442,
/* cs */
0.8817419973177052,
0.9496286491027329,
0.9833145924917901,
0.9955178160675857,
0.9991605581781475,
0.999899195244447,
0.9999931550702802
],
[
0,
0,
0,
0,
0,
0,
2283748241799531e-28,
4037858874020686e-28,
2146547464825323e-28,
5461314069809755e-27,
4921085770524055e-27,
4343405037091838e-27,
3732668368707687e-27,
3093523840190885e-27,
2430835727329466e-27,
1734679010007751e-27,
974825365660928e-27,
2797435120168326e-28,
-5456116108943413e-27,
-4878985199565852e-27,
-4240448995017367e-27,
-3559909094758253e-27,
-2858043359288075e-27,
-2156177623817898e-27,
-1475637723558782e-27,
-8371015190102975e-28,
-2599706096327376e-28,
-2382191739347913e-28,
-6423305872147834e-28,
-9400849094049688e-28,
-1122435026096556e-27,
-1183840321267481e-27,
-1122435026096556e-27,
-9400849094049688e-28,
-6423305872147841e-28,
-2382191739347918e-28
]
];
var tantab_l = win[Encoder_1.SHORT_TYPE];
var cx = win[Encoder_1.SHORT_TYPE];
var ca = win[Encoder_1.SHORT_TYPE];
var cs = win[Encoder_1.SHORT_TYPE];
var order = [
0,
1,
16,
17,
8,
9,
24,
25,
4,
5,
20,
21,
12,
13,
28,
29,
2,
3,
18,
19,
10,
11,
26,
27,
6,
7,
22,
23,
14,
15,
30,
31
];
function window_subband(x1, x1Pos, a) {
var wp = 10;
var x2 = x1Pos + 238 - 14 - 286;
for (var i = -15; i < 0; i++) {
var w, s, t;
w = enwindow[wp + -10];
s = x1[x2 + -224] * w;
t = x1[x1Pos + 224] * w;
w = enwindow[wp + -9];
s += x1[x2 + -160] * w;
t += x1[x1Pos + 160] * w;
w = enwindow[wp + -8];
s += x1[x2 + -96] * w;
t += x1[x1Pos + 96] * w;
w = enwindow[wp + -7];
s += x1[x2 + -32] * w;
t += x1[x1Pos + 32] * w;
w = enwindow[wp + -6];
s += x1[x2 + 32] * w;
t += x1[x1Pos + -32] * w;
w = enwindow[wp + -5];
s += x1[x2 + 96] * w;
t += x1[x1Pos + -96] * w;
w = enwindow[wp + -4];
s += x1[x2 + 160] * w;
t += x1[x1Pos + -160] * w;
w = enwindow[wp + -3];
s += x1[x2 + 224] * w;
t += x1[x1Pos + -224] * w;
w = enwindow[wp + -2];
s += x1[x1Pos + -256] * w;
t -= x1[x2 + 256] * w;
w = enwindow[wp + -1];
s += x1[x1Pos + -192] * w;
t -= x1[x2 + 192] * w;
w = enwindow[wp + 0];
s += x1[x1Pos + -128] * w;
t -= x1[x2 + 128] * w;
w = enwindow[wp + 1];
s += x1[x1Pos + -64] * w;
t -= x1[x2 + 64] * w;
w = enwindow[wp + 2];
s += x1[x1Pos + 0] * w;
t -= x1[x2 + 0] * w;
w = enwindow[wp + 3];
s += x1[x1Pos + 64] * w;
t -= x1[x2 + -64] * w;
w = enwindow[wp + 4];
s += x1[x1Pos + 128] * w;
t -= x1[x2 + -128] * w;
w = enwindow[wp + 5];
s += x1[x1Pos + 192] * w;
t -= x1[x2 + -192] * w;
s *= enwindow[wp + 6];
w = t - s;
a[30 + i * 2] = t + s;
a[31 + i * 2] = enwindow[wp + 7] * w;
wp += 18;
x1Pos--;
x2++;
}
{
var s, t, u, v;
t = x1[x1Pos + -16] * enwindow[wp + -10];
s = x1[x1Pos + -32] * enwindow[wp + -2];
t += (x1[x1Pos + -48] - x1[x1Pos + 16]) * enwindow[wp + -9];
s += x1[x1Pos + -96] * enwindow[wp + -1];
t += (x1[x1Pos + -80] + x1[x1Pos + 48]) * enwindow[wp + -8];
s += x1[x1Pos + -160] * enwindow[wp + 0];
t += (x1[x1Pos + -112] - x1[x1Pos + 80]) * enwindow[wp + -7];
s += x1[x1Pos + -224] * enwindow[wp + 1];
t += (x1[x1Pos + -144] + x1[x1Pos + 112]) * enwindow[wp + -6];
s -= x1[x1Pos + 32] * enwindow[wp + 2];
t += (x1[x1Pos + -176] - x1[x1Pos + 144]) * enwindow[wp + -5];
s -= x1[x1Pos + 96] * enwindow[wp + 3];
t += (x1[x1Pos + -208] + x1[x1Pos + 176]) * enwindow[wp + -4];
s -= x1[x1Pos + 160] * enwindow[wp + 4];
t += (x1[x1Pos + -240] - x1[x1Pos + 208]) * enwindow[wp + -3];
s -= x1[x1Pos + 224];
u = s - t;
v = s + t;
t = a[14];
s = a[15] - t;
a[31] = v + t;
a[30] = u + s;
a[15] = u - s;
a[14] = v - t;
}
{
var xr;
xr = a[28] - a[0];
a[0] += a[28];
a[28] = xr * enwindow[wp + -2 * 18 + 7];
xr = a[29] - a[1];
a[1] += a[29];
a[29] = xr * enwindow[wp + -2 * 18 + 7];
xr = a[26] - a[2];
a[2] += a[26];
a[26] = xr * enwindow[wp + -4 * 18 + 7];
xr = a[27] - a[3];
a[3] += a[27];
a[27] = xr * enwindow[wp + -4 * 18 + 7];
xr = a[24] - a[4];
a[4] += a[24];
a[24] = xr * enwindow[wp + -6 * 18 + 7];
xr = a[25] - a[5];
a[5] += a[25];
a[25] = xr * enwindow[wp + -6 * 18 + 7];
xr = a[22] - a[6];
a[6] += a[22];
a[22] = xr * Util$6.SQRT2;
xr = a[23] - a[7];
a[7] += a[23];
a[23] = xr * Util$6.SQRT2 - a[7];
a[7] -= a[6];
a[22] -= a[7];
a[23] -= a[22];
xr = a[6];
a[6] = a[31] - xr;
a[31] = a[31] + xr;
xr = a[7];
a[7] = a[30] - xr;
a[30] = a[30] + xr;
xr = a[22];
a[22] = a[15] - xr;
a[15] = a[15] + xr;
xr = a[23];
a[23] = a[14] - xr;
a[14] = a[14] + xr;
xr = a[20] - a[8];
a[8] += a[20];
a[20] = xr * enwindow[wp + -10 * 18 + 7];
xr = a[21] - a[9];
a[9] += a[21];
a[21] = xr * enwindow[wp + -10 * 18 + 7];
xr = a[18] - a[10];
a[10] += a[18];
a[18] = xr * enwindow[wp + -12 * 18 + 7];
xr = a[19] - a[11];
a[11] += a[19];
a[19] = xr * enwindow[wp + -12 * 18 + 7];
xr = a[16] - a[12];
a[12] += a[16];
a[16] = xr * enwindow[wp + -14 * 18 + 7];
xr = a[17] - a[13];
a[13] += a[17];
a[17] = xr * enwindow[wp + -14 * 18 + 7];
xr = -a[20] + a[24];
a[20] += a[24];
a[24] = xr * enwindow[wp + -12 * 18 + 7];
xr = -a[21] + a[25];
a[21] += a[25];
a[25] = xr * enwindow[wp + -12 * 18 + 7];
xr = a[4] - a[8];
a[4] += a[8];
a[8] = xr * enwindow[wp + -12 * 18 + 7];
xr = a[5] - a[9];
a[5] += a[9];
a[9] = xr * enwindow[wp + -12 * 18 + 7];
xr = a[0] - a[12];
a[0] += a[12];
a[12] = xr * enwindow[wp + -4 * 18 + 7];
xr = a[1] - a[13];
a[1] += a[13];
a[13] = xr * enwindow[wp + -4 * 18 + 7];
xr = a[16] - a[28];
a[16] += a[28];
a[28] = xr * enwindow[wp + -4 * 18 + 7];
xr = -a[17] + a[29];
a[17] += a[29];
a[29] = xr * enwindow[wp + -4 * 18 + 7];
xr = Util$6.SQRT2 * (a[2] - a[10]);
a[2] += a[10];
a[10] = xr;
xr = Util$6.SQRT2 * (a[3] - a[11]);
a[3] += a[11];
a[11] = xr;
xr = Util$6.SQRT2 * (-a[18] + a[26]);
a[18] += a[26];
a[26] = xr - a[18];
xr = Util$6.SQRT2 * (-a[19] + a[27]);
a[19] += a[27];
a[27] = xr - a[19];
xr = a[2];
a[19] -= a[3];
a[3] -= xr;
a[2] = a[31] - xr;
a[31] += xr;
xr = a[3];
a[11] -= a[19];
a[18] -= xr;
a[3] = a[30] - xr;
a[30] += xr;
xr = a[18];
a[27] -= a[11];
a[19] -= xr;
a[18] = a[15] - xr;
a[15] += xr;
xr = a[19];
a[10] -= xr;
a[19] = a[14] - xr;
a[14] += xr;
xr = a[10];
a[11] -= xr;
a[10] = a[23] - xr;
a[23] += xr;
xr = a[11];
a[26] -= xr;
a[11] = a[22] - xr;
a[22] += xr;
xr = a[26];
a[27] -= xr;
a[26] = a[7] - xr;
a[7] += xr;
xr = a[27];
a[27] = a[6] - xr;
a[6] += xr;
xr = Util$6.SQRT2 * (a[0] - a[4]);
a[0] += a[4];
a[4] = xr;
xr = Util$6.SQRT2 * (a[1] - a[5]);
a[1] += a[5];
a[5] = xr;
xr = Util$6.SQRT2 * (a[16] - a[20]);
a[16] += a[20];
a[20] = xr;
xr = Util$6.SQRT2 * (a[17] - a[21]);
a[17] += a[21];
a[21] = xr;
xr = -Util$6.SQRT2 * (a[8] - a[12]);
a[8] += a[12];
a[12] = xr - a[8];
xr = -Util$6.SQRT2 * (a[9] - a[13]);
a[9] += a[13];
a[13] = xr - a[9];
xr = -Util$6.SQRT2 * (a[25] - a[29]);
a[25] += a[29];
a[29] = xr - a[25];
xr = -Util$6.SQRT2 * (a[24] + a[28]);
a[24] -= a[28];
a[28] = xr - a[24];
xr = a[24] - a[16];
a[24] = xr;
xr = a[20] - xr;
a[20] = xr;
xr = a[28] - xr;
a[28] = xr;
xr = a[25] - a[17];
a[25] = xr;
xr = a[21] - xr;
a[21] = xr;
xr = a[29] - xr;
a[29] = xr;
xr = a[17] - a[1];
a[17] = xr;
xr = a[9] - xr;
a[9] = xr;
xr = a[25] - xr;
a[25] = xr;
xr = a[5] - xr;
a[5] = xr;
xr = a[21] - xr;
a[21] = xr;
xr = a[13] - xr;
a[13] = xr;
xr = a[29] - xr;
a[29] = xr;
xr = a[1] - a[0];
a[1] = xr;
xr = a[16] - xr;
a[16] = xr;
xr = a[17] - xr;
a[17] = xr;
xr = a[8] - xr;
a[8] = xr;
xr = a[9] - xr;
a[9] = xr;
xr = a[24] - xr;
a[24] = xr;
xr = a[25] - xr;
a[25] = xr;
xr = a[4] - xr;
a[4] = xr;
xr = a[5] - xr;
a[5] = xr;
xr = a[20] - xr;
a[20] = xr;
xr = a[21] - xr;
a[21] = xr;
xr = a[12] - xr;
a[12] = xr;
xr = a[13] - xr;
a[13] = xr;
xr = a[28] - xr;
a[28] = xr;
xr = a[29] - xr;
a[29] = xr;
xr = a[0];
a[0] += a[31];
a[31] -= xr;
xr = a[1];
a[1] += a[30];
a[30] -= xr;
xr = a[16];
a[16] += a[15];
a[15] -= xr;
xr = a[17];
a[17] += a[14];
a[14] -= xr;
xr = a[8];
a[8] += a[23];
a[23] -= xr;
xr = a[9];
a[9] += a[22];
a[22] -= xr;
xr = a[24];
a[24] += a[7];
a[7] -= xr;
xr = a[25];
a[25] += a[6];
a[6] -= xr;
xr = a[4];
a[4] += a[27];
a[27] -= xr;
xr = a[5];
a[5] += a[26];
a[26] -= xr;
xr = a[20];
a[20] += a[11];
a[11] -= xr;
xr = a[21];
a[21] += a[10];
a[10] -= xr;
xr = a[12];
a[12] += a[19];
a[19] -= xr;
xr = a[13];
a[13] += a[18];
a[18] -= xr;
xr = a[28];
a[28] += a[3];
a[3] -= xr;
xr = a[29];
a[29] += a[2];
a[2] -= xr;
}
}
function mdct_short(inout, inoutPos) {
for (var l = 0; l < 3; l++) {
var tc0, tc1, tc2, ts0, ts1, ts2;
ts0 = inout[inoutPos + 2 * 3] * win[Encoder_1.SHORT_TYPE][0] - inout[inoutPos + 5 * 3];
tc0 = inout[inoutPos + 0 * 3] * win[Encoder_1.SHORT_TYPE][2] - inout[inoutPos + 3 * 3];
tc1 = ts0 + tc0;
tc2 = ts0 - tc0;
ts0 = inout[inoutPos + 5 * 3] * win[Encoder_1.SHORT_TYPE][0] + inout[inoutPos + 2 * 3];
tc0 = inout[inoutPos + 3 * 3] * win[Encoder_1.SHORT_TYPE][2] + inout[inoutPos + 0 * 3];
ts1 = ts0 + tc0;
ts2 = -ts0 + tc0;
tc0 = (inout[inoutPos + 1 * 3] * win[Encoder_1.SHORT_TYPE][1] - inout[inoutPos + 4 * 3]) * 2069978111953089e-26;
ts0 = (inout[inoutPos + 4 * 3] * win[Encoder_1.SHORT_TYPE][1] + inout[inoutPos + 1 * 3]) * 2069978111953089e-26;
inout[inoutPos + 3 * 0] = tc1 * 190752519173728e-25 + tc0;
inout[inoutPos + 3 * 5] = -ts1 * 190752519173728e-25 + ts0;
tc2 = tc2 * 0.8660254037844387 * 1907525191737281e-26;
ts1 = ts1 * 0.5 * 1907525191737281e-26 + ts0;
inout[inoutPos + 3 * 1] = tc2 - ts1;
inout[inoutPos + 3 * 2] = tc2 + ts1;
tc1 = tc1 * 0.5 * 1907525191737281e-26 - tc0;
ts2 = ts2 * 0.8660254037844387 * 1907525191737281e-26;
inout[inoutPos + 3 * 3] = tc1 + ts2;
inout[inoutPos + 3 * 4] = tc1 - ts2;
inoutPos++;
}
}
function mdct_long(out, outPos, _in) {
var ct, st;
{
var tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
tc1 = _in[17] - _in[9];
tc3 = _in[15] - _in[11];
tc4 = _in[14] - _in[12];
ts5 = _in[0] + _in[8];
ts6 = _in[1] + _in[7];
ts7 = _in[2] + _in[6];
ts8 = _in[3] + _in[5];
out[outPos + 17] = ts5 + ts7 - ts8 - (ts6 - _in[4]);
st = (ts5 + ts7 - ts8) * cx[12 + 7] + (ts6 - _in[4]);
ct = (tc1 - tc3 - tc4) * cx[12 + 6];
out[outPos + 5] = ct + st;
out[outPos + 6] = ct - st;
tc2 = (_in[16] - _in[10]) * cx[12 + 6];
ts6 = ts6 * cx[12 + 7] + _in[4];
ct = tc1 * cx[12 + 0] + tc2 + tc3 * cx[12 + 1] + tc4 * cx[12 + 2];
st = -ts5 * cx[12 + 4] + ts6 - ts7 * cx[12 + 5] + ts8 * cx[12 + 3];
out[outPos + 1] = ct + st;
out[outPos + 2] = ct - st;
ct = tc1 * cx[12 + 1] - tc2 - tc3 * cx[12 + 2] + tc4 * cx[12 + 0];
st = -ts5 * cx[12 + 5] + ts6 - ts7 * cx[12 + 3] + ts8 * cx[12 + 4];
out[outPos + 9] = ct + st;
out[outPos + 10] = ct - st;
ct = tc1 * cx[12 + 2] - tc2 + tc3 * cx[12 + 0] - tc4 * cx[12 + 1];
st = ts5 * cx[12 + 3] - ts6 + ts7 * cx[12 + 4] - ts8 * cx[12 + 5];
out[outPos + 13] = ct + st;
out[outPos + 14] = ct - st;
}
{
var ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
ts1 = _in[8] - _in[0];
ts3 = _in[6] - _in[2];
ts4 = _in[5] - _in[3];
tc5 = _in[17] + _in[9];
tc6 = _in[16] + _in[10];
tc7 = _in[15] + _in[11];
tc8 = _in[14] + _in[12];
out[outPos + 0] = tc5 + tc7 + tc8 + (tc6 + _in[13]);
ct = (tc5 + tc7 + tc8) * cx[12 + 7] - (tc6 + _in[13]);
st = (ts1 - ts3 + ts4) * cx[12 + 6];
out[outPos + 11] = ct + st;
out[outPos + 12] = ct - st;
ts2 = (_in[7] - _in[1]) * cx[12 + 6];
tc6 = _in[13] - tc6 * cx[12 + 7];
ct = tc5 * cx[12 + 3] - tc6 + tc7 * cx[12 + 4] + tc8 * cx[12 + 5];
st = ts1 * cx[12 + 2] + ts2 + ts3 * cx[12 + 0] + ts4 * cx[12 + 1];
out[outPos + 3] = ct + st;
out[outPos + 4] = ct - st;
ct = -tc5 * cx[12 + 5] + tc6 - tc7 * cx[12 + 3] - tc8 * cx[12 + 4];
st = ts1 * cx[12 + 1] + ts2 - ts3 * cx[12 + 2] - ts4 * cx[12 + 0];
out[outPos + 7] = ct + st;
out[outPos + 8] = ct - st;
ct = -tc5 * cx[12 + 4] + tc6 - tc7 * cx[12 + 5] - tc8 * cx[12 + 3];
st = ts1 * cx[12 + 0] - ts2 + ts3 * cx[12 + 1] - ts4 * cx[12 + 2];
out[outPos + 15] = ct + st;
out[outPos + 16] = ct - st;
}
}
this.mdct_sub48 = function(gfc, w0, w1) {
var wk = w0;
var wkPos = 286;
for (var ch = 0; ch < gfc.channels_out; ch++) {
for (var gr = 0; gr < gfc.mode_gr; gr++) {
var band;
var gi = gfc.l3_side.tt[gr][ch];
var mdct_enc = gi.xr;
var mdct_encPos = 0;
var samp = gfc.sb_sample[ch][1 - gr];
var sampPos = 0;
for (var k = 0; k < 18 / 2; k++) {
window_subband(wk, wkPos, samp[sampPos]);
window_subband(wk, wkPos + 32, samp[sampPos + 1]);
sampPos += 2;
wkPos += 64;
for (band = 1; band < 32; band += 2) {
samp[sampPos - 1][band] *= -1;
}
}
for (band = 0; band < 32; band++, mdct_encPos += 18) {
var type = gi.block_type;
var band0 = gfc.sb_sample[ch][gr];
var band1 = gfc.sb_sample[ch][1 - gr];
if (gi.mixed_block_flag != 0 && band < 2)
type = 0;
if (gfc.amp_filter[band] < 1e-12) {
Arrays$6.fill(
mdct_enc,
mdct_encPos + 0,
mdct_encPos + 18,
0
);
} else {
if (gfc.amp_filter[band] < 1) {
for (var k = 0; k < 18; k++)
band1[k][order[band]] *= gfc.amp_filter[band];
}
if (type == Encoder_1.SHORT_TYPE) {
for (var k = -NS / 4; k < 0; k++) {
var w = win[Encoder_1.SHORT_TYPE][k + 3];
mdct_enc[mdct_encPos + k * 3 + 9] = band0[9 + k][order[band]] * w - band0[8 - k][order[band]];
mdct_enc[mdct_encPos + k * 3 + 18] = band0[14 - k][order[band]] * w + band0[15 + k][order[band]];
mdct_enc[mdct_encPos + k * 3 + 10] = band0[15 + k][order[band]] * w - band0[14 - k][order[band]];
mdct_enc[mdct_encPos + k * 3 + 19] = band1[2 - k][order[band]] * w + band1[3 + k][order[band]];
mdct_enc[mdct_encPos + k * 3 + 11] = band1[3 + k][order[band]] * w - band1[2 - k][order[band]];
mdct_enc[mdct_encPos + k * 3 + 20] = band1[8 - k][order[band]] * w + band1[9 + k][order[band]];
}
mdct_short(mdct_enc, mdct_encPos);
} else {
var work = new_float$6(18);
for (var k = -NL / 4; k < 0; k++) {
var a, b;
a = win[type][k + 27] * band1[k + 9][order[band]] + win[type][k + 36] * band1[8 - k][order[band]];
b = win[type][k + 9] * band0[k + 9][order[band]] - win[type][k + 18] * band0[8 - k][order[band]];
work[k + 9] = a - b * tantab_l[3 + k + 9];
work[k + 18] = a * tantab_l[3 + k + 9] + b;
}
mdct_long(mdct_enc, mdct_encPos, work);
}
}
if (type != Encoder_1.SHORT_TYPE && band != 0) {
for (var k = 7; k >= 0; --k) {
var bu, bd;
bu = mdct_enc[mdct_encPos + k] * ca[20 + k] + mdct_enc[mdct_encPos + -1 - k] * cs[28 + k];
bd = mdct_enc[mdct_encPos + k] * cs[28 + k] - mdct_enc[mdct_encPos + -1 - k] * ca[20 + k];
mdct_enc[mdct_encPos + -1 - k] = bu;
mdct_enc[mdct_encPos + k] = bd;
}
}
}
}
wk = w1;
wkPos = 286;
if (gfc.mode_gr == 1) {
for (var i = 0; i < 18; i++) {
System$6.arraycopy(
gfc.sb_sample[ch][1][i],
0,
gfc.sb_sample[ch][0][i],
0,
32
);
}
}
}
};
}
var NewMDCT_1 = NewMDCT;
var System$7 = common.System;
var new_float$7 = common.new_float;
var new_float_n$7 = common.new_float_n;
function III_psy_xmin() {
this.l = new_float$7(Encoder_1.SBMAX_l);
this.s = new_float_n$7([Encoder_1.SBMAX_s, 3]);
var self = this;
this.assign = function(iii_psy_xmin) {
System$7.arraycopy(iii_psy_xmin.l, 0, self.l, 0, Encoder_1.SBMAX_l);
for (var i = 0; i < Encoder_1.SBMAX_s; i++) {
for (var j = 0; j < 3; j++) {
self.s[i][j] = iii_psy_xmin.s[i][j];
}
}
};
}
var III_psy_xmin_1 = III_psy_xmin;
function III_psy_ratio() {
this.thm = new III_psy_xmin_1();
this.en = new III_psy_xmin_1();
}
var III_psy_ratio_1 = III_psy_ratio;
var System$5 = common.System;
var VbrMode$5 = common.VbrMode;
var new_array_n$5 = common.new_array_n;
var new_float$5 = common.new_float;
var new_float_n$5 = common.new_float_n;
var new_int$5 = common.new_int;
var assert$5 = common.assert;
Encoder$2.ENCDELAY = 576;
Encoder$2.POSTDELAY = 1152;
Encoder$2.MDCTDELAY = 48;
Encoder$2.FFTOFFSET = 224 + Encoder$2.MDCTDELAY;
Encoder$2.DECDELAY = 528;
Encoder$2.SBLIMIT = 32;
Encoder$2.CBANDS = 64;
Encoder$2.SBPSY_l = 21;
Encoder$2.SBPSY_s = 12;
Encoder$2.SBMAX_l = 22;
Encoder$2.SBMAX_s = 13;
Encoder$2.PSFB21 = 6;
Encoder$2.PSFB12 = 6;
Encoder$2.BLKSIZE = 1024;
Encoder$2.HBLKSIZE = Encoder$2.BLKSIZE / 2 + 1;
Encoder$2.BLKSIZE_s = 256;
Encoder$2.HBLKSIZE_s = Encoder$2.BLKSIZE_s / 2 + 1;
Encoder$2.NORM_TYPE = 0;
Encoder$2.START_TYPE = 1;
Encoder$2.SHORT_TYPE = 2;
Encoder$2.STOP_TYPE = 3;
Encoder$2.MPG_MD_LR_LR = 0;
Encoder$2.MPG_MD_LR_I = 1;
Encoder$2.MPG_MD_MS_LR = 2;
Encoder$2.MPG_MD_MS_I = 3;
Encoder$2.fircoef = [
-0.0207887 * 5,
-0.0378413 * 5,
-0.0432472 * 5,
-0.031183 * 5,
779609e-23 * 5,
0.0467745 * 5,
0.10091 * 5,
0.151365 * 5,
0.187098 * 5
];
function Encoder$2() {
var NewMDCT2 = NewMDCT_1;
var III_psy_ratio2 = III_psy_ratio_1;
var FFTOFFSET = Encoder$2.FFTOFFSET;
var MPG_MD_MS_LR = Encoder$2.MPG_MD_MS_LR;
var bs = null;
this.psy = null;
var psy = null;
var vbr = null;
var qupvt = null;
this.setModules = function(_bs, _psy, _qupvt, _vbr) {
bs = _bs;
this.psy = _psy;
psy = _psy;
vbr = _vbr;
qupvt = _qupvt;
};
var newMDCT = new NewMDCT2();
function adjust_ATH(gfc) {
var gr2_max, max_pow;
if (gfc.ATH.useAdjust == 0) {
gfc.ATH.adjust = 1;
return;
}
max_pow = gfc.loudness_sq[0][0];
gr2_max = gfc.loudness_sq[1][0];
if (gfc.channels_out == 2) {
max_pow += gfc.loudness_sq[0][1];
gr2_max += gfc.loudness_sq[1][1];
} else {
max_pow += max_pow;
gr2_max += gr2_max;
}
if (gfc.mode_gr == 2) {
max_pow = Math.max(max_pow, gr2_max);
}
max_pow *= 0.5;
max_pow *= gfc.ATH.aaSensitivityP;
if (max_pow > 0.03125) {
if (gfc.ATH.adjust >= 1) {
gfc.ATH.adjust = 1;
} else {
if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {
gfc.ATH.adjust = gfc.ATH.adjustLimit;
}
}
gfc.ATH.adjustLimit = 1;
} else {
var adj_lim_new = 31.98 * max_pow + 625e-6;
if (gfc.ATH.adjust >= adj_lim_new) {
gfc.ATH.adjust *= adj_lim_new * 0.075 + 0.925;
if (gfc.ATH.adjust < adj_lim_new) {
gfc.ATH.adjust = adj_lim_new;
}
} else {
if (gfc.ATH.adjustLimit >= adj_lim_new) {
gfc.ATH.adjust = adj_lim_new;
} else {
if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {
gfc.ATH.adjust = gfc.ATH.adjustLimit;
}
}
}
gfc.ATH.adjustLimit = adj_lim_new;
}
}
function updateStats(gfc) {
var gr, ch;
assert$5(0 <= gfc.bitrate_index && gfc.bitrate_index < 16);
assert$5(0 <= gfc.mode_ext && gfc.mode_ext < 4);
gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][4]++;
gfc.bitrate_stereoMode_Hist[15][4]++;
if (gfc.channels_out == 2) {
gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][gfc.mode_ext]++;
gfc.bitrate_stereoMode_Hist[15][gfc.mode_ext]++;
}
for (gr = 0; gr < gfc.mode_gr; ++gr) {
for (ch = 0; ch < gfc.channels_out; ++ch) {
var bt = gfc.l3_side.tt[gr][ch].block_type | 0;
if (gfc.l3_side.tt[gr][ch].mixed_block_flag != 0)
bt = 4;
gfc.bitrate_blockType_Hist[gfc.bitrate_index][bt]++;
gfc.bitrate_blockType_Hist[gfc.bitrate_index][5]++;
gfc.bitrate_blockType_Hist[15][bt]++;
gfc.bitrate_blockType_Hist[15][5]++;
}
}
}
function lame_encode_frame_init(gfp, inbuf) {
var gfc = gfp.internal_flags;
var ch, gr;
if (gfc.lame_encode_frame_init == 0) {
var i, j;
var primebuff0 = new_float$5(286 + 1152 + 576);
var primebuff1 = new_float$5(286 + 1152 + 576);
gfc.lame_encode_frame_init = 1;
for (i = 0, j = 0; i < 286 + 576 * (1 + gfc.mode_gr); ++i) {
if (i < 576 * gfc.mode_gr) {
primebuff0[i] = 0;
if (gfc.channels_out == 2)
primebuff1[i] = 0;
} else {
primebuff0[i] = inbuf[0][j];
if (gfc.channels_out == 2)
primebuff1[i] = inbuf[1][j];
++j;
}
}
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
gfc.l3_side.tt[gr][ch].block_type = Encoder$2.SHORT_TYPE;
}
}
newMDCT.mdct_sub48(gfc, primebuff0, primebuff1);
assert$5(576 >= Encoder$2.FFTOFFSET);
assert$5(gfc.mf_size >= Encoder$2.BLKSIZE + gfp.framesize - Encoder$2.FFTOFFSET);
assert$5(gfc.mf_size >= 512 + gfp.framesize - 32);
}
}
this.lame_encode_mp3_frame = function(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
var mp3count;
var masking_LR = new_array_n$5([2, 2]);
masking_LR[0][0] = new III_psy_ratio2();
masking_LR[0][1] = new III_psy_ratio2();
masking_LR[1][0] = new III_psy_ratio2();
masking_LR[1][1] = new III_psy_ratio2();
var masking_MS = new_array_n$5([2, 2]);
masking_MS[0][0] = new III_psy_ratio2();
masking_MS[0][1] = new III_psy_ratio2();
masking_MS[1][0] = new III_psy_ratio2();
masking_MS[1][1] = new III_psy_ratio2();
var masking;
var inbuf = [null, null];
var gfc = gfp.internal_flags;
var tot_ener = new_float_n$5([2, 4]);
var ms_ener_ratio = [0.5, 0.5];
var pe = [[0, 0], [0, 0]];
var pe_MS = [[0, 0], [0, 0]];
var pe_use;
var ch, gr;
inbuf[0] = inbuf_l;
inbuf[1] = inbuf_r;
if (gfc.lame_encode_frame_init == 0) {
lame_encode_frame_init(gfp, inbuf);
}
gfc.padding = 0;
if ((gfc.slot_lag -= gfc.frac_SpF) < 0) {
gfc.slot_lag += gfp.out_samplerate;
gfc.padding = 1;
}
if (gfc.psymodel != 0) {
var ret;
var bufp = [null, null];
var bufpPos = 0;
var blocktype = new_int$5(2);
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
bufp[ch] = inbuf[ch];
bufpPos = 576 + gr * 576 - Encoder$2.FFTOFFSET;
}
if (gfp.VBR == VbrMode$5.vbr_mtrh || gfp.VBR == VbrMode$5.vbr_mt) {
ret = psy.L3psycho_anal_vbr(
gfp,
bufp,
bufpPos,
gr,
masking_LR,
masking_MS,
pe[gr],
pe_MS[gr],
tot_ener[gr],
blocktype
);
} else {
ret = psy.L3psycho_anal_ns(
gfp,
bufp,
bufpPos,
gr,
masking_LR,
masking_MS,
pe[gr],
pe_MS[gr],
tot_ener[gr],
blocktype
);
}
if (ret != 0)
return -4;
if (gfp.mode == MPEGMode.JOINT_STEREO) {
ms_ener_ratio[gr] = tot_ener[gr][2] + tot_ener[gr][3];
if (ms_ener_ratio[gr] > 0)
ms_ener_ratio[gr] = tot_ener[gr][3] / ms_ener_ratio[gr];
}
for (ch = 0; ch < gfc.channels_out; ch++) {
var cod_info = gfc.l3_side.tt[gr][ch];
cod_info.block_type = blocktype[ch];
cod_info.mixed_block_flag = 0;
}
}
} else {
for (gr = 0; gr < gfc.mode_gr; gr++)
for (ch = 0; ch < gfc.channels_out; ch++) {
gfc.l3_side.tt[gr][ch].block_type = Encoder$2.NORM_TYPE;
gfc.l3_side.tt[gr][ch].mixed_block_flag = 0;
pe_MS[gr][ch] = pe[gr][ch] = 700;
}
}
adjust_ATH(gfc);
newMDCT.mdct_sub48(gfc, inbuf[0], inbuf[1]);
gfc.mode_ext = Encoder$2.MPG_MD_LR_LR;
if (gfp.force_ms) {
gfc.mode_ext = Encoder$2.MPG_MD_MS_LR;
} else if (gfp.mode == MPEGMode.JOINT_STEREO) {
var sum_pe_MS = 0;
var sum_pe_LR = 0;
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
sum_pe_MS += pe_MS[gr][ch];
sum_pe_LR += pe[gr][ch];
}
}
if (sum_pe_MS <= 1 * sum_pe_LR) {
var gi0 = gfc.l3_side.tt[0];
var gi1 = gfc.l3_side.tt[gfc.mode_gr - 1];
if (gi0[0].block_type == gi0[1].block_type && gi1[0].block_type == gi1[1].block_type) {
gfc.mode_ext = Encoder$2.MPG_MD_MS_LR;
}
}
}
if (gfc.mode_ext == MPG_MD_MS_LR) {
masking = masking_MS;
pe_use = pe_MS;
} else {
masking = masking_LR;
pe_use = pe;
}
if (gfp.analysis && gfc.pinfo != null) {
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
gfc.pinfo.ms_ratio[gr] = gfc.ms_ratio[gr];
gfc.pinfo.ms_ener_ratio[gr] = ms_ener_ratio[gr];
gfc.pinfo.blocktype[gr][ch] = gfc.l3_side.tt[gr][ch].block_type;
gfc.pinfo.pe[gr][ch] = pe_use[gr][ch];
System$5.arraycopy(
gfc.l3_side.tt[gr][ch].xr,
0,
gfc.pinfo.xr[gr][ch],
0,
576
);
if (gfc.mode_ext == MPG_MD_MS_LR) {
gfc.pinfo.ers[gr][ch] = gfc.pinfo.ers[gr][ch + 2];
System$5.arraycopy(
gfc.pinfo.energy[gr][ch + 2],
0,
gfc.pinfo.energy[gr][ch],
0,
gfc.pinfo.energy[gr][ch].length
);
}
}
}
}
if (gfp.VBR == VbrMode$5.vbr_off || gfp.VBR == VbrMode$5.vbr_abr) {
var i;
var f;
for (i = 0; i < 18; i++)
gfc.nsPsy.pefirbuf[i] = gfc.nsPsy.pefirbuf[i + 1];
f = 0;
for (gr = 0; gr < gfc.mode_gr; gr++)
for (ch = 0; ch < gfc.channels_out; ch++)
f += pe_use[gr][ch];
gfc.nsPsy.pefirbuf[18] = f;
f = gfc.nsPsy.pefirbuf[9];
for (i = 0; i < 9; i++)
f += (gfc.nsPsy.pefirbuf[i] + gfc.nsPsy.pefirbuf[18 - i]) * Encoder$2.fircoef[i];
f = 670 * 5 * gfc.mode_gr * gfc.channels_out / f;
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
pe_use[gr][ch] *= f;
}
}
}
gfc.iteration_loop.iteration_loop(gfp, pe_use, ms_ener_ratio, masking);
bs.format_bitstream(gfp);
mp3count = bs.copy_buffer(gfc, mp3buf, mp3bufPos, mp3buf_size, 1);
if (gfp.bWriteVbrTag)
vbr.addVbrFrame(gfp);
if (gfp.analysis && gfc.pinfo != null) {
for (ch = 0; ch < gfc.channels_out; ch++) {
var j;
for (j = 0; j < FFTOFFSET; j++)
gfc.pinfo.pcmdata[ch][j] = gfc.pinfo.pcmdata[ch][j + gfp.framesize];
for (j = FFTOFFSET; j < 1600; j++) {
gfc.pinfo.pcmdata[ch][j] = inbuf[ch][j - FFTOFFSET];
}
}
qupvt.set_frame_pinfo(gfp, masking);
}
updateStats(gfc);
return mp3count;
};
}
var Encoder_1 = Encoder$2;
var Util$4 = common.Util;
var new_float$4 = common.new_float;
function FFT() {
var window2 = new_float$4(Encoder_1.BLKSIZE);
var window_s = new_float$4(Encoder_1.BLKSIZE_s / 2);
var costab = [
0.9238795325112867,
0.3826834323650898,
0.9951847266721969,
0.0980171403295606,
0.9996988186962042,
0.02454122852291229,
0.9999811752826011,
0.006135884649154475
];
function fht(fz, fzPos, n) {
var tri = 0;
var k4;
var fi;
var gi;
n <<= 1;
var fn = fzPos + n;
k4 = 4;
do {
var s1, c1;
var i, k1, k2, k3, kx;
kx = k4 >> 1;
k1 = k4;
k2 = k4 << 1;
k3 = k2 + k1;
k4 = k2 << 1;
fi = fzPos;
gi = fi + kx;
do {
var f0, f1, f2, f3;
f1 = fz[fi + 0] - fz[fi + k1];
f0 = fz[fi + 0] + fz[fi + k1];
f3 = fz[fi + k2] - fz[fi + k3];
f2 = fz[fi + k2] + fz[fi + k3];
fz[fi + k2] = f0 - f2;
fz[fi + 0] = f0 + f2;
fz[fi + k3] = f1 - f3;
fz[fi + k1] = f1 + f3;
f1 = fz[gi + 0] - fz[gi + k1];
f0 = fz[gi + 0] + fz[gi + k1];
f3 = Util$4.SQRT2 * fz[gi + k3];
f2 = Util$4.SQRT2 * fz[gi + k2];
fz[gi + k2] = f0 - f2;
fz[gi + 0] = f0 + f2;
fz[gi + k3] = f1 - f3;
fz[gi + k1] = f1 + f3;
gi += k4;
fi += k4;
} while (fi < fn);
c1 = costab[tri + 0];
s1 = costab[tri + 1];
for (i = 1; i < kx; i++) {
var c2, s2;
c2 = 1 - 2 * s1 * s1;
s2 = 2 * s1 * c1;
fi = fzPos + i;
gi = fzPos + k1 - i;
do {
var a, b, g0, f0, f1, g1, f2, g2, f3, g3;
b = s2 * fz[fi + k1] - c2 * fz[gi + k1];
a = c2 * fz[fi + k1] + s2 * fz[gi + k1];
f1 = fz[fi + 0] - a;
f0 = fz[fi + 0] + a;
g1 = fz[gi + 0] - b;
g0 = fz[gi + 0] + b;
b = s2 * fz[fi + k3] - c2 * fz[gi + k3];
a = c2 * fz[fi + k3] + s2 * fz[gi + k3];
f3 = fz[fi + k2] - a;
f2 = fz[fi + k2] + a;
g3 = fz[gi + k2] - b;
g2 = fz[gi + k2] + b;
b = s1 * f2 - c1 * g3;
a = c1 * f2 + s1 * g3;
fz[fi + k2] = f0 - a;
fz[fi + 0] = f0 + a;
fz[gi + k3] = g1 - b;
fz[gi + k1] = g1 + b;
b = c1 * g2 - s1 * f3;
a = s1 * g2 + c1 * f3;
fz[gi + k2] = g0 - a;
fz[gi + 0] = g0 + a;
fz[fi + k3] = f1 - b;
fz[fi + k1] = f1 + b;
gi += k4;
fi += k4;
} while (fi < fn);
c2 = c1;
c1 = c2 * costab[tri + 0] - s1 * costab[tri + 1];
s1 = c2 * costab[tri + 1] + s1 * costab[tri + 0];
}
tri += 2;
} while (k4 < n);
}
var rv_tbl = [
0,
128,
64,
192,
32,
160,
96,
224,
16,
144,
80,
208,
48,
176,
112,
240,
8,
136,
72,
200,
40,
168,
104,
232,
24,
152,
88,
216,
56,
184,
120,
248,
4,
132,
68,
196,
36,
164,
100,
228,
20,
148,
84,
212,
52,
180,
116,
244,
12,
140,
76,
204,
44,
172,
108,
236,
28,
156,
92,
220,
60,
188,
124,
252,
2,
130,
66,
194,
34,
162,
98,
226,
18,
146,
82,
210,
50,
178,
114,
242,
10,
138,
74,
202,
42,
170,
106,
234,
26,
154,
90,
218,
58,
186,
122,
250,
6,
134,
70,
198,
38,
166,
102,
230,
22,
150,
86,
214,
54,
182,
118,
246,
14,
142,
78,
206,
46,
174,
110,
238,
30,
158,
94,
222,
62,
190,
126,
254
];
this.fft_short = function(gfc, x_real, chn, buffer, bufPos) {
for (var b = 0; b < 3; b++) {
var x = Encoder_1.BLKSIZE_s / 2;
var k = 65535 & 576 / 3 * (b + 1);
var j = Encoder_1.BLKSIZE_s / 8 - 1;
do {
var f0, f1, f2, f3, w;
var i = rv_tbl[j << 2] & 255;
f0 = window_s[i] * buffer[chn][bufPos + i + k];
w = window_s[127 - i] * buffer[chn][bufPos + i + k + 128];
f1 = f0 - w;
f0 = f0 + w;
f2 = window_s[i + 64] * buffer[chn][bufPos + i + k + 64];
w = window_s[63 - i] * buffer[chn][bufPos + i + k + 192];
f3 = f2 - w;
f2 = f2 + w;
x -= 4;
x_real[b][x + 0] = f0 + f2;
x_real[b][x + 2] = f0 - f2;
x_real[b][x + 1] = f1 + f3;
x_real[b][x + 3] = f1 - f3;
f0 = window_s[i + 1] * buffer[chn][bufPos + i + k + 1];
w = window_s[126 - i] * buffer[chn][bufPos + i + k + 129];
f1 = f0 - w;
f0 = f0 + w;
f2 = window_s[i + 65] * buffer[chn][bufPos + i + k + 65];
w = window_s[62 - i] * buffer[chn][bufPos + i + k + 193];
f3 = f2 - w;
f2 = f2 + w;
x_real[b][x + Encoder_1.BLKSIZE_s / 2 + 0] = f0 + f2;
x_real[b][x + Encoder_1.BLKSIZE_s / 2 + 2] = f0 - f2;
x_real[b][x + Encoder_1.BLKSIZE_s / 2 + 1] = f1 + f3;
x_real[b][x + Encoder_1.BLKSIZE_s / 2 + 3] = f1 - f3;
} while (--j >= 0);
fht(x_real[b], x, Encoder_1.BLKSIZE_s / 2);
}
};
this.fft_long = function(gfc, y, chn, buffer, bufPos) {
var jj = Encoder_1.BLKSIZE / 8 - 1;
var x = Encoder_1.BLKSIZE / 2;
do {
var f0, f1, f2, f3, w;
var i = rv_tbl[jj] & 255;
f0 = window2[i] * buffer[chn][bufPos + i];
w = window2[i + 512] * buffer[chn][bufPos + i + 512];
f1 = f0 - w;
f0 = f0 + w;
f2 = window2[i + 256] * buffer[chn][bufPos + i + 256];
w = window2[i + 768] * buffer[chn][bufPos + i + 768];
f3 = f2 - w;
f2 = f2 + w;
x -= 4;
y[x + 0] = f0 + f2;
y[x + 2] = f0 - f2;
y[x + 1] = f1 + f3;
y[x + 3] = f1 - f3;
f0 = window2[i + 1] * buffer[chn][bufPos + i + 1];
w = window2[i + 513] * buffer[chn][bufPos + i + 513];
f1 = f0 - w;
f0 = f0 + w;
f2 = window2[i + 257] * buffer[chn][bufPos + i + 257];
w = window2[i + 769] * buffer[chn][bufPos + i + 769];
f3 = f2 - w;
f2 = f2 + w;
y[x + Encoder_1.BLKSIZE / 2 + 0] = f0 + f2;
y[x + Encoder_1.BLKSIZE / 2 + 2] = f0 - f2;
y[x + Encoder_1.BLKSIZE / 2 + 1] = f1 + f3;
y[x + Encoder_1.BLKSIZE / 2 + 3] = f1 - f3;
} while (--jj >= 0);
fht(y, x, Encoder_1.BLKSIZE / 2);
};
this.init_fft = function(gfc) {
for (var i = 0; i < Encoder_1.BLKSIZE; i++)
window2[i] = 0.42 - 0.5 * Math.cos(2 * Math.PI * (i + 0.5) / Encoder_1.BLKSIZE) + 0.08 * Math.cos(4 * Math.PI * (i + 0.5) / Encoder_1.BLKSIZE);
for (var i = 0; i < Encoder_1.BLKSIZE_s / 2; i++)
window_s[i] = 0.5 * (1 - Math.cos(2 * Math.PI * (i + 0.5) / Encoder_1.BLKSIZE_s));
};
}
var FFT_1 = FFT;
var VbrMode$3 = common.VbrMode;
var Float$3 = common.Float;
var ShortBlock$3 = common.ShortBlock;
var Util$3 = common.Util;
var Arrays$3 = common.Arrays;
var new_float$3 = common.new_float;
var new_float_n$3 = common.new_float_n;
var new_int$3 = common.new_int;
var assert$3 = common.assert;
function PsyModel() {
var fft = new FFT_1();
var LOG10 = 2.302585092994046;
var rpelev = 2;
var rpelev2 = 16;
var rpelev_s = 2;
var rpelev2_s = 16;
var DELBARK = 0.34;
var VO_SCALE = 1 / (14752 * 14752) / (Encoder_1.BLKSIZE / 2);
var temporalmask_sustain_sec = 0.01;
var NS_PREECHO_ATT0 = 0.8;
var NS_PREECHO_ATT1 = 0.6;
var NS_PREECHO_ATT2 = 0.3;
var NS_MSFIX = 3.5;
var NSATTACKTHRE = 4.4;
var NSATTACKTHRE_S = 25;
var NSFIRLEN = 21;
var LN_TO_LOG10 = 0.2302585093;
function NON_LINEAR_SCALE_ENERGY(x) {
return x;
}
function psycho_loudness_approx(energy, gfc) {
var loudness_power = 0;
for (var i = 0; i < Encoder_1.BLKSIZE / 2; ++i)
loudness_power += energy[i] * gfc.ATH.eql_w[i];
loudness_power *= VO_SCALE;
return loudness_power;
}
function compute_ffts(gfp, fftenergy, fftenergy_s, wsamp_l, wsamp_lPos, wsamp_s, wsamp_sPos, gr_out, chn, buffer, bufPos) {
var gfc = gfp.internal_flags;
if (chn < 2) {
fft.fft_long(gfc, wsamp_l[wsamp_lPos], chn, buffer, bufPos);
fft.fft_short(gfc, wsamp_s[wsamp_sPos], chn, buffer, bufPos);
} else if (chn == 2) {
for (var j = Encoder_1.BLKSIZE - 1; j >= 0; --j) {
var l = wsamp_l[wsamp_lPos + 0][j];
var r = wsamp_l[wsamp_lPos + 1][j];
wsamp_l[wsamp_lPos + 0][j] = (l + r) * Util$3.SQRT2 * 0.5;
wsamp_l[wsamp_lPos + 1][j] = (l - r) * Util$3.SQRT2 * 0.5;
}
for (var b = 2; b >= 0; --b) {
for (var j = Encoder_1.BLKSIZE_s - 1; j >= 0; --j) {
var l = wsamp_s[wsamp_sPos + 0][b][j];
var r = wsamp_s[wsamp_sPos + 1][b][j];
wsamp_s[wsamp_sPos + 0][b][j] = (l + r) * Util$3.SQRT2 * 0.5;
wsamp_s[wsamp_sPos + 1][b][j] = (l - r) * Util$3.SQRT2 * 0.5;
}
}
}
fftenergy[0] = NON_LINEAR_SCALE_ENERGY(wsamp_l[wsamp_lPos + 0][0]);
fftenergy[0] *= fftenergy[0];
for (var j = Encoder_1.BLKSIZE / 2 - 1; j >= 0; --j) {
var re = wsamp_l[wsamp_lPos + 0][Encoder_1.BLKSIZE / 2 - j];
var im = wsamp_l[wsamp_lPos + 0][Encoder_1.BLKSIZE / 2 + j];
fftenergy[Encoder_1.BLKSIZE / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
}
for (var b = 2; b >= 0; --b) {
fftenergy_s[b][0] = wsamp_s[wsamp_sPos + 0][b][0];
fftenergy_s[b][0] *= fftenergy_s[b][0];
for (var j = Encoder_1.BLKSIZE_s / 2 - 1; j >= 0; --j) {
var re = wsamp_s[wsamp_sPos + 0][b][Encoder_1.BLKSIZE_s / 2 - j];
var im = wsamp_s[wsamp_sPos + 0][b][Encoder_1.BLKSIZE_s / 2 + j];
fftenergy_s[b][Encoder_1.BLKSIZE_s / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
}
}
{
var totalenergy = 0;
for (var j = 11; j < Encoder_1.HBLKSIZE; j++)
totalenergy += fftenergy[j];
gfc.tot_ener[chn] = totalenergy;
}
if (gfp.analysis) {
for (var j = 0; j < Encoder_1.HBLKSIZE; j++) {
gfc.pinfo.energy[gr_out][chn][j] = gfc.pinfo.energy_save[chn][j];
gfc.pinfo.energy_save[chn][j] = fftenergy[j];
}
gfc.pinfo.pe[gr_out][chn] = gfc.pe[chn];
}
if (gfp.athaa_loudapprox == 2 && chn < 2) {
gfc.loudness_sq[gr_out][chn] = gfc.loudness_sq_save[chn];
gfc.loudness_sq_save[chn] = psycho_loudness_approx(fftenergy, gfc);
}
}
var I1LIMIT = 8;
var I2LIMIT = 23;
var MLIMIT = 15;
var ma_max_i1;
var ma_max_i2;
var ma_max_m;
var tab = [
1,
0.79433,
0.63096,
0.63096,
0.63096,
0.63096,
0.63096,
0.25119,
0.11749
];
function init_mask_add_max_values() {
ma_max_i1 = Math.pow(10, (I1LIMIT + 1) / 16);
ma_max_i2 = Math.pow(10, (I2LIMIT + 1) / 16);
ma_max_m = Math.pow(10, MLIMIT / 10);
}
var table1 = [
3.3246 * 3.3246,
3.23837 * 3.23837,
3.15437 * 3.15437,
3.00412 * 3.00412,
2.86103 * 2.86103,
2.65407 * 2.65407,
2.46209 * 2.46209,
2.284 * 2.284,
2.11879 * 2.11879,
1.96552 * 1.96552,
1.82335 * 1.82335,
1.69146 * 1.69146,
1.56911 * 1.56911,
1.46658 * 1.46658,
1.37074 * 1.37074,
1.31036 * 1.31036,
1.25264 * 1.25264,
1.20648 * 1.20648,
1.16203 * 1.16203,
1.12765 * 1.12765,
1.09428 * 1.09428,
1.0659 * 1.0659,
1.03826 * 1.03826,
1.01895 * 1.01895,
1
];
var table2 = [
1.33352 * 1.33352,
1.35879 * 1.35879,
1.38454 * 1.38454,
1.39497 * 1.39497,
1.40548 * 1.40548,
1.3537 * 1.3537,
1.30382 * 1.30382,
1.22321 * 1.22321,
1.14758 * 1.14758,
1
];
var table3 = [
2.35364 * 2.35364,
2.29259 * 2.29259,
2.23313 * 2.23313,
2.12675 * 2.12675,
2.02545 * 2.02545,
1.87894 * 1.87894,
1.74303 * 1.74303,
1.61695 * 1.61695,
1.49999 * 1.49999,
1.39148 * 1.39148,
1.29083 * 1.29083,
1.19746 * 1.19746,
1.11084 * 1.11084,
1.03826 * 1.03826
];
function mask_add(m1, m2, kk, b, gfc, shortblock) {
var ratio;
if (m2 > m1) {
if (m2 < m1 * ma_max_i2)
ratio = m2 / m1;
else
return m1 + m2;
} else {
if (m1 >= m2 * ma_max_i2)
return m1 + m2;
ratio = m1 / m2;
}
assert$3(m1 >= 0);
assert$3(m2 >= 0);
m1 += m2;
if (b + 3 <= 3 + 3) {
if (ratio >= ma_max_i1) {
return m1;
}
var i = 0 | Util$3.FAST_LOG10_X(ratio, 16);
return m1 * table2[i];
}
var i = 0 | Util$3.FAST_LOG10_X(ratio, 16);
if (shortblock != 0) {
m2 = gfc.ATH.cb_s[kk] * gfc.ATH.adjust;
} else {
m2 = gfc.ATH.cb_l[kk] * gfc.ATH.adjust;
}
assert$3(m2 >= 0);
if (m1 < ma_max_m * m2) {
if (m1 > m2) {
var f, r;
f = 1;
if (i <= 13)
f = table3[i];
r = Util$3.FAST_LOG10_X(m1 / m2, 10 / 15);
return m1 * ((table1[i] - f) * r + f);
}
if (i > 13)
return m1;
return m1 * table3[i];
}
return m1 * table1[i];
}
var table2_ = [
1.33352 * 1.33352,
1.35879 * 1.35879,
1.38454 * 1.38454,
1.39497 * 1.39497,
1.40548 * 1.40548,
1.3537 * 1.3537,
1.30382 * 1.30382,
1.22321 * 1.22321,
1.14758 * 1.14758,
1
];
function vbrpsy_mask_add(m1, m2, b) {
var ratio;
if (m1 < 0) {
m1 = 0;
}
if (m2 < 0) {
m2 = 0;
}
if (m1 <= 0) {
return m2;
}
if (m2 <= 0) {
return m1;
}
if (m2 > m1) {
ratio = m2 / m1;
} else {
ratio = m1 / m2;
}
if (-2 <= b && b <= 2) {
if (ratio >= ma_max_i1) {
return m1 + m2;
} else {
var i = 0 | Util$3.FAST_LOG10_X(ratio, 16);
return (m1 + m2) * table2_[i];
}
}
if (ratio < ma_max_i2) {
return m1 + m2;
}
if (m1 < m2) {
m1 = m2;
}
return m1;
}
function calc_interchannel_masking(gfp, ratio) {
var gfc = gfp.internal_flags;
if (gfc.channels_out > 1) {
for (var sb = 0; sb < Encoder_1.SBMAX_l; sb++) {
var l = gfc.thm[0].l[sb];
var r = gfc.thm[1].l[sb];
gfc.thm[0].l[sb] += r * ratio;
gfc.thm[1].l[sb] += l * ratio;
}
for (var sb = 0; sb < Encoder_1.SBMAX_s; sb++) {
for (var sblock = 0; sblock < 3; sblock++) {
var l = gfc.thm[0].s[sb][sblock];
var r = gfc.thm[1].s[sb][sblock];
gfc.thm[0].s[sb][sblock] += r * ratio;
gfc.thm[1].s[sb][sblock] += l * ratio;
}
}
}
}
function msfix1(gfc) {
for (var sb = 0; sb < Encoder_1.SBMAX_l; sb++) {
if (gfc.thm[0].l[sb] > 1.58 * gfc.thm[1].l[sb] || gfc.thm[1].l[sb] > 1.58 * gfc.thm[0].l[sb])
continue;
var mld = gfc.mld_l[sb] * gfc.en[3].l[sb];
var rmid = Math.max(
gfc.thm[2].l[sb],
Math.min(gfc.thm[3].l[sb], mld)
);
mld = gfc.mld_l[sb] * gfc.en[2].l[sb];
var rside = Math.max(
gfc.thm[3].l[sb],
Math.min(gfc.thm[2].l[sb], mld)
);
gfc.thm[2].l[sb] = rmid;
gfc.thm[3].l[sb] = rside;
}
for (var sb = 0; sb < Encoder_1.SBMAX_s; sb++) {
for (var sblock = 0; sblock < 3; sblock++) {
if (gfc.thm[0].s[sb][sblock] > 1.58 * gfc.thm[1].s[sb][sblock] || gfc.thm[1].s[sb][sblock] > 1.58 * gfc.thm[0].s[sb][sblock])
continue;
var mld = gfc.mld_s[sb] * gfc.en[3].s[sb][sblock];
var rmid = Math.max(
gfc.thm[2].s[sb][sblock],
Math.min(gfc.thm[3].s[sb][sblock], mld)
);
mld = gfc.mld_s[sb] * gfc.en[2].s[sb][sblock];
var rside = Math.max(
gfc.thm[3].s[sb][sblock],
Math.min(gfc.thm[2].s[sb][sblock], mld)
);
gfc.thm[2].s[sb][sblock] = rmid;
gfc.thm[3].s[sb][sblock] = rside;
}
}
}
function ns_msfix(gfc, msfix, athadjust) {
var msfix2 = msfix;
var athlower = Math.pow(10, athadjust);
msfix *= 2;
msfix2 *= 2;
for (var sb = 0; sb < Encoder_1.SBMAX_l; sb++) {
var thmLR, thmM, thmS, ath;
ath = gfc.ATH.cb_l[gfc.bm_l[sb]] * athlower;
thmLR = Math.min(
Math.max(gfc.thm[0].l[sb], ath),
Math.max(gfc.thm[1].l[sb], ath)
);
thmM = Math.max(gfc.thm[2].l[sb], ath);
thmS = Math.max(gfc.thm[3].l[sb], ath);
if (thmLR * msfix < thmM + thmS) {
var f = thmLR * msfix2 / (thmM + thmS);
thmM *= f;
thmS *= f;
assert$3(thmM + thmS > 0);
}
gfc.thm[2].l[sb] = Math.min(thmM, gfc.thm[2].l[sb]);
gfc.thm[3].l[sb] = Math.min(thmS, gfc.thm[3].l[sb]);
}
athlower *= Encoder_1.BLKSIZE_s / Encoder_1.BLKSIZE;
for (var sb = 0; sb < Encoder_1.SBMAX_s; sb++) {
for (var sblock = 0; sblock < 3; sblock++) {
var thmLR, thmM, thmS, ath;
ath = gfc.ATH.cb_s[gfc.bm_s[sb]] * athlower;
thmLR = Math.min(
Math.max(gfc.thm[0].s[sb][sblock], ath),
Math.max(gfc.thm[1].s[sb][sblock], ath)
);
thmM = Math.max(gfc.thm[2].s[sb][sblock], ath);
thmS = Math.max(gfc.thm[3].s[sb][sblock], ath);
if (thmLR * msfix < thmM + thmS) {
var f = thmLR * msfix / (thmM + thmS);
thmM *= f;
thmS *= f;
assert$3(thmM + thmS > 0);
}
gfc.thm[2].s[sb][sblock] = Math.min(
gfc.thm[2].s[sb][sblock],
thmM
);
gfc.thm[3].s[sb][sblock] = Math.min(
gfc.thm[3].s[sb][sblock],
thmS
);
}
}
}
function convert_partition2scalefac_s(gfc, eb, thr, chn, sblock) {
var sb, b;
var enn = 0;
var thmm = 0;
for (sb = b = 0; sb < Encoder_1.SBMAX_s; ++b, ++sb) {
var bo_s_sb = gfc.bo_s[sb];
var npart_s = gfc.npart_s;
var b_lim = bo_s_sb < npart_s ? bo_s_sb : npart_s;
while (b < b_lim) {
assert$3(eb[b] >= 0);
assert$3(thr[b] >= 0);
enn += eb[b];
thmm += thr[b];
b++;
}
gfc.en[chn].s[sb][sblock] = enn;
gfc.thm[chn].s[sb][sblock] = thmm;
if (b >= npart_s) {
++sb;
break;
}
assert$3(eb[b] >= 0);
assert$3(thr[b] >= 0);
{
var w_curr = gfc.PSY.bo_s_weight[sb];
var w_next = 1 - w_curr;
enn = w_curr * eb[b];
thmm = w_curr * thr[b];
gfc.en[chn].s[sb][sblock] += enn;
gfc.thm[chn].s[sb][sblock] += thmm;
enn = w_next * eb[b];
thmm = w_next * thr[b];
}
}
for (; sb < Encoder_1.SBMAX_s; ++sb) {
gfc.en[chn].s[sb][sblock] = 0;
gfc.thm[chn].s[sb][sblock] = 0;
}
}
function convert_partition2scalefac_l(gfc, eb, thr, chn) {
var sb, b;
var enn = 0;
var thmm = 0;
for (sb = b = 0; sb < Encoder_1.SBMAX_l; ++b, ++sb) {
var bo_l_sb = gfc.bo_l[sb];
var npart_l = gfc.npart_l;
var b_lim = bo_l_sb < npart_l ? bo_l_sb : npart_l;
while (b < b_lim) {
assert$3(eb[b] >= 0);
assert$3(thr[b] >= 0);
enn += eb[b];
thmm += thr[b];
b++;
}
gfc.en[chn].l[sb] = enn;
gfc.thm[chn].l[sb] = thmm;
if (b >= npart_l) {
++sb;
break;
}
assert$3(eb[b] >= 0);
assert$3(thr[b] >= 0);
{
var w_curr = gfc.PSY.bo_l_weight[sb];
var w_next = 1 - w_curr;
enn = w_curr * eb[b];
thmm = w_curr * thr[b];
gfc.en[chn].l[sb] += enn;
gfc.thm[chn].l[sb] += thmm;
enn = w_next * eb[b];
thmm = w_next * thr[b];
}
}
for (; sb < Encoder_1.SBMAX_l; ++sb) {
gfc.en[chn].l[sb] = 0;
gfc.thm[chn].l[sb] = 0;
}
}
function compute_masking_s(gfp, fftenergy_s, eb, thr, chn, sblock) {
var gfc = gfp.internal_flags;
var j, b;
for (b = j = 0; b < gfc.npart_s; ++b) {
var ebb = 0, m = 0;
var n = gfc.numlines_s[b];
for (var i = 0; i < n; ++i, ++j) {
var el = fftenergy_s[sblock][j];
ebb += el;
if (m < el)
m = el;
}
eb[b] = ebb;
}
assert$3(b == gfc.npart_s);
assert$3(j == 129);
for (j = b = 0; b < gfc.npart_s; b++) {
var kk = gfc.s3ind_s[b][0];
var ecb = gfc.s3_ss[j++] * eb[kk];
++kk;
while (kk <= gfc.s3ind_s[b][1]) {
ecb += gfc.s3_ss[j] * eb[kk];
++j;
++kk;
}
{
var x = rpelev_s * gfc.nb_s1[chn][b];
thr[b] = Math.min(ecb, x);
}
if (gfc.blocktype_old[chn & 1] == Encoder_1.SHORT_TYPE) {
var x = rpelev2_s * gfc.nb_s2[chn][b];
var y = thr[b];
thr[b] = Math.min(x, y);
}
gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b];
gfc.nb_s1[chn][b] = ecb;
assert$3(thr[b] >= 0);
}
for (; b <= Encoder_1.CBANDS; ++b) {
eb[b] = 0;
thr[b] = 0;
}
}
function block_type_set(gfp, uselongblock, blocktype_d, blocktype) {
var gfc = gfp.internal_flags;
if (gfp.short_blocks == ShortBlock$3.short_block_coupled && !(uselongblock[0] != 0 && uselongblock[1] != 0))
uselongblock[0] = uselongblock[1] = 0;
for (var chn = 0; chn < gfc.channels_out; chn++) {
blocktype[chn] = Encoder_1.NORM_TYPE;
if (gfp.short_blocks == ShortBlock$3.short_block_dispensed)
uselongblock[chn] = 1;
if (gfp.short_blocks == ShortBlock$3.short_block_forced)
uselongblock[chn] = 0;
if (uselongblock[chn] != 0) {
assert$3(gfc.blocktype_old[chn] != Encoder_1.START_TYPE);
if (gfc.blocktype_old[chn] == Encoder_1.SHORT_TYPE)
blocktype[chn] = Encoder_1.STOP_TYPE;
} else {
blocktype[chn] = Encoder_1.SHORT_TYPE;
if (gfc.blocktype_old[chn] == Encoder_1.NORM_TYPE) {
gfc.blocktype_old[chn] = Encoder_1.START_TYPE;
}
if (gfc.blocktype_old[chn] == Encoder_1.STOP_TYPE)
gfc.blocktype_old[chn] = Encoder_1.SHORT_TYPE;
}
blocktype_d[chn] = gfc.blocktype_old[chn];
gfc.blocktype_old[chn] = blocktype[chn];
}
}
function NS_INTERP(x, y, r) {
if (r >= 1) {
return x;
}
if (r <= 0)
return y;
if (y > 0) {
return Math.pow(x / y, r) * y;
}
return 0;
}
var regcoef_s = [
11.8,
13.6,
17.2,
32,
46.5,
51.3,
57.5,
67.1,
71.5,
84.6,
97.6,
130
/* 255.8 */
];
function pecalc_s(mr, masking_lower) {
var pe_s = 1236.28 / 4;
for (var sb = 0; sb < Encoder_1.SBMAX_s - 1; sb++) {
for (var sblock = 0; sblock < 3; sblock++) {
var thm = mr.thm.s[sb][sblock];
assert$3(sb < regcoef_s.length);
if (thm > 0) {
var x = thm * masking_lower;
var en = mr.en.s[sb][sblock];
if (en > x) {
if (en > x * 1e10) {
pe_s += regcoef_s[sb] * (10 * LOG10);
} else {
assert$3(x > 0);
pe_s += regcoef_s[sb] * Util$3.FAST_LOG10(en / x);
}
}
}
}
}
return pe_s;
}
var regcoef_l = [
6.8,
5.8,
5.8,
6.4,
6.5,
9.9,
12.1,
14.4,
15,
18.9,
21.6,
26.9,
34.2,
40.2,
46.8,
56.5,
60.7,
73.9,
85.7,
93.4,
126.1
/* 241.3 */
];
function pecalc_l(mr, masking_lower) {
var pe_l = 1124.23 / 4;
for (var sb = 0; sb < Encoder_1.SBMAX_l - 1; sb++) {
var thm = mr.thm.l[sb];
assert$3(sb < regcoef_l.length);
if (thm > 0) {
var x = thm * masking_lower;
var en = mr.en.l[sb];
if (en > x) {
if (en > x * 1e10) {
pe_l += regcoef_l[sb] * (10 * LOG10);
} else {
assert$3(x > 0);
pe_l += regcoef_l[sb] * Util$3.FAST_LOG10(en / x);
}
}
}
}
return pe_l;
}
function calc_energy(gfc, fftenergy, eb, max, avg) {
var b, j;
for (b = j = 0; b < gfc.npart_l; ++b) {
var ebb = 0, m = 0;
var i;
for (i = 0; i < gfc.numlines_l[b]; ++i, ++j) {
var el = fftenergy[j];
assert$3(el >= 0);
ebb += el;
if (m < el)
m = el;
}
eb[b] = ebb;
max[b] = m;
avg[b] = ebb * gfc.rnumlines_l[b];
assert$3(gfc.rnumlines_l[b] >= 0);
assert$3(ebb >= 0);
assert$3(eb[b] >= 0);
assert$3(max[b] >= 0);
assert$3(avg[b] >= 0);
}
}
function calc_mask_index_l(gfc, max, avg, mask_idx) {
var last_tab_entry = tab.length - 1;
var b = 0;
var a = avg[b] + avg[b + 1];
assert$3(a >= 0);
if (a > 0) {
var m = max[b];
if (m < max[b + 1])
m = max[b + 1];
assert$3(gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1 > 0);
a = 20 * (m * 2 - a) / (a * (gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
var k = 0 | a;
if (k > last_tab_entry)
k = last_tab_entry;
mask_idx[b] = k;
} else {
mask_idx[b] = 0;
}
for (b = 1; b < gfc.npart_l - 1; b++) {
a = avg[b - 1] + avg[b] + avg[b + 1];
assert$3(a >= 0);
if (a > 0) {
var m = max[b - 1];
if (m < max[b])
m = max[b];
if (m < max[b + 1])
m = max[b + 1];
assert$3(gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1 > 0);
a = 20 * (m * 3 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
var k = 0 | a;
if (k > last_tab_entry)
k = last_tab_entry;
mask_idx[b] = k;
} else {
mask_idx[b] = 0;
}
}
assert$3(b > 0);
assert$3(b == gfc.npart_l - 1);
a = avg[b - 1] + avg[b];
assert$3(a >= 0);
if (a > 0) {
var m = max[b - 1];
if (m < max[b])
m = max[b];
assert$3(gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1 > 0);
a = 20 * (m * 2 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1));
var k = 0 | a;
if (k > last_tab_entry)
k = last_tab_entry;
mask_idx[b] = k;
} else {
mask_idx[b] = 0;
}
assert$3(b == gfc.npart_l - 1);
}
var fircoef = [
-865163e-23 * 2,
-851586e-8 * 2,
-674764e-23 * 2,
0.0209036 * 2,
-336639e-22 * 2,
-0.0438162 * 2,
-154175e-22 * 2,
0.0931738 * 2,
-552212e-22 * 2,
-0.313819 * 2
];
this.L3psycho_anal_ns = function(gfp, buffer, bufPos, gr_out, masking_ratio, masking_MS_ratio, percep_entropy, percep_MS_entropy, energy, blocktype_d) {
var gfc = gfp.internal_flags;
var wsamp_L = new_float_n$3([2, Encoder_1.BLKSIZE]);
var wsamp_S = new_float_n$3([2, 3, Encoder_1.BLKSIZE_s]);
var eb_l = new_float$3(Encoder_1.CBANDS + 1);
var eb_s = new_float$3(Encoder_1.CBANDS + 1);
var thr = new_float$3(Encoder_1.CBANDS + 2);
var blocktype = new_int$3(2), uselongblock = new_int$3(2);
var numchn, chn;
var b, i, j, k;
var sb, sblock;
var ns_hpfsmpl = new_float_n$3([2, 576]);
var pcfact;
var mask_idx_l = new_int$3(Encoder_1.CBANDS + 2), mask_idx_s = new_int$3(Encoder_1.CBANDS + 2);
Arrays$3.fill(mask_idx_s, 0);
numchn = gfc.channels_out;
if (gfp.mode == MPEGMode.JOINT_STEREO)
numchn = 4;
if (gfp.VBR == VbrMode$3.vbr_off)
pcfact = gfc.ResvMax == 0 ? 0 : gfc.ResvSize / gfc.ResvMax * 0.5;
else if (gfp.VBR == VbrMode$3.vbr_rh || gfp.VBR == VbrMode$3.vbr_mtrh || gfp.VBR == VbrMode$3.vbr_mt) {
pcfact = 0.6;
} else
pcfact = 1;
for (chn = 0; chn < gfc.channels_out; chn++) {
var firbuf2 = buffer[chn];
var firbufPos = bufPos + 576 - 350 - NSFIRLEN + 192;
assert$3(fircoef.length == (NSFIRLEN - 1) / 2);
for (i = 0; i < 576; i++) {
var sum1, sum2;
sum1 = firbuf2[firbufPos + i + 10];
sum2 = 0;
for (j = 0; j < (NSFIRLEN - 1) / 2 - 1; j += 2) {
sum1 += fircoef[j] * (firbuf2[firbufPos + i + j] + firbuf2[firbufPos + i + NSFIRLEN - j]);
sum2 += fircoef[j + 1] * (firbuf2[firbufPos + i + j + 1] + firbuf2[firbufPos + i + NSFIRLEN - j - 1]);
}
ns_hpfsmpl[chn][i] = sum1 + sum2;
}
masking_ratio[gr_out][chn].en.assign(gfc.en[chn]);
masking_ratio[gr_out][chn].thm.assign(gfc.thm[chn]);
if (numchn > 2) {
masking_MS_ratio[gr_out][chn].en.assign(gfc.en[chn + 2]);
masking_MS_ratio[gr_out][chn].thm.assign(gfc.thm[chn + 2]);
}
}
for (chn = 0; chn < numchn; chn++) {
var wsamp_l;
var wsamp_s;
var en_subshort = new_float$3(12);
var en_short = [0, 0, 0, 0];
var attack_intensity = new_float$3(12);
var ns_uselongblock = 1;
var attackThreshold;
var max = new_float$3(Encoder_1.CBANDS), avg = new_float$3(Encoder_1.CBANDS);
var ns_attacks = [0, 0, 0, 0];
var fftenergy = new_float$3(Encoder_1.HBLKSIZE);
var fftenergy_s = new_float_n$3([3, Encoder_1.HBLKSIZE_s]);
assert$3(gfc.npart_s <= Encoder_1.CBANDS);
assert$3(gfc.npart_l <= Encoder_1.CBANDS);
for (i = 0; i < 3; i++) {
en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
assert$3(gfc.nsPsy.last_en_subshort[chn][i + 4] > 0);
attack_intensity[i] = en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4];
en_short[0] += en_subshort[i];
}
if (chn == 2) {
for (i = 0; i < 576; i++) {
var l, r;
l = ns_hpfsmpl[0][i];
r = ns_hpfsmpl[1][i];
ns_hpfsmpl[0][i] = l + r;
ns_hpfsmpl[1][i] = l - r;
}
}
{
var pf = ns_hpfsmpl[chn & 1];
var pfPos = 0;
for (i = 0; i < 9; i++) {
var pfe = pfPos + 576 / 9;
var p = 1;
for (; pfPos < pfe; pfPos++)
if (p < Math.abs(pf[pfPos]))
p = Math.abs(pf[pfPos]);
gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p;
en_short[1 + i / 3] += p;
if (p > en_subshort[i + 3 - 2]) {
assert$3(en_subshort[i + 3 - 2] > 0);
p = p / en_subshort[i + 3 - 2];
} else if (en_subshort[i + 3 - 2] > p * 10) {
assert$3(p > 0);
p = en_subshort[i + 3 - 2] / (p * 10);
} else
p = 0;
attack_intensity[i + 3] = p;
}
}
if (gfp.analysis) {
var x = attack_intensity[0];
for (i = 1; i < 12; i++)
if (x < attack_intensity[i])
x = attack_intensity[i];
gfc.pinfo.ers[gr_out][chn] = gfc.pinfo.ers_save[chn];
gfc.pinfo.ers_save[chn] = x;
}
attackThreshold = chn == 3 ? gfc.nsPsy.attackthre_s : gfc.nsPsy.attackthre;
for (i = 0; i < 12; i++)
if (0 == ns_attacks[i / 3] && attack_intensity[i] > attackThreshold)
ns_attacks[i / 3] = i % 3 + 1;
for (i = 1; i < 4; i++) {
var ratio;
if (en_short[i - 1] > en_short[i]) {
assert$3(en_short[i] > 0);
ratio = en_short[i - 1] / en_short[i];
} else {
assert$3(en_short[i - 1] > 0);
ratio = en_short[i] / en_short[i - 1];
}
if (ratio < 1.7) {
ns_attacks[i] = 0;
if (i == 1)
ns_attacks[0] = 0;
}
}
if (ns_attacks[0] != 0 && gfc.nsPsy.lastAttacks[chn] != 0)
ns_attacks[0] = 0;
if (gfc.nsPsy.lastAttacks[chn] == 3 || ns_attacks[0] + ns_attacks[1] + ns_attacks[2] + ns_attacks[3] != 0) {
ns_uselongblock = 0;
if (ns_attacks[1] != 0 && ns_attacks[0] != 0)
ns_attacks[1] = 0;
if (ns_attacks[2] != 0 && ns_attacks[1] != 0)
ns_attacks[2] = 0;
if (ns_attacks[3] != 0 && ns_attacks[2] != 0)
ns_attacks[3] = 0;
}
if (chn < 2) {
uselongblock[chn] = ns_uselongblock;
} else {
if (ns_uselongblock == 0) {
uselongblock[0] = uselongblock[1] = 0;
}
}
energy[chn] = gfc.tot_ener[chn];
wsamp_s = wsamp_S;
wsamp_l = wsamp_L;
compute_ffts(
gfp,
fftenergy,
fftenergy_s,
wsamp_l,
chn & 1,
wsamp_s,
chn & 1,
gr_out,
chn,
buffer,
bufPos
);
calc_energy(gfc, fftenergy, eb_l, max, avg);
calc_mask_index_l(gfc, max, avg, mask_idx_l);
for (sblock = 0; sblock < 3; sblock++) {
var enn, thmm;
compute_masking_s(gfp, fftenergy_s, eb_s, thr, chn, sblock);
convert_partition2scalefac_s(gfc, eb_s, thr, chn, sblock);
for (sb = 0; sb < Encoder_1.SBMAX_s; sb++) {
thmm = gfc.thm[chn].s[sb][sblock];
thmm *= NS_PREECHO_ATT0;
if (ns_attacks[sblock] >= 2 || ns_attacks[sblock + 1] == 1) {
var idx = sblock != 0 ? sblock - 1 : 2;
var p = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT1 * pcfact
);
thmm = Math.min(thmm, p);
}
if (ns_attacks[sblock] == 1) {
var idx = sblock != 0 ? sblock - 1 : 2;
var p = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p);
} else if (sblock != 0 && ns_attacks[sblock - 1] == 3 || sblock == 0 && gfc.nsPsy.lastAttacks[chn] == 3) {
var idx = sblock != 2 ? sblock + 1 : 0;
var p = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p);
}
enn = en_subshort[sblock * 3 + 3] + en_subshort[sblock * 3 + 4] + en_subshort[sblock * 3 + 5];
if (en_subshort[sblock * 3 + 5] * 6 < enn) {
thmm *= 0.5;
if (en_subshort[sblock * 3 + 4] * 6 < enn)
thmm *= 0.5;
}
gfc.thm[chn].s[sb][sblock] = thmm;
}
}
gfc.nsPsy.lastAttacks[chn] = ns_attacks[2];
k = 0;
{
for (b = 0; b < gfc.npart_l; b++) {
var kk = gfc.s3ind[b][0];
var eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
var ecb = gfc.s3_ll[k++] * eb2;
while (++kk <= gfc.s3ind[b][1]) {
eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
ecb = mask_add(
ecb,
gfc.s3_ll[k++] * eb2,
kk,
kk - b,
gfc,
0
);
}
ecb *= 0.158489319246111;
if (gfc.blocktype_old[chn & 1] == Encoder_1.SHORT_TYPE)
thr[b] = ecb;
else
thr[b] = NS_INTERP(
Math.min(ecb, Math.min(rpelev * gfc.nb_1[chn][b], rpelev2 * gfc.nb_2[chn][b])),
ecb,
pcfact
);
gfc.nb_2[chn][b] = gfc.nb_1[chn][b];
gfc.nb_1[chn][b] = ecb;
}
}
for (; b <= Encoder_1.CBANDS; ++b) {
eb_l[b] = 0;
thr[b] = 0;
}
convert_partition2scalefac_l(gfc, eb_l, thr, chn);
}
if (gfp.mode == MPEGMode.STEREO || gfp.mode == MPEGMode.JOINT_STEREO) {
if (gfp.interChRatio > 0) {
calc_interchannel_masking(gfp, gfp.interChRatio);
}
}
if (gfp.mode == MPEGMode.JOINT_STEREO) {
var msfix;
msfix1(gfc);
msfix = gfp.msfix;
if (Math.abs(msfix) > 0)
ns_msfix(gfc, msfix, gfp.ATHlower * gfc.ATH.adjust);
}
block_type_set(gfp, uselongblock, blocktype_d, blocktype);
for (chn = 0; chn < numchn; chn++) {
var ppe;
var ppePos = 0;
var type;
var mr;
if (chn > 1) {
ppe = percep_MS_entropy;
ppePos = -2;
type = Encoder_1.NORM_TYPE;
if (blocktype_d[0] == Encoder_1.SHORT_TYPE || blocktype_d[1] == Encoder_1.SHORT_TYPE)
type = Encoder_1.SHORT_TYPE;
mr = masking_MS_ratio[gr_out][chn - 2];
} else {
ppe = percep_entropy;
ppePos = 0;
type = blocktype_d[chn];
mr = masking_ratio[gr_out][chn];
}
if (type == Encoder_1.SHORT_TYPE)
ppe[ppePos + chn] = pecalc_s(mr, gfc.masking_lower);
else
ppe[ppePos + chn] = pecalc_l(mr, gfc.masking_lower);
if (gfp.analysis)
gfc.pinfo.pe[gr_out][chn] = ppe[ppePos + chn];
}
return 0;
};
function vbrpsy_compute_fft_l(gfp, buffer, bufPos, chn, gr_out, fftenergy, wsamp_l, wsamp_lPos) {
var gfc = gfp.internal_flags;
if (chn < 2) {
fft.fft_long(gfc, wsamp_l[wsamp_lPos], chn, buffer, bufPos);
} else if (chn == 2) {
for (var j = Encoder_1.BLKSIZE - 1; j >= 0; --j) {
var l = wsamp_l[wsamp_lPos + 0][j];
var r = wsamp_l[wsamp_lPos + 1][j];
wsamp_l[wsamp_lPos + 0][j] = (l + r) * Util$3.SQRT2 * 0.5;
wsamp_l[wsamp_lPos + 1][j] = (l - r) * Util$3.SQRT2 * 0.5;
}
}
fftenergy[0] = NON_LINEAR_SCALE_ENERGY(wsamp_l[wsamp_lPos + 0][0]);
fftenergy[0] *= fftenergy[0];
for (var j = Encoder_1.BLKSIZE / 2 - 1; j >= 0; --j) {
var re = wsamp_l[wsamp_lPos + 0][Encoder_1.BLKSIZE / 2 - j];
var im = wsamp_l[wsamp_lPos + 0][Encoder_1.BLKSIZE / 2 + j];
fftenergy[Encoder_1.BLKSIZE / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
}
{
var totalenergy = 0;
for (var j = 11; j < Encoder_1.HBLKSIZE; j++)
totalenergy += fftenergy[j];
gfc.tot_ener[chn] = totalenergy;
}
if (gfp.analysis) {
for (var j = 0; j < Encoder_1.HBLKSIZE; j++) {
gfc.pinfo.energy[gr_out][chn][j] = gfc.pinfo.energy_save[chn][j];
gfc.pinfo.energy_save[chn][j] = fftenergy[j];
}
gfc.pinfo.pe[gr_out][chn] = gfc.pe[chn];
}
}
function vbrpsy_compute_fft_s(gfp, buffer, bufPos, chn, sblock, fftenergy_s, wsamp_s, wsamp_sPos) {
var gfc = gfp.internal_flags;
if (sblock == 0 && chn < 2) {
fft.fft_short(gfc, wsamp_s[wsamp_sPos], chn, buffer, bufPos);
}
if (chn == 2) {
for (var j = Encoder_1.BLKSIZE_s - 1; j >= 0; --j) {
var l = wsamp_s[wsamp_sPos + 0][sblock][j];
var r = wsamp_s[wsamp_sPos + 1][sblock][j];
wsamp_s[wsamp_sPos + 0][sblock][j] = (l + r) * Util$3.SQRT2 * 0.5;
wsamp_s[wsamp_sPos + 1][sblock][j] = (l - r) * Util$3.SQRT2 * 0.5;
}
}
fftenergy_s[sblock][0] = wsamp_s[wsamp_sPos + 0][sblock][0];
fftenergy_s[sblock][0] *= fftenergy_s[sblock][0];
for (var j = Encoder_1.BLKSIZE_s / 2 - 1; j >= 0; --j) {
var re = wsamp_s[wsamp_sPos + 0][sblock][Encoder_1.BLKSIZE_s / 2 - j];
var im = wsamp_s[wsamp_sPos + 0][sblock][Encoder_1.BLKSIZE_s / 2 + j];
fftenergy_s[sblock][Encoder_1.BLKSIZE_s / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
}
}
function vbrpsy_compute_loudness_approximation_l(gfp, gr_out, chn, fftenergy) {
var gfc = gfp.internal_flags;
if (gfp.athaa_loudapprox == 2 && chn < 2) {
gfc.loudness_sq[gr_out][chn] = gfc.loudness_sq_save[chn];
gfc.loudness_sq_save[chn] = psycho_loudness_approx(fftenergy, gfc);
}
}
var fircoef_ = [
-865163e-23 * 2,
-851586e-8 * 2,
-674764e-23 * 2,
0.0209036 * 2,
-336639e-22 * 2,
-0.0438162 * 2,
-154175e-22 * 2,
0.0931738 * 2,
-552212e-22 * 2,
-0.313819 * 2
];
function vbrpsy_attack_detection(gfp, buffer, bufPos, gr_out, masking_ratio, masking_MS_ratio, energy, sub_short_factor, ns_attacks, uselongblock) {
var ns_hpfsmpl = new_float_n$3([2, 576]);
var gfc = gfp.internal_flags;
var n_chn_out = gfc.channels_out;
var n_chn_psy = gfp.mode == MPEGMode.JOINT_STEREO ? 4 : n_chn_out;
for (var chn = 0; chn < n_chn_out; chn++) {
firbuf = buffer[chn];
var firbufPos = bufPos + 576 - 350 - NSFIRLEN + 192;
assert$3(fircoef_.length == (NSFIRLEN - 1) / 2);
for (var i = 0; i < 576; i++) {
var sum1, sum2;
sum1 = firbuf[firbufPos + i + 10];
sum2 = 0;
for (var j = 0; j < (NSFIRLEN - 1) / 2 - 1; j += 2) {
sum1 += fircoef_[j] * (firbuf[firbufPos + i + j] + firbuf[firbufPos + i + NSFIRLEN - j]);
sum2 += fircoef_[j + 1] * (firbuf[firbufPos + i + j + 1] + firbuf[firbufPos + i + NSFIRLEN - j - 1]);
}
ns_hpfsmpl[chn][i] = sum1 + sum2;
}
masking_ratio[gr_out][chn].en.assign(gfc.en[chn]);
masking_ratio[gr_out][chn].thm.assign(gfc.thm[chn]);
if (n_chn_psy > 2) {
masking_MS_ratio[gr_out][chn].en.assign(gfc.en[chn + 2]);
masking_MS_ratio[gr_out][chn].thm.assign(gfc.thm[chn + 2]);
}
}
for (var chn = 0; chn < n_chn_psy; chn++) {
var attack_intensity = new_float$3(12);
var en_subshort = new_float$3(12);
var en_short = [0, 0, 0, 0];
var pf = ns_hpfsmpl[chn & 1];
var pfPos = 0;
var attackThreshold = chn == 3 ? gfc.nsPsy.attackthre_s : gfc.nsPsy.attackthre;
var ns_uselongblock = 1;
if (chn == 2) {
for (var i = 0, j = 576; j > 0; ++i, --j) {
var l = ns_hpfsmpl[0][i];
var r = ns_hpfsmpl[1][i];
ns_hpfsmpl[0][i] = l + r;
ns_hpfsmpl[1][i] = l - r;
}
}
for (var i = 0; i < 3; i++) {
en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
assert$3(gfc.nsPsy.last_en_subshort[chn][i + 4] > 0);
attack_intensity[i] = en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4];
en_short[0] += en_subshort[i];
}
for (var i = 0; i < 9; i++) {
var pfe = pfPos + 576 / 9;
var p = 1;
for (; pfPos < pfe; pfPos++)
if (p < Math.abs(pf[pfPos]))
p = Math.abs(pf[pfPos]);
gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p;
en_short[1 + i / 3] += p;
if (p > en_subshort[i + 3 - 2]) {
assert$3(en_subshort[i + 3 - 2] > 0);
p = p / en_subshort[i + 3 - 2];
} else if (en_subshort[i + 3 - 2] > p * 10) {
assert$3(p > 0);
p = en_subshort[i + 3 - 2] / (p * 10);
} else {
p = 0;
}
attack_intensity[i + 3] = p;
}
for (var i = 0; i < 3; ++i) {
var enn = en_subshort[i * 3 + 3] + en_subshort[i * 3 + 4] + en_subshort[i * 3 + 5];
var factor = 1;
if (en_subshort[i * 3 + 5] * 6 < enn) {
factor *= 0.5;
if (en_subshort[i * 3 + 4] * 6 < enn) {
factor *= 0.5;
}
}
sub_short_factor[chn][i] = factor;
}
if (gfp.analysis) {
var x = attack_intensity[0];
for (var i = 1; i < 12; i++) {
if (x < attack_intensity[i]) {
x = attack_intensity[i];
}
}
gfc.pinfo.ers[gr_out][chn] = gfc.pinfo.ers_save[chn];
gfc.pinfo.ers_save[chn] = x;
}
for (var i = 0; i < 12; i++) {
if (0 == ns_attacks[chn][i / 3] && attack_intensity[i] > attackThreshold) {
ns_attacks[chn][i / 3] = i % 3 + 1;
}
}
for (var i = 1; i < 4; i++) {
var u = en_short[i - 1];
var v = en_short[i];
var m = Math.max(u, v);
if (m < 4e4) {
if (u < 1.7 * v && v < 1.7 * u) {
if (i == 1 && ns_attacks[chn][0] <= ns_attacks[chn][i]) {
ns_attacks[chn][0] = 0;
}
ns_attacks[chn][i] = 0;
}
}
}
if (ns_attacks[chn][0] <= gfc.nsPsy.lastAttacks[chn]) {
ns_attacks[chn][0] = 0;
}
if (gfc.nsPsy.lastAttacks[chn] == 3 || ns_attacks[chn][0] + ns_attacks[chn][1] + ns_attacks[chn][2] + ns_attacks[chn][3] != 0) {
ns_uselongblock = 0;
if (ns_attacks[chn][1] != 0 && ns_attacks[chn][0] != 0) {
ns_attacks[chn][1] = 0;
}
if (ns_attacks[chn][2] != 0 && ns_attacks[chn][1] != 0) {
ns_attacks[chn][2] = 0;
}
if (ns_attacks[chn][3] != 0 && ns_attacks[chn][2] != 0) {
ns_attacks[chn][3] = 0;
}
}
if (chn < 2) {
uselongblock[chn] = ns_uselongblock;
} else {
if (ns_uselongblock == 0) {
uselongblock[0] = uselongblock[1] = 0;
}
}
energy[chn] = gfc.tot_ener[chn];
}
}
function vbrpsy_skip_masking_s(gfc, chn, sblock) {
if (sblock == 0) {
for (var b = 0; b < gfc.npart_s; b++) {
gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b];
gfc.nb_s1[chn][b] = 0;
}
}
}
function vbrpsy_skip_masking_l(gfc, chn) {
for (var b = 0; b < gfc.npart_l; b++) {
gfc.nb_2[chn][b] = gfc.nb_1[chn][b];
gfc.nb_1[chn][b] = 0;
}
}
function psyvbr_calc_mask_index_s(gfc, max, avg, mask_idx) {
var last_tab_entry = tab.length - 1;
var b = 0;
var a = avg[b] + avg[b + 1];
assert$3(a >= 0);
if (a > 0) {
var m = max[b];
if (m < max[b + 1])
m = max[b + 1];
assert$3(gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1 > 0);
a = 20 * (m * 2 - a) / (a * (gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1));
var k = 0 | a;
if (k > last_tab_entry)
k = last_tab_entry;
mask_idx[b] = k;
} else {
mask_idx[b] = 0;
}
for (b = 1; b < gfc.npart_s - 1; b++) {
a = avg[b - 1] + avg[b] + avg[b + 1];
assert$3(b + 1 < gfc.npart_s);
assert$3(a >= 0);
if (a > 0) {
var m = max[b - 1];
if (m < max[b])
m = max[b];
if (m < max[b + 1])
m = max[b + 1];
assert$3(gfc.numlines_s[b - 1] + gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1 > 0);
a = 20 * (m * 3 - a) / (a * (gfc.numlines_s[b - 1] + gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1));
var k = 0 | a;
if (k > last_tab_entry)
k = last_tab_entry;
mask_idx[b] = k;
} else {
mask_idx[b] = 0;
}
}
assert$3(b > 0);
assert$3(b == gfc.npart_s - 1);
a = avg[b - 1] + avg[b];
assert$3(a >= 0);
if (a > 0) {
var m = max[b - 1];
if (m < max[b])
m = max[b];
assert$3(gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1 > 0);
a = 20 * (m * 2 - a) / (a * (gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1));
var k = 0 | a;
if (k > last_tab_entry)
k = last_tab_entry;
mask_idx[b] = k;
} else {
mask_idx[b] = 0;
}
assert$3(b == gfc.npart_s - 1);
}
function vbrpsy_compute_masking_s(gfp, fftenergy_s, eb, thr, chn, sblock) {
var gfc = gfp.internal_flags;
var max = new float[Encoder_1.CBANDS](), avg = new_float$3(Encoder_1.CBANDS);
var i, j, b;
var mask_idx_s = new int[Encoder_1.CBANDS]();
for (b = j = 0; b < gfc.npart_s; ++b) {
var ebb = 0, m = 0;
var n = gfc.numlines_s[b];
for (i = 0; i < n; ++i, ++j) {
var el = fftenergy_s[sblock][j];
ebb += el;
if (m < el)
m = el;
}
eb[b] = ebb;
assert$3(ebb >= 0);
max[b] = m;
assert$3(n > 0);
avg[b] = ebb / n;
assert$3(avg[b] >= 0);
}
assert$3(b == gfc.npart_s);
assert$3(j == 129);
for (; b < Encoder_1.CBANDS; ++b) {
max[b] = 0;
avg[b] = 0;
}
psyvbr_calc_mask_index_s(gfc, max, avg, mask_idx_s);
for (j = b = 0; b < gfc.npart_s; b++) {
var kk = gfc.s3ind_s[b][0];
var last = gfc.s3ind_s[b][1];
var dd, dd_n;
var x, ecb, avg_mask;
dd = mask_idx_s[kk];
dd_n = 1;
ecb = gfc.s3_ss[j] * eb[kk] * tab[mask_idx_s[kk]];
++j;
++kk;
while (kk <= last) {
dd += mask_idx_s[kk];
dd_n += 1;
x = gfc.s3_ss[j] * eb[kk] * tab[mask_idx_s[kk]];
ecb = vbrpsy_mask_add(ecb, x, kk - b);
++j;
++kk;
}
dd = (1 + 2 * dd) / (2 * dd_n);
avg_mask = tab[dd] * 0.5;
ecb *= avg_mask;
thr[b] = ecb;
gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b];
gfc.nb_s1[chn][b] = ecb;
{
x = max[b];
x *= gfc.minval_s[b];
x *= avg_mask;
if (thr[b] > x) {
thr[b] = x;
}
}
if (gfc.masking_lower > 1) {
thr[b] *= gfc.masking_lower;
}
if (thr[b] > eb[b]) {
thr[b] = eb[b];
}
if (gfc.masking_lower < 1) {
thr[b] *= gfc.masking_lower;
}
assert$3(thr[b] >= 0);
}
for (; b < Encoder_1.CBANDS; ++b) {
eb[b] = 0;
thr[b] = 0;
}
}
function vbrpsy_compute_masking_l(gfc, fftenergy, eb_l, thr, chn) {
var max = new_float$3(Encoder_1.CBANDS), avg = new_float$3(Encoder_1.CBANDS);
var mask_idx_l = new_int$3(Encoder_1.CBANDS + 2);
var b;
calc_energy(gfc, fftenergy, eb_l, max, avg);
calc_mask_index_l(gfc, max, avg, mask_idx_l);
var k = 0;
for (b = 0; b < gfc.npart_l; b++) {
var x, ecb, avg_mask, t;
var kk = gfc.s3ind[b][0];
var last = gfc.s3ind[b][1];
var dd = 0, dd_n = 0;
dd = mask_idx_l[kk];
dd_n += 1;
ecb = gfc.s3_ll[k] * eb_l[kk] * tab[mask_idx_l[kk]];
++k;
++kk;
while (kk <= last) {
dd += mask_idx_l[kk];
dd_n += 1;
x = gfc.s3_ll[k] * eb_l[kk] * tab[mask_idx_l[kk]];
t = vbrpsy_mask_add(ecb, x, kk - b);
ecb = t;
++k;
++kk;
}
dd = (1 + 2 * dd) / (2 * dd_n);
avg_mask = tab[dd] * 0.5;
ecb *= avg_mask;
if (gfc.blocktype_old[chn & 1] == Encoder_1.SHORT_TYPE) {
var ecb_limit = rpelev * gfc.nb_1[chn][b];
if (ecb_limit > 0) {
thr[b] = Math.min(ecb, ecb_limit);
} else {
thr[b] = Math.min(ecb, eb_l[b] * NS_PREECHO_ATT2);
}
} else {
var ecb_limit_2 = rpelev2 * gfc.nb_2[chn][b];
var ecb_limit_1 = rpelev * gfc.nb_1[chn][b];
var ecb_limit;
if (ecb_limit_2 <= 0) {
ecb_limit_2 = ecb;
}
if (ecb_limit_1 <= 0) {
ecb_limit_1 = ecb;
}
if (gfc.blocktype_old[chn & 1] == Encoder_1.NORM_TYPE) {
ecb_limit = Math.min(ecb_limit_1, ecb_limit_2);
} else {
ecb_limit = ecb_limit_1;
}
thr[b] = Math.min(ecb, ecb_limit);
}
gfc.nb_2[chn][b] = gfc.nb_1[chn][b];
gfc.nb_1[chn][b] = ecb;
{
x = max[b];
x *= gfc.minval_l[b];
x *= avg_mask;
if (thr[b] > x) {
thr[b] = x;
}
}
if (gfc.masking_lower > 1) {
thr[b] *= gfc.masking_lower;
}
if (thr[b] > eb_l[b]) {
thr[b] = eb_l[b];
}
if (gfc.masking_lower < 1) {
thr[b] *= gfc.masking_lower;
}
assert$3(thr[b] >= 0);
}
for (; b < Encoder_1.CBANDS; ++b) {
eb_l[b] = 0;
thr[b] = 0;
}
}
function vbrpsy_compute_block_type(gfp, uselongblock) {
var gfc = gfp.internal_flags;
if (gfp.short_blocks == ShortBlock$3.short_block_coupled && !(uselongblock[0] != 0 && uselongblock[1] != 0))
uselongblock[0] = uselongblock[1] = 0;
for (var chn = 0; chn < gfc.channels_out; chn++) {
if (gfp.short_blocks == ShortBlock$3.short_block_dispensed) {
uselongblock[chn] = 1;
}
if (gfp.short_blocks == ShortBlock$3.short_block_forced) {
uselongblock[chn] = 0;
}
}
}
function vbrpsy_apply_block_type(gfp, uselongblock, blocktype_d) {
var gfc = gfp.internal_flags;
for (var chn = 0; chn < gfc.channels_out; chn++) {
var blocktype = Encoder_1.NORM_TYPE;
if (uselongblock[chn] != 0) {
assert$3(gfc.blocktype_old[chn] != Encoder_1.START_TYPE);
if (gfc.blocktype_old[chn] == Encoder_1.SHORT_TYPE)
blocktype = Encoder_1.STOP_TYPE;
} else {
blocktype = Encoder_1.SHORT_TYPE;
if (gfc.blocktype_old[chn] == Encoder_1.NORM_TYPE) {
gfc.blocktype_old[chn] = Encoder_1.START_TYPE;
}
if (gfc.blocktype_old[chn] == Encoder_1.STOP_TYPE)
gfc.blocktype_old[chn] = Encoder_1.SHORT_TYPE;
}
blocktype_d[chn] = gfc.blocktype_old[chn];
gfc.blocktype_old[chn] = blocktype;
}
}
function vbrpsy_compute_MS_thresholds(eb, thr, cb_mld, ath_cb, athadjust, msfix, n) {
var msfix2 = msfix * 2;
var athlower = msfix > 0 ? Math.pow(10, athadjust) : 1;
var rside, rmid;
for (var b = 0; b < n; ++b) {
var ebM = eb[2][b];
var ebS = eb[3][b];
var thmL = thr[0][b];
var thmR = thr[1][b];
var thmM = thr[2][b];
var thmS = thr[3][b];
if (thmL <= 1.58 * thmR && thmR <= 1.58 * thmL) {
var mld_m = cb_mld[b] * ebS;
var mld_s = cb_mld[b] * ebM;
rmid = Math.max(thmM, Math.min(thmS, mld_m));
rside = Math.max(thmS, Math.min(thmM, mld_s));
} else {
rmid = thmM;
rside = thmS;
}
if (msfix > 0) {
var thmLR, thmMS;
var ath = ath_cb[b] * athlower;
thmLR = Math.min(Math.max(thmL, ath), Math.max(thmR, ath));
thmM = Math.max(rmid, ath);
thmS = Math.max(rside, ath);
thmMS = thmM + thmS;
if (thmMS > 0 && thmLR * msfix2 < thmMS) {
var f = thmLR * msfix2 / thmMS;
thmM *= f;
thmS *= f;
assert$3(thmMS > 0);
}
rmid = Math.min(thmM, rmid);
rside = Math.min(thmS, rside);
}
if (rmid > ebM) {
rmid = ebM;
}
if (rside > ebS) {
rside = ebS;
}
thr[2][b] = rmid;
thr[3][b] = rside;
}
}
this.L3psycho_anal_vbr = function(gfp, buffer, bufPos, gr_out, masking_ratio, masking_MS_ratio, percep_entropy, percep_MS_entropy, energy, blocktype_d) {
var gfc = gfp.internal_flags;
var wsamp_l;
var wsamp_s;
var fftenergy = new_float$3(Encoder_1.HBLKSIZE);
var fftenergy_s = new_float_n$3([3, Encoder_1.HBLKSIZE_s]);
var wsamp_L = new_float_n$3([2, Encoder_1.BLKSIZE]);
var wsamp_S = new_float_n$3([2, 3, Encoder_1.BLKSIZE_s]);
var eb = new_float_n$3([4, Encoder_1.CBANDS]), thr = new_float_n$3([4, Encoder_1.CBANDS]);
var sub_short_factor = new_float_n$3([4, 3]);
var pcfact = 0.6;
var ns_attacks = [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
];
var uselongblock = new_int$3(2);
var n_chn_psy = gfp.mode == MPEGMode.JOINT_STEREO ? 4 : gfc.channels_out;
vbrpsy_attack_detection(
gfp,
buffer,
bufPos,
gr_out,
masking_ratio,
masking_MS_ratio,
energy,
sub_short_factor,
ns_attacks,
uselongblock
);
vbrpsy_compute_block_type(gfp, uselongblock);
{
for (var chn = 0; chn < n_chn_psy; chn++) {
var ch01 = chn & 1;
wsamp_l = wsamp_L;
vbrpsy_compute_fft_l(
gfp,
buffer,
bufPos,
chn,
gr_out,
fftenergy,
wsamp_l,
ch01
);
vbrpsy_compute_loudness_approximation_l(
gfp,
gr_out,
chn,
fftenergy
);
if (uselongblock[ch01] != 0) {
vbrpsy_compute_masking_l(
gfc,
fftenergy,
eb[chn],
thr[chn],
chn
);
} else {
vbrpsy_skip_masking_l(gfc, chn);
}
}
if (uselongblock[0] + uselongblock[1] == 2) {
if (gfp.mode == MPEGMode.JOINT_STEREO) {
vbrpsy_compute_MS_thresholds(
eb,
thr,
gfc.mld_cb_l,
gfc.ATH.cb_l,
gfp.ATHlower * gfc.ATH.adjust,
gfp.msfix,
gfc.npart_l
);
}
}
for (var chn = 0; chn < n_chn_psy; chn++) {
var ch01 = chn & 1;
if (uselongblock[ch01] != 0) {
convert_partition2scalefac_l(gfc, eb[chn], thr[chn], chn);
}
}
}
{
for (var sblock = 0; sblock < 3; sblock++) {
for (var chn = 0; chn < n_chn_psy; ++chn) {
var ch01 = chn & 1;
if (uselongblock[ch01] != 0) {
vbrpsy_skip_masking_s(gfc, chn, sblock);
} else {
wsamp_s = wsamp_S;
vbrpsy_compute_fft_s(
gfp,
buffer,
bufPos,
chn,
sblock,
fftenergy_s,
wsamp_s,
ch01
);
vbrpsy_compute_masking_s(
gfp,
fftenergy_s,
eb[chn],
thr[chn],
chn,
sblock
);
}
}
if (uselongblock[0] + uselongblock[1] == 0) {
if (gfp.mode == MPEGMode.JOINT_STEREO) {
vbrpsy_compute_MS_thresholds(
eb,
thr,
gfc.mld_cb_s,
gfc.ATH.cb_s,
gfp.ATHlower * gfc.ATH.adjust,
gfp.msfix,
gfc.npart_s
);
}
}
for (var chn = 0; chn < n_chn_psy; ++chn) {
var ch01 = chn & 1;
if (0 == uselongblock[ch01]) {
convert_partition2scalefac_s(
gfc,
eb[chn],
thr[chn],
chn,
sblock
);
}
}
}
for (var chn = 0; chn < n_chn_psy; chn++) {
var ch01 = chn & 1;
if (uselongblock[ch01] != 0) {
continue;
}
for (var sb = 0; sb < Encoder_1.SBMAX_s; sb++) {
var new_thmm = new_float$3(3);
for (var sblock = 0; sblock < 3; sblock++) {
var thmm = gfc.thm[chn].s[sb][sblock];
thmm *= NS_PREECHO_ATT0;
if (ns_attacks[chn][sblock] >= 2 || ns_attacks[chn][sblock + 1] == 1) {
var idx = sblock != 0 ? sblock - 1 : 2;
var p = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT1 * pcfact
);
thmm = Math.min(thmm, p);
} else if (ns_attacks[chn][sblock] == 1) {
var idx = sblock != 0 ? sblock - 1 : 2;
var p = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p);
} else if (sblock != 0 && ns_attacks[chn][sblock - 1] == 3 || sblock == 0 && gfc.nsPsy.lastAttacks[chn] == 3) {
var idx = sblock != 2 ? sblock + 1 : 0;
var p = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p);
}
thmm *= sub_short_factor[chn][sblock];
new_thmm[sblock] = thmm;
}
for (var sblock = 0; sblock < 3; sblock++) {
gfc.thm[chn].s[sb][sblock] = new_thmm[sblock];
}
}
}
}
for (var chn = 0; chn < n_chn_psy; chn++) {
gfc.nsPsy.lastAttacks[chn] = ns_attacks[chn][2];
}
vbrpsy_apply_block_type(gfp, uselongblock, blocktype_d);
for (var chn = 0; chn < n_chn_psy; chn++) {
var ppe;
var ppePos;
var type;
var mr;
if (chn > 1) {
ppe = percep_MS_entropy;
ppePos = -2;
type = Encoder_1.NORM_TYPE;
if (blocktype_d[0] == Encoder_1.SHORT_TYPE || blocktype_d[1] == Encoder_1.SHORT_TYPE)
type = Encoder_1.SHORT_TYPE;
mr = masking_MS_ratio[gr_out][chn - 2];
} else {
ppe = percep_entropy;
ppePos = 0;
type = blocktype_d[chn];
mr = masking_ratio[gr_out][chn];
}
if (type == Encoder_1.SHORT_TYPE) {
ppe[ppePos + chn] = pecalc_s(mr, gfc.masking_lower);
} else {
ppe[ppePos + chn] = pecalc_l(mr, gfc.masking_lower);
}
if (gfp.analysis) {
gfc.pinfo.pe[gr_out][chn] = ppe[ppePos + chn];
}
}
return 0;
};
function s3_func_x(bark, hf_slope) {
var tempx = bark, tempy;
if (tempx >= 0) {
tempy = -tempx * 27;
} else {
tempy = tempx * hf_slope;
}
if (tempy <= -72) {
return 0;
}
return Math.exp(tempy * LN_TO_LOG10);
}
function norm_s3_func_x(hf_slope) {
var lim_a = 0, lim_b = 0;
{
var x = 0, l, h;
for (x = 0; s3_func_x(x, hf_slope) > 1e-20; x -= 1)
;
l = x;
h = 0;
while (Math.abs(h - l) > 1e-12) {
x = (h + l) / 2;
if (s3_func_x(x, hf_slope) > 0) {
h = x;
} else {
l = x;
}
}
lim_a = l;
}
{
var x = 0, l, h;
for (x = 0; s3_func_x(x, hf_slope) > 1e-20; x += 1)
;
l = 0;
h = x;
while (Math.abs(h - l) > 1e-12) {
x = (h + l) / 2;
if (s3_func_x(x, hf_slope) > 0) {
l = x;
} else {
h = x;
}
}
lim_b = h;
}
{
var sum = 0;
var m = 1e3;
var i;
for (i = 0; i <= m; ++i) {
var x = lim_a + i * (lim_b - lim_a) / m;
var y = s3_func_x(x, hf_slope);
sum += y;
}
{
var norm = (m + 1) / (sum * (lim_b - lim_a));
return norm;
}
}
}
function s3_func(bark) {
var tempx, x, tempy, temp;
tempx = bark;
if (tempx >= 0)
tempx *= 3;
else
tempx *= 1.5;
if (tempx >= 0.5 && tempx <= 2.5) {
temp = tempx - 0.5;
x = 8 * (temp * temp - 2 * temp);
} else
x = 0;
tempx += 0.474;
tempy = 15.811389 + 7.5 * tempx - 17.5 * Math.sqrt(1 + tempx * tempx);
if (tempy <= -60)
return 0;
tempx = Math.exp((x + tempy) * LN_TO_LOG10);
tempx /= 0.6609193;
return tempx;
}
function freq2bark(freq) {
if (freq < 0)
freq = 0;
freq = freq * 1e-3;
return 13 * Math.atan(0.76 * freq) + 3.5 * Math.atan(freq * freq / (7.5 * 7.5));
}
function init_numline(numlines, bo, bm, bval, bval_width, mld, bo_w, sfreq, blksize, scalepos, deltafreq, sbmax) {
var b_frq = new_float$3(Encoder_1.CBANDS + 1);
var sample_freq_frac = sfreq / (sbmax > 15 ? 2 * 576 : 2 * 192);
var partition = new_int$3(Encoder_1.HBLKSIZE);
var i;
sfreq /= blksize;
var j = 0;
var ni = 0;
for (i = 0; i < Encoder_1.CBANDS; i++) {
var bark1;
var j2;
bark1 = freq2bark(sfreq * j);
b_frq[i] = sfreq * j;
for (j2 = j; freq2bark(sfreq * j2) - bark1 < DELBARK && j2 <= blksize / 2; j2++)
;
numlines[i] = j2 - j;
ni = i + 1;
while (j < j2) {
assert$3(j < Encoder_1.HBLKSIZE);
partition[j++] = i;
}
if (j > blksize / 2) {
j = blksize / 2;
++i;
break;
}
}
assert$3(i < Encoder_1.CBANDS);
b_frq[i] = sfreq * j;
for (var sfb = 0; sfb < sbmax; sfb++) {
var i1, i2, start, end;
var arg;
start = scalepos[sfb];
end = scalepos[sfb + 1];
i1 = 0 | Math.floor(0.5 + deltafreq * (start - 0.5));
if (i1 < 0)
i1 = 0;
i2 = 0 | Math.floor(0.5 + deltafreq * (end - 0.5));
if (i2 > blksize / 2)
i2 = blksize / 2;
bm[sfb] = (partition[i1] + partition[i2]) / 2;
bo[sfb] = partition[i2];
var f_tmp = sample_freq_frac * end;
bo_w[sfb] = (f_tmp - b_frq[bo[sfb]]) / (b_frq[bo[sfb] + 1] - b_frq[bo[sfb]]);
if (bo_w[sfb] < 0) {
bo_w[sfb] = 0;
} else {
if (bo_w[sfb] > 1) {
bo_w[sfb] = 1;
}
}
arg = freq2bark(sfreq * scalepos[sfb] * deltafreq);
arg = Math.min(arg, 15.5) / 15.5;
mld[sfb] = Math.pow(
10,
1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5
);
}
j = 0;
for (var k = 0; k < ni; k++) {
var w = numlines[k];
var bark1, bark2;
bark1 = freq2bark(sfreq * j);
bark2 = freq2bark(sfreq * (j + w - 1));
bval[k] = 0.5 * (bark1 + bark2);
bark1 = freq2bark(sfreq * (j - 0.5));
bark2 = freq2bark(sfreq * (j + w - 0.5));
bval_width[k] = bark2 - bark1;
j += w;
}
return ni;
}
function init_s3_values(s3ind, npart, bval, bval_width, norm, use_old_s3) {
var s3 = new_float_n$3([Encoder_1.CBANDS, Encoder_1.CBANDS]);
var j;
var numberOfNoneZero = 0;
if (use_old_s3) {
for (var i = 0; i < npart; i++) {
for (j = 0; j < npart; j++) {
var v = s3_func(bval[i] - bval[j]) * bval_width[j];
s3[i][j] = v * norm[i];
}
}
} else {
for (j = 0; j < npart; j++) {
var hf_slope = 15 + Math.min(21 / bval[j], 12);
var s3_x_norm = norm_s3_func_x(hf_slope);
for (var i = 0; i < npart; i++) {
var v = s3_x_norm * s3_func_x(bval[i] - bval[j], hf_slope) * bval_width[j];
s3[i][j] = v * norm[i];
}
}
}
for (var i = 0; i < npart; i++) {
for (j = 0; j < npart; j++) {
if (s3[i][j] > 0)
break;
}
s3ind[i][0] = j;
for (j = npart - 1; j > 0; j--) {
if (s3[i][j] > 0)
break;
}
s3ind[i][1] = j;
numberOfNoneZero += s3ind[i][1] - s3ind[i][0] + 1;
}
var p = new_float$3(numberOfNoneZero);
var k = 0;
for (var i = 0; i < npart; i++)
for (j = s3ind[i][0]; j <= s3ind[i][1]; j++)
p[k++] = s3[i][j];
return p;
}
function stereo_demask(f) {
var arg = freq2bark(f);
arg = Math.min(arg, 15.5) / 15.5;
return Math.pow(
10,
1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5
);
}
this.psymodel_init = function(gfp) {
var gfc = gfp.internal_flags;
var i;
var useOldS3 = true;
var bvl_a = 13, bvl_b = 24;
var snr_l_a = 0, snr_l_b = 0;
var snr_s_a = -8.25, snr_s_b = -4.5;
var bval = new_float$3(Encoder_1.CBANDS);
var bval_width = new_float$3(Encoder_1.CBANDS);
var norm = new_float$3(Encoder_1.CBANDS);
var sfreq = gfp.out_samplerate;
switch (gfp.experimentalZ) {
default:
case 0:
useOldS3 = true;
break;
case 1:
useOldS3 = gfp.VBR == VbrMode$3.vbr_mtrh || gfp.VBR == VbrMode$3.vbr_mt ? false : true;
break;
case 2:
useOldS3 = false;
break;
case 3:
bvl_a = 8;
snr_l_a = -1.75;
snr_l_b = -0.0125;
snr_s_a = -8.25;
snr_s_b = -2.25;
break;
}
gfc.ms_ener_ratio_old = 0.25;
gfc.blocktype_old[0] = gfc.blocktype_old[1] = Encoder_1.NORM_TYPE;
for (i = 0; i < 4; ++i) {
for (var j = 0; j < Encoder_1.CBANDS; ++j) {
gfc.nb_1[i][j] = 1e20;
gfc.nb_2[i][j] = 1e20;
gfc.nb_s1[i][j] = gfc.nb_s2[i][j] = 1;
}
for (var sb = 0; sb < Encoder_1.SBMAX_l; sb++) {
gfc.en[i].l[sb] = 1e20;
gfc.thm[i].l[sb] = 1e20;
}
for (var j = 0; j < 3; ++j) {
for (var sb = 0; sb < Encoder_1.SBMAX_s; sb++) {
gfc.en[i].s[sb][j] = 1e20;
gfc.thm[i].s[sb][j] = 1e20;
}
gfc.nsPsy.lastAttacks[i] = 0;
}
for (var j = 0; j < 9; j++)
gfc.nsPsy.last_en_subshort[i][j] = 10;
}
gfc.loudness_sq_save[0] = gfc.loudness_sq_save[1] = 0;
gfc.npart_l = init_numline(
gfc.numlines_l,
gfc.bo_l,
gfc.bm_l,
bval,
bval_width,
gfc.mld_l,
gfc.PSY.bo_l_weight,
sfreq,
Encoder_1.BLKSIZE,
gfc.scalefac_band.l,
Encoder_1.BLKSIZE / (2 * 576),
Encoder_1.SBMAX_l
);
assert$3(gfc.npart_l < Encoder_1.CBANDS);
for (i = 0; i < gfc.npart_l; i++) {
var snr = snr_l_a;
if (bval[i] >= bvl_a) {
snr = snr_l_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + snr_l_a * (bvl_b - bval[i]) / (bvl_b - bvl_a);
}
norm[i] = Math.pow(10, snr / 10);
if (gfc.numlines_l[i] > 0) {
gfc.rnumlines_l[i] = 1 / gfc.numlines_l[i];
} else {
gfc.rnumlines_l[i] = 0;
}
}
gfc.s3_ll = init_s3_values(
gfc.s3ind,
gfc.npart_l,
bval,
bval_width,
norm,
useOldS3
);
var j = 0;
for (i = 0; i < gfc.npart_l; i++) {
var x;
x = Float$3.MAX_VALUE;
for (var k = 0; k < gfc.numlines_l[i]; k++, j++) {
var freq = sfreq * j / (1e3 * Encoder_1.BLKSIZE);
var level;
level = this.ATHformula(freq * 1e3, gfp) - 20;
level = Math.pow(10, 0.1 * level);
level *= gfc.numlines_l[i];
if (x > level)
x = level;
}
gfc.ATH.cb_l[i] = x;
x = -20 + bval[i] * 20 / 10;
if (x > 6) {
x = 100;
}
if (x < -15) {
x = -15;
}
x -= 8;
gfc.minval_l[i] = Math.pow(10, x / 10) * gfc.numlines_l[i];
}
gfc.npart_s = init_numline(
gfc.numlines_s,
gfc.bo_s,
gfc.bm_s,
bval,
bval_width,
gfc.mld_s,
gfc.PSY.bo_s_weight,
sfreq,
Encoder_1.BLKSIZE_s,
gfc.scalefac_band.s,
Encoder_1.BLKSIZE_s / (2 * 192),
Encoder_1.SBMAX_s
);
assert$3(gfc.npart_s < Encoder_1.CBANDS);
j = 0;
for (i = 0; i < gfc.npart_s; i++) {
var x;
var snr = snr_s_a;
if (bval[i] >= bvl_a) {
snr = snr_s_b * (bval[i] - bvl_a) / (bvl_b - bvl_a) + snr_s_a * (bvl_b - bval[i]) / (bvl_b - bvl_a);
}
norm[i] = Math.pow(10, snr / 10);
x = Float$3.MAX_VALUE;
for (var k = 0; k < gfc.numlines_s[i]; k++, j++) {
var freq = sfreq * j / (1e3 * Encoder_1.BLKSIZE_s);
var level;
level = this.ATHformula(freq * 1e3, gfp) - 20;
level = Math.pow(10, 0.1 * level);
level *= gfc.numlines_s[i];
if (x > level)
x = level;
}
gfc.ATH.cb_s[i] = x;
x = -7 + bval[i] * 7 / 12;
if (bval[i] > 12) {
x *= 1 + Math.log(1 + x) * 3.1;
}
if (bval[i] < 12) {
x *= 1 + Math.log(1 - x) * 2.3;
}
if (x < -15) {
x = -15;
}
x -= 8;
gfc.minval_s[i] = Math.pow(10, x / 10) * gfc.numlines_s[i];
}
gfc.s3_ss = init_s3_values(
gfc.s3ind_s,
gfc.npart_s,
bval,
bval_width,
norm,
useOldS3
);
init_mask_add_max_values();
fft.init_fft(gfc);
gfc.decay = Math.exp(-1 * LOG10 / (temporalmask_sustain_sec * sfreq / 192));
{
var msfix;
msfix = NS_MSFIX;
if ((gfp.exp_nspsytune & 2) != 0)
msfix = 1;
if (Math.abs(gfp.msfix) > 0)
msfix = gfp.msfix;
gfp.msfix = msfix;
for (var b = 0; b < gfc.npart_l; b++)
if (gfc.s3ind[b][1] > gfc.npart_l - 1)
gfc.s3ind[b][1] = gfc.npart_l - 1;
}
var frame_duration = 576 * gfc.mode_gr / sfreq;
gfc.ATH.decay = Math.pow(10, -12 / 10 * frame_duration);
gfc.ATH.adjust = 0.01;
gfc.ATH.adjustLimit = 1;
assert$3(gfc.bo_l[Encoder_1.SBMAX_l - 1] <= gfc.npart_l);
assert$3(gfc.bo_s[Encoder_1.SBMAX_s - 1] <= gfc.npart_s);
if (gfp.ATHtype != -1) {
var freq;
var freq_inc = gfp.out_samplerate / Encoder_1.BLKSIZE;
var eql_balance = 0;
freq = 0;
for (i = 0; i < Encoder_1.BLKSIZE / 2; ++i) {
freq += freq_inc;
gfc.ATH.eql_w[i] = 1 / Math.pow(10, this.ATHformula(freq, gfp) / 10);
eql_balance += gfc.ATH.eql_w[i];
}
eql_balance = 1 / eql_balance;
for (i = Encoder_1.BLKSIZE / 2; --i >= 0; ) {
gfc.ATH.eql_w[i] *= eql_balance;
}
}
{
for (var b = j = 0; b < gfc.npart_s; ++b) {
for (i = 0; i < gfc.numlines_s[b]; ++i) {
++j;
}
}
assert$3(j == 129);
for (var b = j = 0; b < gfc.npart_l; ++b) {
for (i = 0; i < gfc.numlines_l[b]; ++i) {
++j;
}
}
assert$3(j == 513);
}
j = 0;
for (i = 0; i < gfc.npart_l; i++) {
var freq = sfreq * (j + gfc.numlines_l[i] / 2) / (1 * Encoder_1.BLKSIZE);
gfc.mld_cb_l[i] = stereo_demask(freq);
j += gfc.numlines_l[i];
}
for (; i < Encoder_1.CBANDS; ++i) {
gfc.mld_cb_l[i] = 1;
}
j = 0;
for (i = 0; i < gfc.npart_s; i++) {
var freq = sfreq * (j + gfc.numlines_s[i] / 2) / (1 * Encoder_1.BLKSIZE_s);
gfc.mld_cb_s[i] = stereo_demask(freq);
j += gfc.numlines_s[i];
}
for (; i < Encoder_1.CBANDS; ++i) {
gfc.mld_cb_s[i] = 1;
}
return 0;
};
function ATHformula_GB(f, value) {
if (f < -0.3)
f = 3410;
f /= 1e3;
f = Math.max(0.1, f);
var ath = 3.64 * Math.pow(f, -0.8) - 6.8 * Math.exp(-0.6 * Math.pow(f - 3.4, 2)) + 6 * Math.exp(-0.15 * Math.pow(f - 8.7, 2)) + (0.6 + 0.04 * value) * 1e-3 * Math.pow(f, 4);
return ath;
}
this.ATHformula = function(f, gfp) {
var ath;
switch (gfp.ATHtype) {
case 0:
ath = ATHformula_GB(f, 9);
break;
case 1:
ath = ATHformula_GB(f, -1);
break;
case 2:
ath = ATHformula_GB(f, 0);
break;
case 3:
ath = ATHformula_GB(f, 1) + 6;
break;
case 4:
ath = ATHformula_GB(f, gfp.ATHcurve);
break;
default:
ath = ATHformula_GB(f, 0);
break;
}
return ath;
};
}
var PsyModel_1 = PsyModel;
function MPEGMode$1(ordinal) {
var _ordinal = ordinal;
this.ordinal = function() {
return _ordinal;
};
}
MPEGMode$1.STEREO = new MPEGMode$1(0);
MPEGMode$1.JOINT_STEREO = new MPEGMode$1(1);
MPEGMode$1.DUAL_CHANNEL = new MPEGMode$1(2);
MPEGMode$1.MONO = new MPEGMode$1(3);
MPEGMode$1.NOT_SET = new MPEGMode$1(4);
var MPEGMode_1 = MPEGMode$1;
function LameGlobalFlags() {
this.class_id = 0;
this.num_samples = 0;
this.num_channels = 0;
this.in_samplerate = 0;
this.out_samplerate = 0;
this.scale = 0;
this.scale_left = 0;
this.scale_right = 0;
this.analysis = false;
this.bWriteVbrTag = false;
this.decode_only = false;
this.quality = 0;
this.mode = MPEGMode_1.STEREO;
this.force_ms = false;
this.free_format = false;
this.findReplayGain = false;
this.decode_on_the_fly = false;
this.write_id3tag_automatic = false;
this.brate = 0;
this.compression_ratio = 0;
this.copyright = 0;
this.original = 0;
this.extension = 0;
this.emphasis = 0;
this.error_protection = 0;
this.strict_ISO = false;
this.disable_reservoir = false;
this.quant_comp = 0;
this.quant_comp_short = 0;
this.experimentalY = false;
this.experimentalZ = 0;
this.exp_nspsytune = 0;
this.preset = 0;
this.VBR = null;
this.VBR_q_frac = 0;
this.VBR_q = 0;
this.VBR_mean_bitrate_kbps = 0;
this.VBR_min_bitrate_kbps = 0;
this.VBR_max_bitrate_kbps = 0;
this.VBR_hard_min = 0;
this.lowpassfreq = 0;
this.highpassfreq = 0;
this.lowpasswidth = 0;
this.highpasswidth = 0;
this.maskingadjust = 0;
this.maskingadjust_short = 0;
this.ATHonly = false;
this.ATHshort = false;
this.noATH = false;
this.ATHtype = 0;
this.ATHcurve = 0;
this.ATHlower = 0;
this.athaa_type = 0;
this.athaa_loudapprox = 0;
this.athaa_sensitivity = 0;
this.short_blocks = null;
this.useTemporal = false;
this.interChRatio = 0;
this.msfix = 0;
this.tune = false;
this.tune_value_a = 0;
this.version = 0;
this.encoder_delay = 0;
this.encoder_padding = 0;
this.framesize = 0;
this.frameNum = 0;
this.lame_allocated_gfp = 0;
this.internal_flags = null;
}
var LameGlobalFlags_1 = LameGlobalFlags;
var L3Side$1 = {};
L3Side$1.SFBMAX = Encoder_1.SBMAX_s * 3;
var L3Side_1 = L3Side$1;
var new_float$10 = common.new_float;
var new_int$10 = common.new_int;
function GrInfo() {
this.xr = new_float$10(576);
this.l3_enc = new_int$10(576);
this.scalefac = new_int$10(L3Side_1.SFBMAX);
this.xrpow_max = 0;
this.part2_3_length = 0;
this.big_values = 0;
this.count1 = 0;
this.global_gain = 0;
this.scalefac_compress = 0;
this.block_type = 0;
this.mixed_block_flag = 0;
this.table_select = new_int$10(3);
this.subblock_gain = new_int$10(3 + 1);
this.region0_count = 0;
this.region1_count = 0;
this.preflag = 0;
this.scalefac_scale = 0;
this.count1table_select = 0;
this.part2_length = 0;
this.sfb_lmax = 0;
this.sfb_smin = 0;
this.psy_lmax = 0;
this.sfbmax = 0;
this.psymax = 0;
this.sfbdivide = 0;
this.width = new_int$10(L3Side_1.SFBMAX);
this.window = new_int$10(L3Side_1.SFBMAX);
this.count1bits = 0;
this.sfb_partition_table = null;
this.slen = new_int$10(4);
this.max_nonzero_coeff = 0;
var self = this;
function clone_int(array) {
return new Int32Array(array);
}
function clone_float(array) {
return new Float32Array(array);
}
this.assign = function(other) {
self.xr = clone_float(other.xr);
self.l3_enc = clone_int(other.l3_enc);
self.scalefac = clone_int(other.scalefac);
self.xrpow_max = other.xrpow_max;
self.part2_3_length = other.part2_3_length;
self.big_values = other.big_values;
self.count1 = other.count1;
self.global_gain = other.global_gain;
self.scalefac_compress = other.scalefac_compress;
self.block_type = other.block_type;
self.mixed_block_flag = other.mixed_block_flag;
self.table_select = clone_int(other.table_select);
self.subblock_gain = clone_int(other.subblock_gain);
self.region0_count = other.region0_count;
self.region1_count = other.region1_count;
self.preflag = other.preflag;
self.scalefac_scale = other.scalefac_scale;
self.count1table_select = other.count1table_select;
self.part2_length = other.part2_length;
self.sfb_lmax = other.sfb_lmax;
self.sfb_smin = other.sfb_smin;
self.psy_lmax = other.psy_lmax;
self.sfbmax = other.sfbmax;
self.psymax = other.psymax;
self.sfbdivide = other.sfbdivide;
self.width = clone_int(other.width);
self.window = clone_int(other.window);
self.count1bits = other.count1bits;
self.sfb_partition_table = other.sfb_partition_table.slice(0);
self.slen = clone_int(other.slen);
self.max_nonzero_coeff = other.max_nonzero_coeff;
};
}
var GrInfo_1 = GrInfo;
var new_int$9 = common.new_int;
function IIISideInfo() {
this.tt = [[null, null], [null, null]];
this.main_data_begin = 0;
this.private_bits = 0;
this.resvDrain_pre = 0;
this.resvDrain_post = 0;
this.scfsi = [new_int$9(4), new_int$9(4)];
for (var gr = 0; gr < 2; gr++) {
for (var ch = 0; ch < 2; ch++) {
this.tt[gr][ch] = new GrInfo_1();
}
}
}
var IIISideInfo_1 = IIISideInfo;
var System$11 = common.System;
var new_int$11 = common.new_int;
function ScaleFac(arrL, arrS, arr21, arr12) {
this.l = new_int$11(1 + Encoder_1.SBMAX_l);
this.s = new_int$11(1 + Encoder_1.SBMAX_s);
this.psfb21 = new_int$11(1 + Encoder_1.PSFB21);
this.psfb12 = new_int$11(1 + Encoder_1.PSFB12);
var l = this.l;
var s = this.s;
if (arguments.length == 4) {
this.arrL = arguments[0];
this.arrS = arguments[1];
this.arr21 = arguments[2];
this.arr12 = arguments[3];
System$11.arraycopy(this.arrL, 0, l, 0, Math.min(this.arrL.length, this.l.length));
System$11.arraycopy(this.arrS, 0, s, 0, Math.min(this.arrS.length, this.s.length));
System$11.arraycopy(this.arr21, 0, this.psfb21, 0, Math.min(this.arr21.length, this.psfb21.length));
System$11.arraycopy(this.arr12, 0, this.psfb12, 0, Math.min(this.arr12.length, this.psfb12.length));
}
}
var ScaleFac_1 = ScaleFac;
var new_float$12 = common.new_float;
var new_float_n$12 = common.new_float_n;
var new_int$12 = common.new_int;
function NsPsy() {
this.last_en_subshort = new_float_n$12([4, 9]);
this.lastAttacks = new_int$12(4);
this.pefirbuf = new_float$12(19);
this.longfact = new_float$12(Encoder_1.SBMAX_l);
this.shortfact = new_float$12(Encoder_1.SBMAX_s);
this.attackthre = 0;
this.attackthre_s = 0;
}
var NsPsy_1 = NsPsy;
function VBRSeekInfo() {
this.sum = 0;
this.seen = 0;
this.want = 0;
this.pos = 0;
this.size = 0;
this.bag = null;
this.nVbrNumFrames = 0;
this.nBytesWritten = 0;
this.TotalFrameSize = 0;
}
var VBRSeekInfo_1 = VBRSeekInfo;
var new_byte$8 = common.new_byte;
var new_double$8 = common.new_double;
var new_float$8 = common.new_float;
var new_float_n$8 = common.new_float_n;
var new_int$8 = common.new_int;
var new_int_n$8 = common.new_int_n;
LameInternalFlags$1.MFSIZE = 3 * 1152 + Encoder_1.ENCDELAY - Encoder_1.MDCTDELAY;
LameInternalFlags$1.MAX_HEADER_BUF = 256;
LameInternalFlags$1.MAX_BITS_PER_CHANNEL = 4095;
LameInternalFlags$1.MAX_BITS_PER_GRANULE = 7680;
LameInternalFlags$1.BPC = 320;
function LameInternalFlags$1() {
var MAX_HEADER_LEN = 40;
this.Class_ID = 0;
this.lame_encode_frame_init = 0;
this.iteration_init_init = 0;
this.fill_buffer_resample_init = 0;
this.mfbuf = new_float_n$8([2, LameInternalFlags$1.MFSIZE]);
this.mode_gr = 0;
this.channels_in = 0;
this.channels_out = 0;
this.resample_ratio = 0;
this.mf_samples_to_encode = 0;
this.mf_size = 0;
this.VBR_min_bitrate = 0;
this.VBR_max_bitrate = 0;
this.bitrate_index = 0;
this.samplerate_index = 0;
this.mode_ext = 0;
this.lowpass1 = 0;
this.lowpass2 = 0;
this.highpass1 = 0;
this.highpass2 = 0;
this.noise_shaping = 0;
this.noise_shaping_amp = 0;
this.substep_shaping = 0;
this.psymodel = 0;
this.noise_shaping_stop = 0;
this.subblock_gain = 0;
this.use_best_huffman = 0;
this.full_outer_loop = 0;
this.l3_side = new IIISideInfo_1();
this.ms_ratio = new_float$8(2);
this.padding = 0;
this.frac_SpF = 0;
this.slot_lag = 0;
this.tag_spec = null;
this.nMusicCRC = 0;
this.OldValue = new_int$8(2);
this.CurrentStep = new_int$8(2);
this.masking_lower = 0;
this.bv_scf = new_int$8(576);
this.pseudohalf = new_int$8(L3Side_1.SFBMAX);
this.sfb21_extra = false;
this.inbuf_old = new Array(2);
this.blackfilt = new Array(2 * LameInternalFlags$1.BPC + 1);
this.itime = new_double$8(2);
this.sideinfo_len = 0;
this.sb_sample = new_float_n$8([2, 2, 18, Encoder_1.SBLIMIT]);
this.amp_filter = new_float$8(32);
function Header() {
this.write_timing = 0;
this.ptr = 0;
this.buf = new_byte$8(MAX_HEADER_LEN);
}
this.header = new Array(LameInternalFlags$1.MAX_HEADER_BUF);
this.h_ptr = 0;
this.w_ptr = 0;
this.ancillary_flag = 0;
this.ResvSize = 0;
this.ResvMax = 0;
this.scalefac_band = new ScaleFac_1();
this.minval_l = new_float$8(Encoder_1.CBANDS);
this.minval_s = new_float$8(Encoder_1.CBANDS);
this.nb_1 = new_float_n$8([4, Encoder_1.CBANDS]);
this.nb_2 = new_float_n$8([4, Encoder_1.CBANDS]);
this.nb_s1 = new_float_n$8([4, Encoder_1.CBANDS]);
this.nb_s2 = new_float_n$8([4, Encoder_1.CBANDS]);
this.s3_ss = null;
this.s3_ll = null;
this.decay = 0;
this.thm = new Array(4);
this.en = new Array(4);
this.tot_ener = new_float$8(4);
this.loudness_sq = new_float_n$8([2, 2]);
this.loudness_sq_save = new_float$8(2);
this.mld_l = new_float$8(Encoder_1.SBMAX_l);
this.mld_s = new_float$8(Encoder_1.SBMAX_s);
this.bm_l = new_int$8(Encoder_1.SBMAX_l);
this.bo_l = new_int$8(Encoder_1.SBMAX_l);
this.bm_s = new_int$8(Encoder_1.SBMAX_s);
this.bo_s = new_int$8(Encoder_1.SBMAX_s);
this.npart_l = 0;
this.npart_s = 0;
this.s3ind = new_int_n$8([Encoder_1.CBANDS, 2]);
this.s3ind_s = new_int_n$8([Encoder_1.CBANDS, 2]);
this.numlines_s = new_int$8(Encoder_1.CBANDS);
this.numlines_l = new_int$8(Encoder_1.CBANDS);
this.rnumlines_l = new_float$8(Encoder_1.CBANDS);
this.mld_cb_l = new_float$8(Encoder_1.CBANDS);
this.mld_cb_s = new_float$8(Encoder_1.CBANDS);
this.numlines_s_num1 = 0;
this.numlines_l_num1 = 0;
this.pe = new_float$8(4);
this.ms_ratio_s_old = 0;
this.ms_ratio_l_old = 0;
this.ms_ener_ratio_old = 0;
this.blocktype_old = new_int$8(2);
this.nsPsy = new NsPsy_1();
this.VBR_seek_table = new VBRSeekInfo_1();
this.ATH = null;
this.PSY = null;
this.nogap_total = 0;
this.nogap_current = 0;
this.decode_on_the_fly = true;
this.findReplayGain = true;
this.findPeakSample = true;
this.PeakSample = 0;
this.RadioGain = 0;
this.AudiophileGain = 0;
this.rgdata = null;
this.noclipGainChange = 0;
this.noclipScale = 0;
this.bitrate_stereoMode_Hist = new_int_n$8([16, 4 + 1]);
this.bitrate_blockType_Hist = new_int_n$8([16, 4 + 1 + 1]);
this.pinfo = null;
this.hip = null;
this.in_buffer_nsamples = 0;
this.in_buffer_0 = null;
this.in_buffer_1 = null;
this.iteration_loop = null;
for (var i = 0; i < this.en.length; i++) {
this.en[i] = new III_psy_xmin_1();
}
for (var i = 0; i < this.thm.length; i++) {
this.thm[i] = new III_psy_xmin_1();
}
for (var i = 0; i < this.header.length; i++) {
this.header[i] = new Header();
}
}
var LameInternalFlags_1 = LameInternalFlags$1;
var new_float$13 = common.new_float;
function ATH() {
this.useAdjust = 0;
this.aaSensitivityP = 0;
this.adjust = 0;
this.adjustLimit = 0;
this.decay = 0;
this.floor = 0;
this.l = new_float$13(Encoder_1.SBMAX_l);
this.s = new_float$13(Encoder_1.SBMAX_s);
this.psfb21 = new_float$13(Encoder_1.PSFB21);
this.psfb12 = new_float$13(Encoder_1.PSFB12);
this.cb_l = new_float$13(Encoder_1.CBANDS);
this.cb_s = new_float$13(Encoder_1.CBANDS);
this.eql_w = new_float$13(Encoder_1.BLKSIZE / 2);
}
var ATH_1 = ATH;
var System$15 = common.System;
var Arrays$15 = common.Arrays;
GainAnalysis$1.STEPS_per_dB = 100;
GainAnalysis$1.MAX_dB = 120;
GainAnalysis$1.GAIN_NOT_ENOUGH_SAMPLES = -24601;
GainAnalysis$1.GAIN_ANALYSIS_ERROR = 0;
GainAnalysis$1.GAIN_ANALYSIS_OK = 1;
GainAnalysis$1.INIT_GAIN_ANALYSIS_ERROR = 0;
GainAnalysis$1.INIT_GAIN_ANALYSIS_OK = 1;
GainAnalysis$1.YULE_ORDER = 10;
GainAnalysis$1.MAX_ORDER = GainAnalysis$1.YULE_ORDER;
GainAnalysis$1.MAX_SAMP_FREQ = 48e3;
GainAnalysis$1.RMS_WINDOW_TIME_NUMERATOR = 1;
GainAnalysis$1.RMS_WINDOW_TIME_DENOMINATOR = 20;
GainAnalysis$1.MAX_SAMPLES_PER_WINDOW = GainAnalysis$1.MAX_SAMP_FREQ * GainAnalysis$1.RMS_WINDOW_TIME_NUMERATOR / GainAnalysis$1.RMS_WINDOW_TIME_DENOMINATOR + 1;
function GainAnalysis$1() {
var PINK_REF = 64.82;
var YULE_ORDER = GainAnalysis$1.YULE_ORDER;
var RMS_PERCENTILE = 0.95;
var MAX_SAMP_FREQ = GainAnalysis$1.MAX_SAMP_FREQ;
var RMS_WINDOW_TIME_NUMERATOR = GainAnalysis$1.RMS_WINDOW_TIME_NUMERATOR;
var RMS_WINDOW_TIME_DENOMINATOR = GainAnalysis$1.RMS_WINDOW_TIME_DENOMINATOR;
var MAX_SAMPLES_PER_WINDOW = GainAnalysis$1.MAX_SAMPLES_PER_WINDOW;
var ABYule = [
[
0.038575994352,
-3.84664617118067,
-0.02160367184185,
7.81501653005538,
-0.00123395316851,
-11.34170355132042,
-9291677959e-14,
13.05504219327545,
-0.01655260341619,
-12.28759895145294,
0.02161526843274,
9.4829380631979,
-0.02074045215285,
-5.87257861775999,
0.00594298065125,
2.75465861874613,
0.00306428023191,
-0.86984376593551,
12025322027e-14,
0.13919314567432,
0.00288463683916
],
[
0.0541865640643,
-3.47845948550071,
-0.02911007808948,
6.36317777566148,
-0.00848709379851,
-8.54751527471874,
-0.00851165645469,
9.4769360780128,
-0.00834990904936,
-8.81498681370155,
0.02245293253339,
6.85401540936998,
-0.02596338512915,
-4.39470996079559,
0.01624864962975,
2.19611684890774,
-0.00240879051584,
-0.75104302451432,
0.00674613682247,
0.13149317958808,
-0.00187763777362
],
[
0.15457299681924,
-2.37898834973084,
-0.09331049056315,
2.84868151156327,
-0.06247880153653,
-2.64577170229825,
0.02163541888798,
2.23697657451713,
-0.05588393329856,
-1.67148153367602,
0.04781476674921,
1.00595954808547,
0.00222312597743,
-0.45953458054983,
0.03174092540049,
0.16378164858596,
-0.01390589421898,
-0.05032077717131,
0.00651420667831,
0.0234789740702,
-0.00881362733839
],
[
0.30296907319327,
-1.61273165137247,
-0.22613988682123,
1.0797749225997,
-0.08587323730772,
-0.2565625775407,
0.03282930172664,
-0.1627671912044,
-0.00915702933434,
-0.22638893773906,
-0.02364141202522,
0.39120800788284,
-0.00584456039913,
-0.22138138954925,
0.06276101321749,
0.04500235387352,
-828086748e-14,
0.02005851806501,
0.00205861885564,
0.00302439095741,
-0.02950134983287
],
[
0.33642304856132,
-1.49858979367799,
-0.2557224142557,
0.87350271418188,
-0.11828570177555,
0.12205022308084,
0.11921148675203,
-0.80774944671438,
-0.07834489609479,
0.47854794562326,
-0.0046997791438,
-0.12453458140019,
-0.0058950022444,
-0.04067510197014,
0.05724228140351,
0.08333755284107,
0.00832043980773,
-0.04237348025746,
-0.0163538138454,
0.02977207319925,
-0.0176017656815
],
[
0.4491525660845,
-0.62820619233671,
-0.14351757464547,
0.29661783706366,
-0.22784394429749,
-0.372563729424,
-0.01419140100551,
0.00213767857124,
0.04078262797139,
-0.42029820170918,
-0.12398163381748,
0.22199650564824,
0.04097565135648,
0.00613424350682,
0.10478503600251,
0.06747620744683,
-0.01863887810927,
0.05784820375801,
-0.03193428438915,
0.03222754072173,
0.00541907748707
],
[
0.56619470757641,
-1.04800335126349,
-0.75464456939302,
0.29156311971249,
0.1624213774223,
-0.26806001042947,
0.16744243493672,
0.00819999645858,
-0.18901604199609,
0.45054734505008,
0.3093178284183,
-0.33032403314006,
-0.27562961986224,
0.0673936833311,
0.00647310677246,
-0.04784254229033,
0.08647503780351,
0.01639907836189,
-0.0378898455484,
0.01807364323573,
-0.00588215443421
],
[
0.58100494960553,
-0.51035327095184,
-0.53174909058578,
-0.31863563325245,
-0.14289799034253,
-0.20256413484477,
0.17520704835522,
0.1472815413433,
0.02377945217615,
0.38952639978999,
0.15558449135573,
-0.23313271880868,
-0.25344790059353,
-0.05246019024463,
0.01628462406333,
-0.02505961724053,
0.06920467763959,
0.02442357316099,
-0.03721611395801,
0.01818801111503,
-0.00749618797172
],
[
0.53648789255105,
-0.2504987195602,
-0.42163034350696,
-0.43193942311114,
-0.00275953611929,
-0.03424681017675,
0.04267842219415,
-0.04678328784242,
-0.10214864179676,
0.26408300200955,
0.14590772289388,
0.15113130533216,
-0.02459864859345,
-0.17556493366449,
-0.11202315195388,
-0.18823009262115,
-0.04060034127,
0.05477720428674,
0.0478866554818,
0.0470440968812,
-0.02217936801134
]
];
var ABButter = [
[
0.98621192462708,
-1.97223372919527,
-1.97242384925416,
0.97261396931306,
0.98621192462708
],
[
0.98500175787242,
-1.96977855582618,
-1.97000351574484,
0.9702284756635,
0.98500175787242
],
[
0.97938932735214,
-1.95835380975398,
-1.95877865470428,
0.95920349965459,
0.97938932735214
],
[
0.97531843204928,
-1.95002759149878,
-1.95063686409857,
0.95124613669835,
0.97531843204928
],
[
0.97316523498161,
-1.94561023566527,
-1.94633046996323,
0.94705070426118,
0.97316523498161
],
[
0.96454515552826,
-1.92783286977036,
-1.92909031105652,
0.93034775234268,
0.96454515552826
],
[
0.96009142950541,
-1.91858953033784,
-1.92018285901082,
0.92177618768381,
0.96009142950541
],
[
0.95856916599601,
-1.9154210807478,
-1.91713833199203,
0.91885558323625,
0.95856916599601
],
[
0.94597685600279,
-1.88903307939452,
-1.89195371200558,
0.89487434461664,
0.94597685600279
]
];
function filterYule(input, inputPos, output, outputPos, nSamples, kernel) {
while (nSamples-- != 0) {
output[outputPos] = 1e-10 + input[inputPos + 0] * kernel[0] - output[outputPos - 1] * kernel[1] + input[inputPos - 1] * kernel[2] - output[outputPos - 2] * kernel[3] + input[inputPos - 2] * kernel[4] - output[outputPos - 3] * kernel[5] + input[inputPos - 3] * kernel[6] - output[outputPos - 4] * kernel[7] + input[inputPos - 4] * kernel[8] - output[outputPos - 5] * kernel[9] + input[inputPos - 5] * kernel[10] - output[outputPos - 6] * kernel[11] + input[inputPos - 6] * kernel[12] - output[outputPos - 7] * kernel[13] + input[inputPos - 7] * kernel[14] - output[outputPos - 8] * kernel[15] + input[inputPos - 8] * kernel[16] - output[outputPos - 9] * kernel[17] + input[inputPos - 9] * kernel[18] - output[outputPos - 10] * kernel[19] + input[inputPos - 10] * kernel[20];
++outputPos;
++inputPos;
}
}
function filterButter(input, inputPos, output, outputPos, nSamples, kernel) {
while (nSamples-- != 0) {
output[outputPos] = input[inputPos + 0] * kernel[0] - output[outputPos - 1] * kernel[1] + input[inputPos - 1] * kernel[2] - output[outputPos - 2] * kernel[3] + input[inputPos - 2] * kernel[4];
++outputPos;
++inputPos;
}
}
function ResetSampleFrequency(rgData, samplefreq) {
for (var i = 0; i < MAX_ORDER; i++)
rgData.linprebuf[i] = rgData.lstepbuf[i] = rgData.loutbuf[i] = rgData.rinprebuf[i] = rgData.rstepbuf[i] = rgData.routbuf[i] = 0;
switch (0 | samplefreq) {
case 48e3:
rgData.reqindex = 0;
break;
case 44100:
rgData.reqindex = 1;
break;
case 32e3:
rgData.reqindex = 2;
break;
case 24e3:
rgData.reqindex = 3;
break;
case 22050:
rgData.reqindex = 4;
break;
case 16e3:
rgData.reqindex = 5;
break;
case 12e3:
rgData.reqindex = 6;
break;
case 11025:
rgData.reqindex = 7;
break;
case 8e3:
rgData.reqindex = 8;
break;
default:
return INIT_GAIN_ANALYSIS_ERROR;
}
rgData.sampleWindow = 0 | (samplefreq * RMS_WINDOW_TIME_NUMERATOR + RMS_WINDOW_TIME_DENOMINATOR - 1) / RMS_WINDOW_TIME_DENOMINATOR;
rgData.lsum = 0;
rgData.rsum = 0;
rgData.totsamp = 0;
Arrays$15.ill(rgData.A, 0);
return INIT_GAIN_ANALYSIS_OK;
}
this.InitGainAnalysis = function(rgData, samplefreq) {
if (ResetSampleFrequency(rgData, samplefreq) != INIT_GAIN_ANALYSIS_OK) {
return INIT_GAIN_ANALYSIS_ERROR;
}
rgData.linpre = MAX_ORDER;
rgData.rinpre = MAX_ORDER;
rgData.lstep = MAX_ORDER;
rgData.rstep = MAX_ORDER;
rgData.lout = MAX_ORDER;
rgData.rout = MAX_ORDER;
Arrays$15.fill(rgData.B, 0);
return INIT_GAIN_ANALYSIS_OK;
};
function fsqr(d) {
return d * d;
}
this.AnalyzeSamples = function(rgData, left_samples, left_samplesPos, right_samples, right_samplesPos, num_samples, num_channels) {
var curleft;
var curleftBase;
var curright;
var currightBase;
var batchsamples;
var cursamples;
var cursamplepos;
if (num_samples == 0)
return GAIN_ANALYSIS_OK;
cursamplepos = 0;
batchsamples = num_samples;
switch (num_channels) {
case 1:
right_samples = left_samples;
right_samplesPos = left_samplesPos;
break;
case 2:
break;
default:
return GAIN_ANALYSIS_ERROR;
}
if (num_samples < MAX_ORDER) {
System$15.arraycopy(
left_samples,
left_samplesPos,
rgData.linprebuf,
MAX_ORDER,
num_samples
);
System$15.arraycopy(
right_samples,
right_samplesPos,
rgData.rinprebuf,
MAX_ORDER,
num_samples
);
} else {
System$15.arraycopy(
left_samples,
left_samplesPos,
rgData.linprebuf,
MAX_ORDER,
MAX_ORDER
);
System$15.arraycopy(
right_samples,
right_samplesPos,
rgData.rinprebuf,
MAX_ORDER,
MAX_ORDER
);
}
while (batchsamples > 0) {
cursamples = batchsamples > rgData.sampleWindow - rgData.totsamp ? rgData.sampleWindow - rgData.totsamp : batchsamples;
if (cursamplepos < MAX_ORDER) {
curleft = rgData.linpre + cursamplepos;
curleftBase = rgData.linprebuf;
curright = rgData.rinpre + cursamplepos;
currightBase = rgData.rinprebuf;
if (cursamples > MAX_ORDER - cursamplepos)
cursamples = MAX_ORDER - cursamplepos;
} else {
curleft = left_samplesPos + cursamplepos;
curleftBase = left_samples;
curright = right_samplesPos + cursamplepos;
currightBase = right_samples;
}
filterYule(curleftBase, curleft, rgData.lstepbuf, rgData.lstep + rgData.totsamp, cursamples, ABYule[rgData.reqindex]);
filterYule(currightBase, curright, rgData.rstepbuf, rgData.rstep + rgData.totsamp, cursamples, ABYule[rgData.reqindex]);
filterButter(
rgData.lstepbuf,
rgData.lstep + rgData.totsamp,
rgData.loutbuf,
rgData.lout + rgData.totsamp,
cursamples,
ABButter[rgData.reqindex]
);
filterButter(
rgData.rstepbuf,
rgData.rstep + rgData.totsamp,
rgData.routbuf,
rgData.rout + rgData.totsamp,
cursamples,
ABButter[rgData.reqindex]
);
curleft = rgData.lout + rgData.totsamp;
curleftBase = rgData.loutbuf;
curright = rgData.rout + rgData.totsamp;
currightBase = rgData.routbuf;
var i = cursamples % 8;
while (i-- != 0) {
rgData.lsum += fsqr(curleftBase[curleft++]);
rgData.rsum += fsqr(currightBase[curright++]);
}
i = cursamples / 8;
while (i-- != 0) {
rgData.lsum += fsqr(curleftBase[curleft + 0]) + fsqr(curleftBase[curleft + 1]) + fsqr(curleftBase[curleft + 2]) + fsqr(curleftBase[curleft + 3]) + fsqr(curleftBase[curleft + 4]) + fsqr(curleftBase[curleft + 5]) + fsqr(curleftBase[curleft + 6]) + fsqr(curleftBase[curleft + 7]);
curleft += 8;
rgData.rsum += fsqr(currightBase[curright + 0]) + fsqr(currightBase[curright + 1]) + fsqr(currightBase[curright + 2]) + fsqr(currightBase[curright + 3]) + fsqr(currightBase[curright + 4]) + fsqr(currightBase[curright + 5]) + fsqr(currightBase[curright + 6]) + fsqr(currightBase[curright + 7]);
curright += 8;
}
batchsamples -= cursamples;
cursamplepos += cursamples;
rgData.totsamp += cursamples;
if (rgData.totsamp == rgData.sampleWindow) {
var val = GainAnalysis$1.STEPS_per_dB * 10 * Math.log10((rgData.lsum + rgData.rsum) / rgData.totsamp * 0.5 + 1e-37);
var ival = val <= 0 ? 0 : 0 | val;
if (ival >= rgData.A.length)
ival = rgData.A.length - 1;
rgData.A[ival]++;
rgData.lsum = rgData.rsum = 0;
System$15.arraycopy(
rgData.loutbuf,
rgData.totsamp,
rgData.loutbuf,
0,
MAX_ORDER
);
System$15.arraycopy(
rgData.routbuf,
rgData.totsamp,
rgData.routbuf,
0,
MAX_ORDER
);
System$15.arraycopy(
rgData.lstepbuf,
rgData.totsamp,
rgData.lstepbuf,
0,
MAX_ORDER
);
System$15.arraycopy(
rgData.rstepbuf,
rgData.totsamp,
rgData.rstepbuf,
0,
MAX_ORDER
);
rgData.totsamp = 0;
}
if (rgData.totsamp > rgData.sampleWindow) {
return GAIN_ANALYSIS_ERROR;
}
}
if (num_samples < MAX_ORDER) {
System$15.arraycopy(
rgData.linprebuf,
num_samples,
rgData.linprebuf,
0,
MAX_ORDER - num_samples
);
System$15.arraycopy(
rgData.rinprebuf,
num_samples,
rgData.rinprebuf,
0,
MAX_ORDER - num_samples
);
System$15.arraycopy(
left_samples,
left_samplesPos,
rgData.linprebuf,
MAX_ORDER - num_samples,
num_samples
);
System$15.arraycopy(
right_samples,
right_samplesPos,
rgData.rinprebuf,
MAX_ORDER - num_samples,
num_samples
);
} else {
System$15.arraycopy(left_samples, left_samplesPos + num_samples - MAX_ORDER, rgData.linprebuf, 0, MAX_ORDER);
System$15.arraycopy(right_samples, right_samplesPos + num_samples - MAX_ORDER, rgData.rinprebuf, 0, MAX_ORDER);
}
return GAIN_ANALYSIS_OK;
};
function analyzeResult(Array2, len) {
var i;
var elems = 0;
for (i = 0; i < len; i++)
elems += Array2[i];
if (elems == 0)
return GAIN_NOT_ENOUGH_SAMPLES;
var upper = 0 | Math.ceil(elems * (1 - RMS_PERCENTILE));
for (i = len; i-- > 0; ) {
if ((upper -= Array2[i]) <= 0)
break;
}
return PINK_REF - i / GainAnalysis$1.STEPS_per_dB;
}
this.GetTitleGain = function(rgData) {
var retval = analyzeResult(rgData.A, rgData.A.length);
for (var i = 0; i < rgData.A.length; i++) {
rgData.B[i] += rgData.A[i];
rgData.A[i] = 0;
}
for (var i = 0; i < MAX_ORDER; i++)
rgData.linprebuf[i] = rgData.lstepbuf[i] = rgData.loutbuf[i] = rgData.rinprebuf[i] = rgData.rstepbuf[i] = rgData.routbuf[i] = 0;
rgData.totsamp = 0;
rgData.lsum = rgData.rsum = 0;
return retval;
};
}
var GainAnalysis_1 = GainAnalysis$1;
var new_float$14 = common.new_float;
var new_int$14 = common.new_int;
function ReplayGain() {
this.linprebuf = new_float$14(GainAnalysis_1.MAX_ORDER * 2);
this.linpre = 0;
this.lstepbuf = new_float$14(GainAnalysis_1.MAX_SAMPLES_PER_WINDOW + GainAnalysis_1.MAX_ORDER);
this.lstep = 0;
this.loutbuf = new_float$14(GainAnalysis_1.MAX_SAMPLES_PER_WINDOW + GainAnalysis_1.MAX_ORDER);
this.lout = 0;
this.rinprebuf = new_float$14(GainAnalysis_1.MAX_ORDER * 2);
this.rinpre = 0;
this.rstepbuf = new_float$14(GainAnalysis_1.MAX_SAMPLES_PER_WINDOW + GainAnalysis_1.MAX_ORDER);
this.rstep = 0;
this.routbuf = new_float$14(GainAnalysis_1.MAX_SAMPLES_PER_WINDOW + GainAnalysis_1.MAX_ORDER);
this.rout = 0;
this.sampleWindow = 0;
this.totsamp = 0;
this.lsum = 0;
this.rsum = 0;
this.freqindex = 0;
this.first = 0;
this.A = new_int$14(0 | GainAnalysis_1.STEPS_per_dB * GainAnalysis_1.MAX_dB);
this.B = new_int$14(0 | GainAnalysis_1.STEPS_per_dB * GainAnalysis_1.MAX_dB);
}
var ReplayGain_1 = ReplayGain;
function MeanBits$1(meanBits) {
this.bits = meanBits;
}
var MeanBits_1 = MeanBits$1;
var new_float$16 = common.new_float;
var new_int$16 = common.new_int;
var assert$16 = common.assert;
function CBRNewIterationLoop(_quantize) {
var quantize = _quantize;
this.quantize = quantize;
this.iteration_loop = function(gfp, pe, ms_ener_ratio, ratio) {
var gfc = gfp.internal_flags;
var l3_xmin = new_float$16(L3Side_1.SFBMAX);
var xrpow = new_float$16(576);
var targ_bits = new_int$16(2);
var mean_bits = 0, max_bits;
var l3_side = gfc.l3_side;
var mb = new MeanBits_1(mean_bits);
this.quantize.rv.ResvFrameBegin(gfp, mb);
mean_bits = mb.bits;
for (var gr = 0; gr < gfc.mode_gr; gr++) {
max_bits = this.quantize.qupvt.on_pe(
gfp,
pe,
targ_bits,
mean_bits,
gr,
gr
);
if (gfc.mode_ext == Encoder_1.MPG_MD_MS_LR) {
this.quantize.ms_convert(gfc.l3_side, gr);
this.quantize.qupvt.reduce_side(
targ_bits,
ms_ener_ratio[gr],
mean_bits,
max_bits
);
}
for (var ch = 0; ch < gfc.channels_out; ch++) {
var adjust, masking_lower_db;
var cod_info = l3_side.tt[gr][ch];
if (cod_info.block_type != Encoder_1.SHORT_TYPE) {
adjust = 0;
masking_lower_db = gfc.PSY.mask_adjust - adjust;
} else {
adjust = 0;
masking_lower_db = gfc.PSY.mask_adjust_short - adjust;
}
gfc.masking_lower = Math.pow(
10,
masking_lower_db * 0.1
);
this.quantize.init_outer_loop(gfc, cod_info);
if (this.quantize.init_xrpow(gfc, cod_info, xrpow)) {
this.quantize.qupvt.calc_xmin(
gfp,
ratio[gr][ch],
cod_info,
l3_xmin
);
this.quantize.outer_loop(
gfp,
cod_info,
l3_xmin,
xrpow,
ch,
targ_bits[ch]
);
}
this.quantize.iteration_finish_one(gfc, gr, ch);
assert$16(cod_info.part2_3_length <= LameInternalFlags_1.MAX_BITS_PER_CHANNEL);
assert$16(cod_info.part2_3_length <= targ_bits[ch]);
}
}
this.quantize.rv.ResvFrameEnd(gfc, mean_bits);
};
}
var CBRNewIterationLoop_1 = CBRNewIterationLoop;
function HuffCodeTab(len, max, tab, hl) {
this.xlen = len;
this.linmax = max;
this.table = tab;
this.hlen = hl;
}
var Tables$1 = {};
Tables$1.t1HB = [
1,
1,
1,
0
];
Tables$1.t2HB = [
1,
2,
1,
3,
1,
1,
3,
2,
0
];
Tables$1.t3HB = [
3,
2,
1,
1,
1,
1,
3,
2,
0
];
Tables$1.t5HB = [
1,
2,
6,
5,
3,
1,
4,
4,
7,
5,
7,
1,
6,
1,
1,
0
];
Tables$1.t6HB = [
7,
3,
5,
1,
6,
2,
3,
2,
5,
4,
4,
1,
3,
3,
2,
0
];
Tables$1.t7HB = [
1,
2,
10,
19,
16,
10,
3,
3,
7,
10,
5,
3,
11,
4,
13,
17,
8,
4,
12,
11,
18,
15,
11,
2,
7,
6,
9,
14,
3,
1,
6,
4,
5,
3,
2,
0
];
Tables$1.t8HB = [
3,
4,
6,
18,
12,
5,
5,
1,
2,
16,
9,
3,
7,
3,
5,
14,
7,
3,
19,
17,
15,
13,
10,
4,
13,
5,
8,
11,
5,
1,
12,
4,
4,
1,
1,
0
];
Tables$1.t9HB = [
7,
5,
9,
14,
15,
7,
6,
4,
5,
5,
6,
7,
7,
6,
8,
8,
8,
5,
15,
6,
9,
10,
5,
1,
11,
7,
9,
6,
4,
1,
14,
4,
6,
2,
6,
0
];
Tables$1.t10HB = [
1,
2,
10,
23,
35,
30,
12,
17,
3,
3,
8,
12,
18,
21,
12,
7,
11,
9,
15,
21,
32,
40,
19,
6,
14,
13,
22,
34,
46,
23,
18,
7,
20,
19,
33,
47,
27,
22,
9,
3,
31,
22,
41,
26,
21,
20,
5,
3,
14,
13,
10,
11,
16,
6,
5,
1,
9,
8,
7,
8,
4,
4,
2,
0
];
Tables$1.t11HB = [
3,
4,
10,
24,
34,
33,
21,
15,
5,
3,
4,
10,
32,
17,
11,
10,
11,
7,
13,
18,
30,
31,
20,
5,
25,
11,
19,
59,
27,
18,
12,
5,
35,
33,
31,
58,
30,
16,
7,
5,
28,
26,
32,
19,
17,
15,
8,
14,
14,
12,
9,
13,
14,
9,
4,
1,
11,
4,
6,
6,
6,
3,
2,
0
];
Tables$1.t12HB = [
9,
6,
16,
33,
41,
39,
38,
26,
7,
5,
6,
9,
23,
16,
26,
11,
17,
7,
11,
14,
21,
30,
10,
7,
17,
10,
15,
12,
18,
28,
14,
5,
32,
13,
22,
19,
18,
16,
9,
5,
40,
17,
31,
29,
17,
13,
4,
2,
27,
12,
11,
15,
10,
7,
4,
1,
27,
12,
8,
12,
6,
3,
1,
0
];
Tables$1.t13HB = [
1,
5,
14,
21,
34,
51,
46,
71,
42,
52,
68,
52,
67,
44,
43,
19,
3,
4,
12,
19,
31,
26,
44,
33,
31,
24,
32,
24,
31,
35,
22,
14,
15,
13,
23,
36,
59,
49,
77,
65,
29,
40,
30,
40,
27,
33,
42,
16,
22,
20,
37,
61,
56,
79,
73,
64,
43,
76,
56,
37,
26,
31,
25,
14,
35,
16,
60,
57,
97,
75,
114,
91,
54,
73,
55,
41,
48,
53,
23,
24,
58,
27,
50,
96,
76,
70,
93,
84,
77,
58,
79,
29,
74,
49,
41,
17,
47,
45,
78,
74,
115,
94,
90,
79,
69,
83,
71,
50,
59,
38,
36,
15,
72,
34,
56,
95,
92,
85,
91,
90,
86,
73,
77,
65,
51,
44,
43,
42,
43,
20,
30,
44,
55,
78,
72,
87,
78,
61,
46,
54,
37,
30,
20,
16,
53,
25,
41,
37,
44,
59,
54,
81,
66,
76,
57,
54,
37,
18,
39,
11,
35,
33,
31,
57,
42,
82,
72,
80,
47,
58,
55,
21,
22,
26,
38,
22,
53,
25,
23,
38,
70,
60,
51,
36,
55,
26,
34,
23,
27,
14,
9,
7,
34,
32,
28,
39,
49,
75,
30,
52,
48,
40,
52,
28,
18,
17,
9,
5,
45,
21,
34,
64,
56,
50,
49,
45,
31,
19,
12,
15,
10,
7,
6,
3,
48,
23,
20,
39,
36,
35,
53,
21,
16,
23,
13,
10,
6,
1,
4,
2,
16,
15,
17,
27,
25,
20,
29,
11,
17,
12,
16,
8,
1,
1,
0,
1
];
Tables$1.t15HB = [
7,
12,
18,
53,
47,
76,
124,
108,
89,
123,
108,
119,
107,
81,
122,
63,
13,
5,
16,
27,
46,
36,
61,
51,
42,
70,
52,
83,
65,
41,
59,
36,
19,
17,
15,
24,
41,
34,
59,
48,
40,
64,
50,
78,
62,
80,
56,
33,
29,
28,
25,
43,
39,
63,
55,
93,
76,
59,
93,
72,
54,
75,
50,
29,
52,
22,
42,
40,
67,
57,
95,
79,
72,
57,
89,
69,
49,
66,
46,
27,
77,
37,
35,
66,
58,
52,
91,
74,
62,
48,
79,
63,
90,
62,
40,
38,
125,
32,
60,
56,
50,
92,
78,
65,
55,
87,
71,
51,
73,
51,
70,
30,
109,
53,
49,
94,
88,
75,
66,
122,
91,
73,
56,
42,
64,
44,
21,
25,
90,
43,
41,
77,
73,
63,
56,
92,
77,
66,
47,
67,
48,
53,
36,
20,
71,
34,
67,
60,
58,
49,
88,
76,
67,
106,
71,
54,
38,
39,
23,
15,
109,
53,
51,
47,
90,
82,
58,
57,
48,
72,
57,
41,
23,
27,
62,
9,
86,
42,
40,
37,
70,
64,
52,
43,
70,
55,
42,
25,
29,
18,
11,
11,
118,
68,
30,
55,
50,
46,
74,
65,
49,
39,
24,
16,
22,
13,
14,
7,
91,
44,
39,
38,
34,
63,
52,
45,
31,
52,
28,
19,
14,
8,
9,
3,
123,
60,
58,
53,
47,
43,
32,
22,
37,
24,
17,
12,
15,
10,
2,
1,
71,
37,
34,
30,
28,
20,
17,
26,
21,
16,
10,
6,
8,
6,
2,
0
];
Tables$1.t16HB = [
1,
5,
14,
44,
74,
63,
110,
93,
172,
149,
138,
242,
225,
195,
376,
17,
3,
4,
12,
20,
35,
62,
53,
47,
83,
75,
68,
119,
201,
107,
207,
9,
15,
13,
23,
38,
67,
58,
103,
90,
161,
72,
127,
117,
110,
209,
206,
16,
45,
21,
39,
69,
64,
114,
99,
87,
158,
140,
252,
212,
199,
387,
365,
26,
75,
36,
68,
65,
115,
101,
179,
164,
155,
264,
246,
226,
395,
382,
362,
9,
66,
30,
59,
56,
102,
185,
173,
265,
142,
253,
232,
400,
388,
378,
445,
16,
111,
54,
52,
100,
184,
178,
160,
133,
257,
244,
228,
217,
385,
366,
715,
10,
98,
48,
91,
88,
165,
157,
148,
261,
248,
407,
397,
372,
380,
889,
884,
8,
85,
84,
81,
159,
156,
143,
260,
249,
427,
401,
392,
383,
727,
713,
708,
7,
154,
76,
73,
141,
131,
256,
245,
426,
406,
394,
384,
735,
359,
710,
352,
11,
139,
129,
67,
125,
247,
233,
229,
219,
393,
743,
737,
720,
885,
882,
439,
4,
243,
120,
118,
115,
227,
223,
396,
746,
742,
736,
721,
712,
706,
223,
436,
6,
202,
224,
222,
218,
216,
389,
386,
381,
364,
888,
443,
707,
440,
437,
1728,
4,
747,
211,
210,
208,
370,
379,
734,
723,
714,
1735,
883,
877,
876,
3459,
865,
2,
377,
369,
102,
187,
726,
722,
358,
711,
709,
866,
1734,
871,
3458,
870,
434,
0,
12,
10,
7,
11,
10,
17,
11,
9,
13,
12,
10,
7,
5,
3,
1,
3
];
Tables$1.t24HB = [
15,
13,
46,
80,
146,
262,
248,
434,
426,
669,
653,
649,
621,
517,
1032,
88,
14,
12,
21,
38,
71,
130,
122,
216,
209,
198,
327,
345,
319,
297,
279,
42,
47,
22,
41,
74,
68,
128,
120,
221,
207,
194,
182,
340,
315,
295,
541,
18,
81,
39,
75,
70,
134,
125,
116,
220,
204,
190,
178,
325,
311,
293,
271,
16,
147,
72,
69,
135,
127,
118,
112,
210,
200,
188,
352,
323,
306,
285,
540,
14,
263,
66,
129,
126,
119,
114,
214,
202,
192,
180,
341,
317,
301,
281,
262,
12,
249,
123,
121,
117,
113,
215,
206,
195,
185,
347,
330,
308,
291,
272,
520,
10,
435,
115,
111,
109,
211,
203,
196,
187,
353,
332,
313,
298,
283,
531,
381,
17,
427,
212,
208,
205,
201,
193,
186,
177,
169,
320,
303,
286,
268,
514,
377,
16,
335,
199,
197,
191,
189,
181,
174,
333,
321,
305,
289,
275,
521,
379,
371,
11,
668,
184,
183,
179,
175,
344,
331,
314,
304,
290,
277,
530,
383,
373,
366,
10,
652,
346,
171,
168,
164,
318,
309,
299,
287,
276,
263,
513,
375,
368,
362,
6,
648,
322,
316,
312,
307,
302,
292,
284,
269,
261,
512,
376,
370,
364,
359,
4,
620,
300,
296,
294,
288,
282,
273,
266,
515,
380,
374,
369,
365,
361,
357,
2,
1033,
280,
278,
274,
267,
264,
259,
382,
378,
372,
367,
363,
360,
358,
356,
0,
43,
20,
19,
17,
15,
13,
11,
9,
7,
6,
4,
7,
5,
3,
1,
3
];
Tables$1.t32HB = [
1 << 0,
5 << 1,
4 << 1,
5 << 2,
6 << 1,
5 << 2,
4 << 2,
4 << 3,
7 << 1,
3 << 2,
6 << 2,
0 << 3,
7 << 2,
2 << 3,
3 << 3,
1 << 4
];
Tables$1.t33HB = [
15 << 0,
14 << 1,
13 << 1,
12 << 2,
11 << 1,
10 << 2,
9 << 2,
8 << 3,
7 << 1,
6 << 2,
5 << 2,
4 << 3,
3 << 2,
2 << 3,
1 << 3,
0 << 4
];
Tables$1.t1l = [
1,
4,
3,
5
];
Tables$1.t2l = [
1,
4,
7,
4,
5,
7,
6,
7,
8
];
Tables$1.t3l = [
2,
3,
7,
4,
4,
7,
6,
7,
8
];
Tables$1.t5l = [
1,
4,
7,
8,
4,
5,
8,
9,
7,
8,
9,
10,
8,
8,
9,
10
];
Tables$1.t6l = [
3,
4,
6,
8,
4,
4,
6,
7,
5,
6,
7,
8,
7,
7,
8,
9
];
Tables$1.t7l = [
1,
4,
7,
9,
9,
10,
4,
6,
8,
9,
9,
10,
7,
7,
9,
10,
10,
11,
8,
9,
10,
11,
11,
11,
8,
9,
10,
11,
11,
12,
9,
10,
11,
12,
12,
12
];
Tables$1.t8l = [
2,
4,
7,
9,
9,
10,
4,
4,
6,
10,
10,
10,
7,
6,
8,
10,
10,
11,
9,
10,
10,
11,
11,
12,
9,
9,
10,
11,
12,
12,
10,
10,
11,
11,
13,
13
];
Tables$1.t9l = [
3,
4,
6,
7,
9,
10,
4,
5,
6,
7,
8,
10,
5,
6,
7,
8,
9,
10,
7,
7,
8,
9,
9,
10,
8,
8,
9,
9,
10,
11,
9,
9,
10,
10,
11,
11
];
Tables$1.t10l = [
1,
4,
7,
9,
10,
10,
10,
11,
4,
6,
8,
9,
10,
11,
10,
10,
7,
8,
9,
10,
11,
12,
11,
11,
8,
9,
10,
11,
12,
12,
11,
12,
9,
10,
11,
12,
12,
12,
12,
12,
10,
11,
12,
12,
13,
13,
12,
13,
9,
10,
11,
12,
12,
12,
13,
13,
10,
10,
11,
12,
12,
13,
13,
13
];
Tables$1.t11l = [
2,
4,
6,
8,
9,
10,
9,
10,
4,
5,
6,
8,
10,
10,
9,
10,
6,
7,
8,
9,
10,
11,
10,
10,
8,
8,
9,
11,
10,
12,
10,
11,
9,
10,
10,
11,
11,
12,
11,
12,
9,
10,
11,
12,
12,
13,
12,
13,
9,
9,
9,
10,
11,
12,
12,
12,
9,
9,
10,
11,
12,
12,
12,
12
];
Tables$1.t12l = [
4,
4,
6,
8,
9,
10,
10,
10,
4,
5,
6,
7,
9,
9,
10,
10,
6,
6,
7,
8,
9,
10,
9,
10,
7,
7,
8,
8,
9,
10,
10,
10,
8,
8,
9,
9,
10,
10,
10,
11,
9,
9,
10,
10,
10,
11,
10,
11,
9,
9,
9,
10,
10,
11,
11,
12,
10,
10,
10,
11,
11,
11,
11,
12
];
Tables$1.t13l = [
1,
5,
7,
8,
9,
10,
10,
11,
10,
11,
12,
12,
13,
13,
14,
14,
4,
6,
8,
9,
10,
10,
11,
11,
11,
11,
12,
12,
13,
14,
14,
14,
7,
8,
9,
10,
11,
11,
12,
12,
11,
12,
12,
13,
13,
14,
15,
15,
8,
9,
10,
11,
11,
12,
12,
12,
12,
13,
13,
13,
13,
14,
15,
15,
9,
9,
11,
11,
12,
12,
13,
13,
12,
13,
13,
14,
14,
15,
15,
16,
10,
10,
11,
12,
12,
12,
13,
13,
13,
13,
14,
13,
15,
15,
16,
16,
10,
11,
12,
12,
13,
13,
13,
13,
13,
14,
14,
14,
15,
15,
16,
16,
11,
11,
12,
13,
13,
13,
14,
14,
14,
14,
15,
15,
15,
16,
18,
18,
10,
10,
11,
12,
12,
13,
13,
14,
14,
14,
14,
15,
15,
16,
17,
17,
11,
11,
12,
12,
13,
13,
13,
15,
14,
15,
15,
16,
16,
16,
18,
17,
11,
12,
12,
13,
13,
14,
14,
15,
14,
15,
16,
15,
16,
17,
18,
19,
12,
12,
12,
13,
14,
14,
14,
14,
15,
15,
15,
16,
17,
17,
17,
18,
12,
13,
13,
14,
14,
15,
14,
15,
16,
16,
17,
17,
17,
18,
18,
18,
13,
13,
14,
15,
15,
15,
16,
16,
16,
16,
16,
17,
18,
17,
18,
18,
14,
14,
14,
15,
15,
15,
17,
16,
16,
19,
17,
17,
17,
19,
18,
18,
13,
14,
15,
16,
16,
16,
17,
16,
17,
17,
18,
18,
21,
20,
21,
18
];
Tables$1.t15l = [
3,
5,
6,
8,
8,
9,
10,
10,
10,
11,
11,
12,
12,
12,
13,
14,
5,
5,
7,
8,
9,
9,
10,
10,
10,
11,
11,
12,
12,
12,
13,
13,
6,
7,
7,
8,
9,
9,
10,
10,
10,
11,
11,
12,
12,
13,
13,
13,
7,
8,
8,
9,
9,
10,
10,
11,
11,
11,
12,
12,
12,
13,
13,
13,
8,
8,
9,
9,
10,
10,
11,
11,
11,
11,
12,
12,
12,
13,
13,
13,
9,
9,
9,
10,
10,
10,
11,
11,
11,
11,
12,
12,
13,
13,
13,
14,
10,
9,
10,
10,
10,
11,
11,
11,
11,
12,
12,
12,
13,
13,
14,
14,
10,
10,
10,
11,
11,
11,
11,
12,
12,
12,
12,
12,
13,
13,
13,
14,
10,
10,
10,
11,
11,
11,
11,
12,
12,
12,
12,
13,
13,
14,
14,
14,
10,
10,
11,
11,
11,
11,
12,
12,
12,
13,
13,
13,
13,
14,
14,
14,
11,
11,
11,
11,
12,
12,
12,
12,
12,
13,
13,
13,
13,
14,
15,
14,
11,
11,
11,
11,
12,
12,
12,
12,
13,
13,
13,
13,
14,
14,
14,
15,
12,
12,
11,
12,
12,
12,
13,
13,
13,
13,
13,
13,
14,
14,
15,
15,
12,
12,
12,
12,
12,
13,
13,
13,
13,
14,
14,
14,
14,
14,
15,
15,
13,
13,
13,
13,
13,
13,
13,
13,
14,
14,
14,
14,
15,
15,
14,
15,
13,
13,
13,
13,
13,
13,
13,
14,
14,
14,
14,
14,
15,
15,
15,
15
];
Tables$1.t16_5l = [
1,
5,
7,
9,
10,
10,
11,
11,
12,
12,
12,
13,
13,
13,
14,
11,
4,
6,
8,
9,
10,
11,
11,
11,
12,
12,
12,
13,
14,
13,
14,
11,
7,
8,
9,
10,
11,
11,
12,
12,
13,
12,
13,
13,
13,
14,
14,
12,
9,
9,
10,
11,
11,
12,
12,
12,
13,
13,
14,
14,
14,
15,
15,
13,
10,
10,
11,
11,
12,
12,
13,
13,
13,
14,
14,
14,
15,
15,
15,
12,
10,
10,
11,
11,
12,
13,
13,
14,
13,
14,
14,
15,
15,
15,
16,
13,
11,
11,
11,
12,
13,
13,
13,
13,
14,
14,
14,
14,
15,
15,
16,
13,
11,
11,
12,
12,
13,
13,
13,
14,
14,
15,
15,
15,
15,
17,
17,
13,
11,
12,
12,
13,
13,
13,
14,
14,
15,
15,
15,
15,
16,
16,
16,
13,
12,
12,
12,
13,
13,
14,
14,
15,
15,
15,
15,
16,
15,
16,
15,
14,
12,
13,
12,
13,
14,
14,
14,
14,
15,
16,
16,
16,
17,
17,
16,
13,
13,
13,
13,
13,
14,
14,
15,
16,
16,
16,
16,
16,
16,
15,
16,
14,
13,
14,
14,
14,
14,
15,
15,
15,
15,
17,
16,
16,
16,
16,
18,
14,
15,
14,
14,
14,
15,
15,
16,
16,
16,
18,
17,
17,
17,
19,
17,
14,
14,
15,
13,
14,
16,
16,
15,
16,
16,
17,
18,
17,
19,
17,
16,
14,
11,
11,
11,
12,
12,
13,
13,
13,
14,
14,
14,
14,
14,
14,
14,
12
];
Tables$1.t16l = [
1,
5,
7,
9,
10,
10,
11,
11,
12,
12,
12,
13,
13,
13,
14,
10,
4,
6,
8,
9,
10,
11,
11,
11,
12,
12,
12,
13,
14,
13,
14,
10,
7,
8,
9,
10,
11,
11,
12,
12,
13,
12,
13,
13,
13,
14,
14,
11,
9,
9,
10,
11,
11,
12,
12,
12,
13,
13,
14,
14,
14,
15,
15,
12,
10,
10,
11,
11,
12,
12,
13,
13,
13,
14,
14,
14,
15,
15,
15,
11,
10,
10,
11,
11,
12,
13,
13,
14,
13,
14,
14,
15,
15,
15,
16,
12,
11,
11,
11,
12,
13,
13,
13,
13,
14,
14,
14,
14,
15,
15,
16,
12,
11,
11,
12,
12,
13,
13,
13,
14,
14,
15,
15,
15,
15,
17,
17,
12,
11,
12,
12,
13,
13,
13,
14,
14,
15,
15,
15,
15,
16,
16,
16,
12,
12,
12,
12,
13,
13,
14,
14,
15,
15,
15,
15,
16,
15,
16,
15,
13,
12,
13,
12,
13,
14,
14,
14,
14,
15,
16,
16,
16,
17,
17,
16,
12,
13,
13,
13,
13,
14,
14,
15,
16,
16,
16,
16,
16,
16,
15,
16,
13,
13,
14,
14,
14,
14,
15,
15,
15,
15,
17,
16,
16,
16,
16,
18,
13,
15,
14,
14,
14,
15,
15,
16,
16,
16,
18,
17,
17,
17,
19,
17,
13,
14,
15,
13,
14,
16,
16,
15,
16,
16,
17,
18,
17,
19,
17,
16,
13,
10,
10,
10,
11,
11,
12,
12,
12,
13,
13,
13,
13,
13,
13,
13,
10
];
Tables$1.t24l = [
4,
5,
7,
8,
9,
10,
10,
11,
11,
12,
12,
12,
12,
12,
13,
10,
5,
6,
7,
8,
9,
10,
10,
11,
11,
11,
12,
12,
12,
12,
12,
10,
7,
7,
8,
9,
9,
10,
10,
11,
11,
11,
11,
12,
12,
12,
13,
9,
8,
8,
9,
9,
10,
10,
10,
11,
11,
11,
11,
12,
12,
12,
12,
9,
9,
9,
9,
10,
10,
10,
10,
11,
11,
11,
12,
12,
12,
12,
13,
9,
10,
9,
10,
10,
10,
10,
11,
11,
11,
11,
12,
12,
12,
12,
12,
9,
10,
10,
10,
10,
10,
11,
11,
11,
11,
12,
12,
12,
12,
12,
13,
9,
11,
10,
10,
10,
11,
11,
11,
11,
12,
12,
12,
12,
12,
13,
13,
10,
11,
11,
11,
11,
11,
11,
11,
11,
11,
12,
12,
12,
12,
13,
13,
10,
11,
11,
11,
11,
11,
11,
11,
12,
12,
12,
12,
12,
13,
13,
13,
10,
12,
11,
11,
11,
11,
12,
12,
12,
12,
12,
12,
13,
13,
13,
13,
10,
12,
12,
11,
11,
11,
12,
12,
12,
12,
12,
12,
13,
13,
13,
13,
10,
12,
12,
12,
12,
12,
12,
12,
12,
12,
12,
13,
13,
13,
13,
13,
10,
12,
12,
12,
12,
12,
12,
12,
12,
13,
13,
13,
13,
13,
13,
13,
10,
13,
12,
12,
12,
12,
12,
12,
13,
13,
13,
13,
13,
13,
13,
13,
10,
9,
9,
9,
9,
9,
9,
9,
9,
9,
9,
9,
10,
10,
10,
10,
6
];
Tables$1.t32l = [
1 + 0,
4 + 1,
4 + 1,
5 + 2,
4 + 1,
6 + 2,
5 + 2,
6 + 3,
4 + 1,
5 + 2,
5 + 2,
6 + 3,
5 + 2,
6 + 3,
6 + 3,
6 + 4
];
Tables$1.t33l = [
4 + 0,
4 + 1,
4 + 1,
4 + 2,
4 + 1,
4 + 2,
4 + 2,
4 + 3,
4 + 1,
4 + 2,
4 + 2,
4 + 3,
4 + 2,
4 + 3,
4 + 3,
4 + 4
];
Tables$1.ht = [
/* xlen, linmax, table, hlen */
new HuffCodeTab(0, 0, null, null),
new HuffCodeTab(2, 0, Tables$1.t1HB, Tables$1.t1l),
new HuffCodeTab(3, 0, Tables$1.t2HB, Tables$1.t2l),
new HuffCodeTab(3, 0, Tables$1.t3HB, Tables$1.t3l),
new HuffCodeTab(0, 0, null, null),
/* Apparently not used */
new HuffCodeTab(4, 0, Tables$1.t5HB, Tables$1.t5l),
new HuffCodeTab(4, 0, Tables$1.t6HB, Tables$1.t6l),
new HuffCodeTab(6, 0, Tables$1.t7HB, Tables$1.t7l),
new HuffCodeTab(6, 0, Tables$1.t8HB, Tables$1.t8l),
new HuffCodeTab(6, 0, Tables$1.t9HB, Tables$1.t9l),
new HuffCodeTab(8, 0, Tables$1.t10HB, Tables$1.t10l),
new HuffCodeTab(8, 0, Tables$1.t11HB, Tables$1.t11l),
new HuffCodeTab(8, 0, Tables$1.t12HB, Tables$1.t12l),
new HuffCodeTab(16, 0, Tables$1.t13HB, Tables$1.t13l),
new HuffCodeTab(0, 0, null, Tables$1.t16_5l),
/* Apparently not used */
new HuffCodeTab(16, 0, Tables$1.t15HB, Tables$1.t15l),
new HuffCodeTab(1, 1, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(2, 3, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(3, 7, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(4, 15, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(6, 63, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(8, 255, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(10, 1023, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(13, 8191, Tables$1.t16HB, Tables$1.t16l),
new HuffCodeTab(4, 15, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(5, 31, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(6, 63, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(7, 127, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(8, 255, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(9, 511, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(11, 2047, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(13, 8191, Tables$1.t24HB, Tables$1.t24l),
new HuffCodeTab(0, 0, Tables$1.t32HB, Tables$1.t32l),
new HuffCodeTab(0, 0, Tables$1.t33HB, Tables$1.t33l)
];
Tables$1.largetbl = [
65540,
327685,
458759,
589832,
655369,
655370,
720906,
720907,
786443,
786444,
786444,
851980,
851980,
851980,
917517,
655370,
262149,
393222,
524295,
589832,
655369,
720906,
720906,
720907,
786443,
786443,
786444,
851980,
917516,
851980,
917516,
655370,
458759,
524295,
589832,
655369,
720905,
720906,
786442,
786443,
851979,
786443,
851979,
851980,
851980,
917516,
917517,
720905,
589832,
589832,
655369,
720905,
720906,
786442,
786442,
786443,
851979,
851979,
917515,
917516,
917516,
983052,
983052,
786441,
655369,
655369,
720905,
720906,
786442,
786442,
851978,
851979,
851979,
917515,
917516,
917516,
983052,
983052,
983053,
720905,
655370,
655369,
720906,
720906,
786442,
851978,
851979,
917515,
851979,
917515,
917516,
983052,
983052,
983052,
1048588,
786441,
720906,
720906,
720906,
786442,
851978,
851979,
851979,
851979,
917515,
917516,
917516,
917516,
983052,
983052,
1048589,
786441,
720907,
720906,
786442,
786442,
851979,
851979,
851979,
917515,
917516,
983052,
983052,
983052,
983052,
1114125,
1114125,
786442,
720907,
786443,
786443,
851979,
851979,
851979,
917515,
917515,
983051,
983052,
983052,
983052,
1048588,
1048589,
1048589,
786442,
786443,
786443,
786443,
851979,
851979,
917515,
917515,
983052,
983052,
983052,
983052,
1048588,
983053,
1048589,
983053,
851978,
786444,
851979,
786443,
851979,
917515,
917516,
917516,
917516,
983052,
1048588,
1048588,
1048589,
1114125,
1114125,
1048589,
786442,
851980,
851980,
851979,
851979,
917515,
917516,
983052,
1048588,
1048588,
1048588,
1048588,
1048589,
1048589,
983053,
1048589,
851978,
851980,
917516,
917516,
917516,
917516,
983052,
983052,
983052,
983052,
1114124,
1048589,
1048589,
1048589,
1048589,
1179661,
851978,
983052,
917516,
917516,
917516,
983052,
983052,
1048588,
1048588,
1048589,
1179661,
1114125,
1114125,
1114125,
1245197,
1114125,
851978,
917517,
983052,
851980,
917516,
1048588,
1048588,
983052,
1048589,
1048589,
1114125,
1179661,
1114125,
1245197,
1114125,
1048589,
851978,
655369,
655369,
655369,
720905,
720905,
786441,
786441,
786441,
851977,
851977,
851977,
851978,
851978,
851978,
851978,
655366
];
Tables$1.table23 = [
65538,
262147,
458759,
262148,
327684,
458759,
393222,
458759,
524296
];
Tables$1.table56 = [
65539,
262148,
458758,
524296,
262148,
327684,
524294,
589831,
458757,
524294,
589831,
655368,
524295,
524295,
589832,
655369
];
Tables$1.bitrate_table = [
[0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1],
/* MPEG 2 */
[0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1],
/* MPEG 1 */
[0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1]
/* MPEG 2.5 */
];
Tables$1.samplerate_table = [
[22050, 24e3, 16e3, -1],
[44100, 48e3, 32e3, -1],
[11025, 12e3, 8e3, -1]
];
Tables$1.scfsi_band = [0, 6, 11, 16, 21];
var Tables_1 = Tables$1;
var VbrMode$19 = common.VbrMode;
var Float$19 = common.Float;
var Util$19 = common.Util;
var new_float$19 = common.new_float;
var new_int$19 = common.new_int;
var assert$19 = common.assert;
QuantizePVT$1.Q_MAX = 256 + 1;
QuantizePVT$1.Q_MAX2 = 116;
QuantizePVT$1.LARGE_BITS = 1e5;
QuantizePVT$1.IXMAX_VAL = 8206;
function QuantizePVT$1() {
var tak = null;
var rv = null;
var psy = null;
this.setModules = function(_tk, _rv, _psy) {
tak = _tk;
rv = _rv;
psy = _psy;
};
function POW20(x) {
assert$19(0 <= x + QuantizePVT$1.Q_MAX2 && x < QuantizePVT$1.Q_MAX);
return pow20[x + QuantizePVT$1.Q_MAX2];
}
this.IPOW20 = function(x) {
assert$19(0 <= x && x < QuantizePVT$1.Q_MAX);
return ipow20[x];
};
var DBL_EPSILON = 2220446049250313e-31;
var IXMAX_VAL = QuantizePVT$1.IXMAX_VAL;
var PRECALC_SIZE = IXMAX_VAL + 2;
var Q_MAX = QuantizePVT$1.Q_MAX;
var Q_MAX2 = QuantizePVT$1.Q_MAX2;
var LARGE_BITS = QuantizePVT$1.LARGE_BITS;
var NSATHSCALE = 100;
this.nr_of_sfb_block = [
[[6, 5, 5, 5], [9, 9, 9, 9], [6, 9, 9, 9]],
[[6, 5, 7, 3], [9, 9, 12, 6], [6, 9, 12, 6]],
[[11, 10, 0, 0], [18, 18, 0, 0], [15, 18, 0, 0]],
[[7, 7, 7, 0], [12, 12, 12, 0], [6, 15, 12, 0]],
[[6, 6, 6, 3], [12, 9, 9, 6], [6, 12, 9, 6]],
[[8, 8, 5, 0], [15, 12, 9, 0], [6, 18, 9, 0]]
];
var pretab = [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
2,
2,
3,
3,
3,
2,
0
];
this.pretab = pretab;
this.sfBandIndex = [
// Table B.2.b: 22.05 kHz
new ScaleFac_1(
[
0,
6,
12,
18,
24,
30,
36,
44,
54,
66,
80,
96,
116,
140,
168,
200,
238,
284,
336,
396,
464,
522,
576
],
[0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
// sfb12 pseudo sub bands
),
/* Table B.2.c: 24 kHz */
/* docs: 332. mpg123(broken): 330 */
new ScaleFac_1(
[
0,
6,
12,
18,
24,
30,
36,
44,
54,
66,
80,
96,
114,
136,
162,
194,
232,
278,
332,
394,
464,
540,
576
],
[0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
),
/* Table B.2.a: 16 kHz */
new ScaleFac_1(
[
0,
6,
12,
18,
24,
30,
36,
44,
54,
66,
80,
96,
116,
140,
168,
200,
238,
284,
336,
396,
464,
522,
576
],
[0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
),
/* Table B.8.b: 44.1 kHz */
new ScaleFac_1(
[
0,
4,
8,
12,
16,
20,
24,
30,
36,
44,
52,
62,
74,
90,
110,
134,
162,
196,
238,
288,
342,
418,
576
],
[0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
),
/* Table B.8.c: 48 kHz */
new ScaleFac_1(
[
0,
4,
8,
12,
16,
20,
24,
30,
36,
42,
50,
60,
72,
88,
106,
128,
156,
190,
230,
276,
330,
384,
576
],
[0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
),
/* Table B.8.a: 32 kHz */
new ScaleFac_1(
[
0,
4,
8,
12,
16,
20,
24,
30,
36,
44,
54,
66,
82,
102,
126,
156,
194,
240,
296,
364,
448,
550,
576
],
[0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
),
/* MPEG-2.5 11.025 kHz */
new ScaleFac_1(
[
0,
6,
12,
18,
24,
30,
36,
44,
54,
66,
80,
96,
116,
140,
168,
200,
238,
284,
336,
396,
464,
522,
576
],
[
0 / 3,
12 / 3,
24 / 3,
36 / 3,
54 / 3,
78 / 3,
108 / 3,
144 / 3,
186 / 3,
240 / 3,
312 / 3,
402 / 3,
522 / 3,
576 / 3
],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
),
/* MPEG-2.5 12 kHz */
new ScaleFac_1(
[
0,
6,
12,
18,
24,
30,
36,
44,
54,
66,
80,
96,
116,
140,
168,
200,
238,
284,
336,
396,
464,
522,
576
],
[
0 / 3,
12 / 3,
24 / 3,
36 / 3,
54 / 3,
78 / 3,
108 / 3,
144 / 3,
186 / 3,
240 / 3,
312 / 3,
402 / 3,
522 / 3,
576 / 3
],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
),
/* MPEG-2.5 8 kHz */
new ScaleFac_1(
[
0,
12,
24,
36,
48,
60,
72,
88,
108,
132,
160,
192,
232,
280,
336,
400,
476,
566,
568,
570,
572,
574,
576
],
[
0 / 3,
24 / 3,
48 / 3,
72 / 3,
108 / 3,
156 / 3,
216 / 3,
288 / 3,
372 / 3,
480 / 3,
486 / 3,
492 / 3,
498 / 3,
576 / 3
],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]
/* sfb12 pseudo sub bands */
)
];
var pow20 = new_float$19(Q_MAX + Q_MAX2 + 1);
var ipow20 = new_float$19(Q_MAX);
var pow43 = new_float$19(PRECALC_SIZE);
var adj43 = new_float$19(PRECALC_SIZE);
this.adj43 = adj43;
function ATHmdct(gfp, f) {
var ath = psy.ATHformula(f, gfp);
ath -= NSATHSCALE;
ath = Math.pow(10, ath / 10 + gfp.ATHlower);
return ath;
}
function compute_ath(gfp) {
var ATH_l = gfp.internal_flags.ATH.l;
var ATH_psfb21 = gfp.internal_flags.ATH.psfb21;
var ATH_s = gfp.internal_flags.ATH.s;
var ATH_psfb12 = gfp.internal_flags.ATH.psfb12;
var gfc = gfp.internal_flags;
var samp_freq = gfp.out_samplerate;
for (var sfb = 0; sfb < Encoder_1.SBMAX_l; sfb++) {
var start = gfc.scalefac_band.l[sfb];
var end = gfc.scalefac_band.l[sfb + 1];
ATH_l[sfb] = Float$19.MAX_VALUE;
for (var i = start; i < end; i++) {
var freq = i * samp_freq / (2 * 576);
var ATH_f = ATHmdct(gfp, freq);
ATH_l[sfb] = Math.min(ATH_l[sfb], ATH_f);
}
}
for (var sfb = 0; sfb < Encoder_1.PSFB21; sfb++) {
var start = gfc.scalefac_band.psfb21[sfb];
var end = gfc.scalefac_band.psfb21[sfb + 1];
ATH_psfb21[sfb] = Float$19.MAX_VALUE;
for (var i = start; i < end; i++) {
var freq = i * samp_freq / (2 * 576);
var ATH_f = ATHmdct(gfp, freq);
ATH_psfb21[sfb] = Math.min(ATH_psfb21[sfb], ATH_f);
}
}
for (var sfb = 0; sfb < Encoder_1.SBMAX_s; sfb++) {
var start = gfc.scalefac_band.s[sfb];
var end = gfc.scalefac_band.s[sfb + 1];
ATH_s[sfb] = Float$19.MAX_VALUE;
for (var i = start; i < end; i++) {
var freq = i * samp_freq / (2 * 192);
var ATH_f = ATHmdct(gfp, freq);
ATH_s[sfb] = Math.min(ATH_s[sfb], ATH_f);
}
ATH_s[sfb] *= gfc.scalefac_band.s[sfb + 1] - gfc.scalefac_band.s[sfb];
}
for (var sfb = 0; sfb < Encoder_1.PSFB12; sfb++) {
var start = gfc.scalefac_band.psfb12[sfb];
var end = gfc.scalefac_band.psfb12[sfb + 1];
ATH_psfb12[sfb] = Float$19.MAX_VALUE;
for (var i = start; i < end; i++) {
var freq = i * samp_freq / (2 * 192);
var ATH_f = ATHmdct(gfp, freq);
ATH_psfb12[sfb] = Math.min(ATH_psfb12[sfb], ATH_f);
}
ATH_psfb12[sfb] *= gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12];
}
if (gfp.noATH) {
for (var sfb = 0; sfb < Encoder_1.SBMAX_l; sfb++) {
ATH_l[sfb] = 1e-20;
}
for (var sfb = 0; sfb < Encoder_1.PSFB21; sfb++) {
ATH_psfb21[sfb] = 1e-20;
}
for (var sfb = 0; sfb < Encoder_1.SBMAX_s; sfb++) {
ATH_s[sfb] = 1e-20;
}
for (var sfb = 0; sfb < Encoder_1.PSFB12; sfb++) {
ATH_psfb12[sfb] = 1e-20;
}
}
gfc.ATH.floor = 10 * Math.log10(ATHmdct(gfp, -1));
}
this.iteration_init = function(gfp) {
var gfc = gfp.internal_flags;
var l3_side = gfc.l3_side;
var i;
if (gfc.iteration_init_init == 0) {
gfc.iteration_init_init = 1;
l3_side.main_data_begin = 0;
compute_ath(gfp);
pow43[0] = 0;
for (i = 1; i < PRECALC_SIZE; i++)
pow43[i] = Math.pow(i, 4 / 3);
for (i = 0; i < PRECALC_SIZE - 1; i++)
adj43[i] = i + 1 - Math.pow(
0.5 * (pow43[i] + pow43[i + 1]),
0.75
);
adj43[i] = 0.5;
for (i = 0; i < Q_MAX; i++)
ipow20[i] = Math.pow(2, (i - 210) * -0.1875);
for (i = 0; i <= Q_MAX + Q_MAX2; i++)
pow20[i] = Math.pow(2, (i - 210 - Q_MAX2) * 0.25);
tak.huffman_init(gfc);
{
var bass, alto, treble, sfb21;
i = gfp.exp_nspsytune >> 2 & 63;
if (i >= 32)
i -= 64;
bass = Math.pow(10, i / 4 / 10);
i = gfp.exp_nspsytune >> 8 & 63;
if (i >= 32)
i -= 64;
alto = Math.pow(10, i / 4 / 10);
i = gfp.exp_nspsytune >> 14 & 63;
if (i >= 32)
i -= 64;
treble = Math.pow(10, i / 4 / 10);
i = gfp.exp_nspsytune >> 20 & 63;
if (i >= 32)
i -= 64;
sfb21 = treble * Math.pow(10, i / 4 / 10);
for (i = 0; i < Encoder_1.SBMAX_l; i++) {
var f;
if (i <= 6)
f = bass;
else if (i <= 13)
f = alto;
else if (i <= 20)
f = treble;
else
f = sfb21;
gfc.nsPsy.longfact[i] = f;
}
for (i = 0; i < Encoder_1.SBMAX_s; i++) {
var f;
if (i <= 5)
f = bass;
else if (i <= 10)
f = alto;
else if (i <= 11)
f = treble;
else
f = sfb21;
gfc.nsPsy.shortfact[i] = f;
}
}
}
};
this.on_pe = function(gfp, pe, targ_bits, mean_bits, gr, cbr) {
var gfc = gfp.internal_flags;
var tbits = 0, bits;
var add_bits = new_int$19(2);
var ch;
var mb = new MeanBits_1(tbits);
var extra_bits = rv.ResvMaxBits(gfp, mean_bits, mb, cbr);
tbits = mb.bits;
var max_bits = tbits + extra_bits;
if (max_bits > LameInternalFlags_1.MAX_BITS_PER_GRANULE) {
max_bits = LameInternalFlags_1.MAX_BITS_PER_GRANULE;
}
for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
targ_bits[ch] = Math.min(
LameInternalFlags_1.MAX_BITS_PER_CHANNEL,
tbits / gfc.channels_out
);
add_bits[ch] = 0 | targ_bits[ch] * pe[gr][ch] / 700 - targ_bits[ch];
if (add_bits[ch] > mean_bits * 3 / 4)
add_bits[ch] = mean_bits * 3 / 4;
if (add_bits[ch] < 0)
add_bits[ch] = 0;
if (add_bits[ch] + targ_bits[ch] > LameInternalFlags_1.MAX_BITS_PER_CHANNEL)
add_bits[ch] = Math.max(
0,
LameInternalFlags_1.MAX_BITS_PER_CHANNEL - targ_bits[ch]
);
bits += add_bits[ch];
}
if (bits > extra_bits) {
for (ch = 0; ch < gfc.channels_out; ++ch) {
add_bits[ch] = extra_bits * add_bits[ch] / bits;
}
}
for (ch = 0; ch < gfc.channels_out; ++ch) {
targ_bits[ch] += add_bits[ch];
extra_bits -= add_bits[ch];
}
for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
bits += targ_bits[ch];
}
if (bits > LameInternalFlags_1.MAX_BITS_PER_GRANULE) {
var sum = 0;
for (ch = 0; ch < gfc.channels_out; ++ch) {
targ_bits[ch] *= LameInternalFlags_1.MAX_BITS_PER_GRANULE;
targ_bits[ch] /= bits;
sum += targ_bits[ch];
}
assert$19(sum <= LameInternalFlags_1.MAX_BITS_PER_GRANULE);
}
return max_bits;
};
this.reduce_side = function(targ_bits, ms_ener_ratio, mean_bits, max_bits) {
assert$19(max_bits <= LameInternalFlags_1.MAX_BITS_PER_GRANULE);
assert$19(targ_bits[0] + targ_bits[1] <= LameInternalFlags_1.MAX_BITS_PER_GRANULE);
var fac = 0.33 * (0.5 - ms_ener_ratio) / 0.5;
if (fac < 0)
fac = 0;
if (fac > 0.5)
fac = 0.5;
var move_bits = 0 | fac * 0.5 * (targ_bits[0] + targ_bits[1]);
if (move_bits > LameInternalFlags_1.MAX_BITS_PER_CHANNEL - targ_bits[0]) {
move_bits = LameInternalFlags_1.MAX_BITS_PER_CHANNEL - targ_bits[0];
}
if (move_bits < 0)
move_bits = 0;
if (targ_bits[1] >= 125) {
if (targ_bits[1] - move_bits > 125) {
if (targ_bits[0] < mean_bits)
targ_bits[0] += move_bits;
targ_bits[1] -= move_bits;
} else {
targ_bits[0] += targ_bits[1] - 125;
targ_bits[1] = 125;
}
}
move_bits = targ_bits[0] + targ_bits[1];
if (move_bits > max_bits) {
targ_bits[0] = max_bits * targ_bits[0] / move_bits;
targ_bits[1] = max_bits * targ_bits[1] / move_bits;
}
assert$19(targ_bits[0] <= LameInternalFlags_1.MAX_BITS_PER_CHANNEL);
assert$19(targ_bits[1] <= LameInternalFlags_1.MAX_BITS_PER_CHANNEL);
assert$19(targ_bits[0] + targ_bits[1] <= LameInternalFlags_1.MAX_BITS_PER_GRANULE);
};
this.athAdjust = function(a, x, athFloor) {
var o = 90.30873362;
var p = 94.82444863;
var u = Util$19.FAST_LOG10_X(x, 10);
var v = a * a;
var w = 0;
u -= athFloor;
if (v > 1e-20)
w = 1 + Util$19.FAST_LOG10_X(v, 10 / o);
if (w < 0)
w = 0;
u *= w;
u += athFloor + o - p;
return Math.pow(10, 0.1 * u);
};
this.calc_xmin = function(gfp, ratio, cod_info, pxmin) {
var pxminPos = 0;
var gfc = gfp.internal_flags;
var gsfb, j = 0, ath_over = 0;
var ATH2 = gfc.ATH;
var xr = cod_info.xr;
var enable_athaa_fix = gfp.VBR == VbrMode$19.vbr_mtrh ? 1 : 0;
var masking_lower = gfc.masking_lower;
if (gfp.VBR == VbrMode$19.vbr_mtrh || gfp.VBR == VbrMode$19.vbr_mt) {
masking_lower = 1;
}
for (gsfb = 0; gsfb < cod_info.psy_lmax; gsfb++) {
var en0, xmin;
var rh1, rh2;
var width, l;
if (gfp.VBR == VbrMode$19.vbr_rh || gfp.VBR == VbrMode$19.vbr_mtrh)
xmin = athAdjust(ATH2.adjust, ATH2.l[gsfb], ATH2.floor);
else
xmin = ATH2.adjust * ATH2.l[gsfb];
width = cod_info.width[gsfb];
rh1 = xmin / width;
rh2 = DBL_EPSILON;
l = width >> 1;
en0 = 0;
do {
var xa, xb;
xa = xr[j] * xr[j];
en0 += xa;
rh2 += xa < rh1 ? xa : rh1;
j++;
xb = xr[j] * xr[j];
en0 += xb;
rh2 += xb < rh1 ? xb : rh1;
j++;
} while (--l > 0);
if (en0 > xmin)
ath_over++;
if (gsfb == Encoder_1.SBPSY_l) {
var x = xmin * gfc.nsPsy.longfact[gsfb];
if (rh2 < x) {
rh2 = x;
}
}
if (enable_athaa_fix != 0) {
xmin = rh2;
}
if (!gfp.ATHonly) {
var e = ratio.en.l[gsfb];
if (e > 0) {
var x;
x = en0 * ratio.thm.l[gsfb] * masking_lower / e;
if (enable_athaa_fix != 0)
x *= gfc.nsPsy.longfact[gsfb];
if (xmin < x)
xmin = x;
}
}
if (enable_athaa_fix != 0)
pxmin[pxminPos++] = xmin;
else
pxmin[pxminPos++] = xmin * gfc.nsPsy.longfact[gsfb];
}
var max_nonzero = 575;
if (cod_info.block_type != Encoder_1.SHORT_TYPE) {
var k = 576;
while (k-- != 0 && BitStream.EQ(xr[k], 0)) {
max_nonzero = k;
}
}
cod_info.max_nonzero_coeff = max_nonzero;
for (var sfb = cod_info.sfb_smin; gsfb < cod_info.psymax; sfb++, gsfb += 3) {
var width, b;
var tmpATH;
if (gfp.VBR == VbrMode$19.vbr_rh || gfp.VBR == VbrMode$19.vbr_mtrh)
tmpATH = athAdjust(ATH2.adjust, ATH2.s[sfb], ATH2.floor);
else
tmpATH = ATH2.adjust * ATH2.s[sfb];
width = cod_info.width[gsfb];
for (b = 0; b < 3; b++) {
var en0 = 0, xmin;
var rh1, rh2;
var l = width >> 1;
rh1 = tmpATH / width;
rh2 = DBL_EPSILON;
do {
var xa, xb;
xa = xr[j] * xr[j];
en0 += xa;
rh2 += xa < rh1 ? xa : rh1;
j++;
xb = xr[j] * xr[j];
en0 += xb;
rh2 += xb < rh1 ? xb : rh1;
j++;
} while (--l > 0);
if (en0 > tmpATH)
ath_over++;
if (sfb == Encoder_1.SBPSY_s) {
var x = tmpATH * gfc.nsPsy.shortfact[sfb];
if (rh2 < x) {
rh2 = x;
}
}
if (enable_athaa_fix != 0)
xmin = rh2;
else
xmin = tmpATH;
if (!gfp.ATHonly && !gfp.ATHshort) {
var e = ratio.en.s[sfb][b];
if (e > 0) {
var x;
x = en0 * ratio.thm.s[sfb][b] * masking_lower / e;
if (enable_athaa_fix != 0)
x *= gfc.nsPsy.shortfact[sfb];
if (xmin < x)
xmin = x;
}
}
if (enable_athaa_fix != 0)
pxmin[pxminPos++] = xmin;
else
pxmin[pxminPos++] = xmin * gfc.nsPsy.shortfact[sfb];
}
if (gfp.useTemporal) {
if (pxmin[pxminPos - 3] > pxmin[pxminPos - 3 + 1])
pxmin[pxminPos - 3 + 1] += (pxmin[pxminPos - 3] - pxmin[pxminPos - 3 + 1]) * gfc.decay;
if (pxmin[pxminPos - 3 + 1] > pxmin[pxminPos - 3 + 2])
pxmin[pxminPos - 3 + 2] += (pxmin[pxminPos - 3 + 1] - pxmin[pxminPos - 3 + 2]) * gfc.decay;
}
}
return ath_over;
};
function StartLine(j) {
this.s = j;
}
this.calc_noise_core = function(cod_info, startline, l, step) {
var noise = 0;
var j = startline.s;
var ix = cod_info.l3_enc;
if (j > cod_info.count1) {
while (l-- != 0) {
var temp;
temp = cod_info.xr[j];
j++;
noise += temp * temp;
temp = cod_info.xr[j];
j++;
noise += temp * temp;
}
} else if (j > cod_info.big_values) {
var ix01 = new_float$19(2);
ix01[0] = 0;
ix01[1] = step;
while (l-- != 0) {
var temp;
temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]];
j++;
noise += temp * temp;
temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]];
j++;
noise += temp * temp;
}
} else {
while (l-- != 0) {
var temp;
temp = Math.abs(cod_info.xr[j]) - pow43[ix[j]] * step;
j++;
noise += temp * temp;
temp = Math.abs(cod_info.xr[j]) - pow43[ix[j]] * step;
j++;
noise += temp * temp;
}
}
startline.s = j;
return noise;
};
this.calc_noise = function(cod_info, l3_xmin, distort, res, prev_noise) {
var distortPos = 0;
var l3_xminPos = 0;
var sfb, l, over = 0;
var over_noise_db = 0;
var tot_noise_db = 0;
var max_noise = -20;
var j = 0;
var scalefac = cod_info.scalefac;
var scalefacPos = 0;
res.over_SSD = 0;
for (sfb = 0; sfb < cod_info.psymax; sfb++) {
var s = cod_info.global_gain - (scalefac[scalefacPos++] + (cod_info.preflag != 0 ? pretab[sfb] : 0) << cod_info.scalefac_scale + 1) - cod_info.subblock_gain[cod_info.window[sfb]] * 8;
var noise = 0;
if (prev_noise != null && prev_noise.step[sfb] == s) {
noise = prev_noise.noise[sfb];
j += cod_info.width[sfb];
distort[distortPos++] = noise / l3_xmin[l3_xminPos++];
noise = prev_noise.noise_log[sfb];
} else {
var step = POW20(s);
l = cod_info.width[sfb] >> 1;
if (j + cod_info.width[sfb] > cod_info.max_nonzero_coeff) {
var usefullsize;
usefullsize = cod_info.max_nonzero_coeff - j + 1;
if (usefullsize > 0)
l = usefullsize >> 1;
else
l = 0;
}
var sl = new StartLine(j);
noise = this.calc_noise_core(cod_info, sl, l, step);
j = sl.s;
if (prev_noise != null) {
prev_noise.step[sfb] = s;
prev_noise.noise[sfb] = noise;
}
noise = distort[distortPos++] = noise / l3_xmin[l3_xminPos++];
noise = Util$19.FAST_LOG10(Math.max(noise, 1e-20));
if (prev_noise != null) {
prev_noise.noise_log[sfb] = noise;
}
}
if (prev_noise != null) {
prev_noise.global_gain = cod_info.global_gain;
}
tot_noise_db += noise;
if (noise > 0) {
var tmp;
tmp = Math.max(0 | noise * 10 + 0.5, 1);
res.over_SSD += tmp * tmp;
over++;
over_noise_db += noise;
}
max_noise = Math.max(max_noise, noise);
}
res.over_count = over;
res.tot_noise = tot_noise_db;
res.over_noise = over_noise_db;
res.max_noise = max_noise;
return over;
};
this.set_pinfo = function(gfp, cod_info, ratio, gr, ch) {
var gfc = gfp.internal_flags;
var sfb, sfb2;
var l;
var en0, en1;
var ifqstep = cod_info.scalefac_scale == 0 ? 0.5 : 1;
var scalefac = cod_info.scalefac;
var l3_xmin = new_float$19(L3Side.SFBMAX);
var xfsf = new_float$19(L3Side.SFBMAX);
var noise = new CalcNoiseResult();
calc_xmin(gfp, ratio, cod_info, l3_xmin);
calc_noise(cod_info, l3_xmin, xfsf, noise, null);
var j = 0;
sfb2 = cod_info.sfb_lmax;
if (cod_info.block_type != Encoder_1.SHORT_TYPE && 0 == cod_info.mixed_block_flag)
sfb2 = 22;
for (sfb = 0; sfb < sfb2; sfb++) {
var start = gfc.scalefac_band.l[sfb];
var end = gfc.scalefac_band.l[sfb + 1];
var bw = end - start;
for (en0 = 0; j < end; j++)
en0 += cod_info.xr[j] * cod_info.xr[j];
en0 /= bw;
en1 = 1e15;
gfc.pinfo.en[gr][ch][sfb] = en1 * en0;
gfc.pinfo.xfsf[gr][ch][sfb] = en1 * l3_xmin[sfb] * xfsf[sfb] / bw;
if (ratio.en.l[sfb] > 0 && !gfp.ATHonly)
en0 = en0 / ratio.en.l[sfb];
else
en0 = 0;
gfc.pinfo.thr[gr][ch][sfb] = en1 * Math.max(en0 * ratio.thm.l[sfb], gfc.ATH.l[sfb]);
gfc.pinfo.LAMEsfb[gr][ch][sfb] = 0;
if (cod_info.preflag != 0 && sfb >= 11)
gfc.pinfo.LAMEsfb[gr][ch][sfb] = -ifqstep * pretab[sfb];
if (sfb < Encoder_1.SBPSY_l) {
assert$19(scalefac[sfb] >= 0);
gfc.pinfo.LAMEsfb[gr][ch][sfb] -= ifqstep * scalefac[sfb];
}
}
if (cod_info.block_type == Encoder_1.SHORT_TYPE) {
sfb2 = sfb;
for (sfb = cod_info.sfb_smin; sfb < Encoder_1.SBMAX_s; sfb++) {
var start = gfc.scalefac_band.s[sfb];
var end = gfc.scalefac_band.s[sfb + 1];
var bw = end - start;
for (var i = 0; i < 3; i++) {
for (en0 = 0, l = start; l < end; l++) {
en0 += cod_info.xr[j] * cod_info.xr[j];
j++;
}
en0 = Math.max(en0 / bw, 1e-20);
en1 = 1e15;
gfc.pinfo.en_s[gr][ch][3 * sfb + i] = en1 * en0;
gfc.pinfo.xfsf_s[gr][ch][3 * sfb + i] = en1 * l3_xmin[sfb2] * xfsf[sfb2] / bw;
if (ratio.en.s[sfb][i] > 0)
en0 = en0 / ratio.en.s[sfb][i];
else
en0 = 0;
if (gfp.ATHonly || gfp.ATHshort)
en0 = 0;
gfc.pinfo.thr_s[gr][ch][3 * sfb + i] = en1 * Math.max(
en0 * ratio.thm.s[sfb][i],
gfc.ATH.s[sfb]
);
gfc.pinfo.LAMEsfb_s[gr][ch][3 * sfb + i] = -2 * cod_info.subblock_gain[i];
if (sfb < Encoder_1.SBPSY_s) {
gfc.pinfo.LAMEsfb_s[gr][ch][3 * sfb + i] -= ifqstep * scalefac[sfb2];
}
sfb2++;
}
}
}
gfc.pinfo.LAMEqss[gr][ch] = cod_info.global_gain;
gfc.pinfo.LAMEmainbits[gr][ch] = cod_info.part2_3_length + cod_info.part2_length;
gfc.pinfo.LAMEsfbits[gr][ch] = cod_info.part2_length;
gfc.pinfo.over[gr][ch] = noise.over_count;
gfc.pinfo.max_noise[gr][ch] = noise.max_noise * 10;
gfc.pinfo.over_noise[gr][ch] = noise.over_noise * 10;
gfc.pinfo.tot_noise[gr][ch] = noise.tot_noise * 10;
gfc.pinfo.over_SSD[gr][ch] = noise.over_SSD;
};
}
var QuantizePVT_1 = QuantizePVT$1;
var System$18 = common.System;
var Arrays$18 = common.Arrays;
var new_int$18 = common.new_int;
var assert$18 = common.assert;
function Takehiro$1() {
var qupvt = null;
this.qupvt = null;
this.setModules = function(_qupvt) {
this.qupvt = _qupvt;
qupvt = _qupvt;
};
function Bits(b) {
this.bits = 0 | b;
}
var subdv_table = [
[0, 0],
/* 0 bands */
[0, 0],
/* 1 bands */
[0, 0],
/* 2 bands */
[0, 0],
/* 3 bands */
[0, 0],
/* 4 bands */
[0, 1],
/* 5 bands */
[1, 1],
/* 6 bands */
[1, 1],
/* 7 bands */
[1, 2],
/* 8 bands */
[2, 2],
/* 9 bands */
[2, 3],
/* 10 bands */
[2, 3],
/* 11 bands */
[3, 4],
/* 12 bands */
[3, 4],
/* 13 bands */
[3, 4],
/* 14 bands */
[4, 5],
/* 15 bands */
[4, 5],
/* 16 bands */
[4, 6],
/* 17 bands */
[5, 6],
/* 18 bands */
[5, 6],
/* 19 bands */
[5, 7],
/* 20 bands */
[6, 7],
/* 21 bands */
[6, 7]
/* 22 bands */
];
function quantize_lines_xrpow_01(l, istep, xr, xrPos, ix, ixPos) {
var compareval0 = (1 - 0.4054) / istep;
assert$18(l > 0);
l = l >> 1;
while (l-- != 0) {
ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
}
}
function quantize_lines_xrpow(l, istep, xr, xrPos, ix, ixPos) {
assert$18(l > 0);
l = l >> 1;
var remaining = l % 2;
l = l >> 1;
while (l-- != 0) {
var x0, x1, x2, x3;
var rx0, rx1, rx2, rx3;
x0 = xr[xrPos++] * istep;
x1 = xr[xrPos++] * istep;
rx0 = 0 | x0;
x2 = xr[xrPos++] * istep;
rx1 = 0 | x1;
x3 = xr[xrPos++] * istep;
rx2 = 0 | x2;
x0 += qupvt.adj43[rx0];
rx3 = 0 | x3;
x1 += qupvt.adj43[rx1];
ix[ixPos++] = 0 | x0;
x2 += qupvt.adj43[rx2];
ix[ixPos++] = 0 | x1;
x3 += qupvt.adj43[rx3];
ix[ixPos++] = 0 | x2;
ix[ixPos++] = 0 | x3;
}
if (remaining != 0) {
var x0, x1;
var rx0, rx1;
x0 = xr[xrPos++] * istep;
x1 = xr[xrPos++] * istep;
rx0 = 0 | x0;
rx1 = 0 | x1;
x0 += qupvt.adj43[rx0];
x1 += qupvt.adj43[rx1];
ix[ixPos++] = 0 | x0;
ix[ixPos++] = 0 | x1;
}
}
function quantize_xrpow(xp, pi, istep, codInfo, prevNoise) {
var sfb;
var sfbmax;
var j = 0;
var prev_data_use;
var accumulate = 0;
var accumulate01 = 0;
var xpPos = 0;
var iData = pi;
var iDataPos = 0;
var acc_iData = iData;
var acc_iDataPos = 0;
var acc_xp = xp;
var acc_xpPos = 0;
prev_data_use = prevNoise != null && codInfo.global_gain == prevNoise.global_gain;
if (codInfo.block_type == Encoder_1.SHORT_TYPE)
sfbmax = 38;
else
sfbmax = 21;
for (sfb = 0; sfb <= sfbmax; sfb++) {
var step = -1;
if (prev_data_use || codInfo.block_type == Encoder_1.NORM_TYPE) {
step = codInfo.global_gain - (codInfo.scalefac[sfb] + (codInfo.preflag != 0 ? qupvt.pretab[sfb] : 0) << codInfo.scalefac_scale + 1) - codInfo.subblock_gain[codInfo.window[sfb]] * 8;
}
assert$18(codInfo.width[sfb] >= 0);
if (prev_data_use && prevNoise.step[sfb] == step) {
if (accumulate != 0) {
quantize_lines_xrpow(
accumulate,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate = 0;
}
if (accumulate01 != 0) {
quantize_lines_xrpow_01(
accumulate01,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate01 = 0;
}
} else {
var l = codInfo.width[sfb];
if (j + codInfo.width[sfb] > codInfo.max_nonzero_coeff) {
var usefullsize;
usefullsize = codInfo.max_nonzero_coeff - j + 1;
Arrays$18.fill(pi, codInfo.max_nonzero_coeff, 576, 0);
l = usefullsize;
if (l < 0) {
l = 0;
}
sfb = sfbmax + 1;
}
if (0 == accumulate && 0 == accumulate01) {
acc_iData = iData;
acc_iDataPos = iDataPos;
acc_xp = xp;
acc_xpPos = xpPos;
}
if (prevNoise != null && prevNoise.sfb_count1 > 0 && sfb >= prevNoise.sfb_count1 && prevNoise.step[sfb] > 0 && step >= prevNoise.step[sfb]) {
if (accumulate != 0) {
quantize_lines_xrpow(
accumulate,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate = 0;
acc_iData = iData;
acc_iDataPos = iDataPos;
acc_xp = xp;
acc_xpPos = xpPos;
}
accumulate01 += l;
} else {
if (accumulate01 != 0) {
quantize_lines_xrpow_01(
accumulate01,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate01 = 0;
acc_iData = iData;
acc_iDataPos = iDataPos;
acc_xp = xp;
acc_xpPos = xpPos;
}
accumulate += l;
}
if (l <= 0) {
if (accumulate01 != 0) {
quantize_lines_xrpow_01(
accumulate01,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate01 = 0;
}
if (accumulate != 0) {
quantize_lines_xrpow(
accumulate,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate = 0;
}
break;
}
}
if (sfb <= sfbmax) {
iDataPos += codInfo.width[sfb];
xpPos += codInfo.width[sfb];
j += codInfo.width[sfb];
}
}
if (accumulate != 0) {
quantize_lines_xrpow(
accumulate,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate = 0;
}
if (accumulate01 != 0) {
quantize_lines_xrpow_01(
accumulate01,
istep,
acc_xp,
acc_xpPos,
acc_iData,
acc_iDataPos
);
accumulate01 = 0;
}
}
function ix_max(ix, ixPos, endPos) {
var max1 = 0, max2 = 0;
do {
var x1 = ix[ixPos++];
var x2 = ix[ixPos++];
if (max1 < x1)
max1 = x1;
if (max2 < x2)
max2 = x2;
} while (ixPos < endPos);
if (max1 < max2)
max1 = max2;
return max1;
}
function count_bit_ESC(ix, ixPos, end, t1, t2, s) {
var linbits = Tables_1.ht[t1].xlen * 65536 + Tables_1.ht[t2].xlen;
var sum = 0, sum2;
do {
var x = ix[ixPos++];
var y = ix[ixPos++];
if (x != 0) {
if (x > 14) {
x = 15;
sum += linbits;
}
x *= 16;
}
if (y != 0) {
if (y > 14) {
y = 15;
sum += linbits;
}
x += y;
}
sum += Tables_1.largetbl[x];
} while (ixPos < end);
sum2 = sum & 65535;
sum >>= 16;
if (sum > sum2) {
sum = sum2;
t1 = t2;
}
s.bits += sum;
return t1;
}
function count_bit_noESC(ix, ixPos, end, s) {
var sum1 = 0;
var hlen1 = Tables_1.ht[1].hlen;
do {
var x = ix[ixPos + 0] * 2 + ix[ixPos + 1];
ixPos += 2;
sum1 += hlen1[x];
} while (ixPos < end);
s.bits += sum1;
return 1;
}
function count_bit_noESC_from2(ix, ixPos, end, t1, s) {
var sum = 0, sum2;
var xlen = Tables_1.ht[t1].xlen;
var hlen;
if (t1 == 2)
hlen = Tables_1.table23;
else
hlen = Tables_1.table56;
do {
var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];
ixPos += 2;
sum += hlen[x];
} while (ixPos < end);
sum2 = sum & 65535;
sum >>= 16;
if (sum > sum2) {
sum = sum2;
t1++;
}
s.bits += sum;
return t1;
}
function count_bit_noESC_from3(ix, ixPos, end, t1, s) {
var sum1 = 0;
var sum2 = 0;
var sum3 = 0;
var xlen = Tables_1.ht[t1].xlen;
var hlen1 = Tables_1.ht[t1].hlen;
var hlen2 = Tables_1.ht[t1 + 1].hlen;
var hlen3 = Tables_1.ht[t1 + 2].hlen;
do {
var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];
ixPos += 2;
sum1 += hlen1[x];
sum2 += hlen2[x];
sum3 += hlen3[x];
} while (ixPos < end);
var t = t1;
if (sum1 > sum2) {
sum1 = sum2;
t++;
}
if (sum1 > sum3) {
sum1 = sum3;
t = t1 + 2;
}
s.bits += sum1;
return t;
}
var huf_tbl_noESC = [
1,
2,
5,
7,
7,
10,
10,
13,
13,
13,
13,
13,
13,
13,
13
];
function choose_table(ix, ixPos, endPos, s) {
var max = ix_max(ix, ixPos, endPos);
switch (max) {
case 0:
return max;
case 1:
return count_bit_noESC(ix, ixPos, endPos, s);
case 2:
case 3:
return count_bit_noESC_from2(
ix,
ixPos,
endPos,
huf_tbl_noESC[max - 1],
s
);
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
return count_bit_noESC_from3(
ix,
ixPos,
endPos,
huf_tbl_noESC[max - 1],
s
);
default:
if (max > QuantizePVT_1.IXMAX_VAL) {
s.bits = QuantizePVT_1.LARGE_BITS;
return -1;
}
max -= 15;
var choice2;
for (choice2 = 24; choice2 < 32; choice2++) {
if (Tables_1.ht[choice2].linmax >= max) {
break;
}
}
var choice;
for (choice = choice2 - 8; choice < 24; choice++) {
if (Tables_1.ht[choice].linmax >= max) {
break;
}
}
return count_bit_ESC(ix, ixPos, endPos, choice, choice2, s);
}
}
this.noquant_count_bits = function(gfc, gi, prev_noise) {
var ix = gi.l3_enc;
var i = Math.min(576, gi.max_nonzero_coeff + 2 >> 1 << 1);
if (prev_noise != null)
prev_noise.sfb_count1 = 0;
for (; i > 1; i -= 2)
if ((ix[i - 1] | ix[i - 2]) != 0)
break;
gi.count1 = i;
var a1 = 0;
var a2 = 0;
for (; i > 3; i -= 4) {
var p;
if (((ix[i - 1] | ix[i - 2] | ix[i - 3] | ix[i - 4]) & 2147483647) > 1) {
break;
}
p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
a1 += Tables_1.t32l[p];
a2 += Tables_1.t33l[p];
}
var bits = a1;
gi.count1table_select = 0;
if (a1 > a2) {
bits = a2;
gi.count1table_select = 1;
}
gi.count1bits = bits;
gi.big_values = i;
if (i == 0)
return bits;
if (gi.block_type == Encoder_1.SHORT_TYPE) {
a1 = 3 * gfc.scalefac_band.s[3];
if (a1 > gi.big_values)
a1 = gi.big_values;
a2 = gi.big_values;
} else if (gi.block_type == Encoder_1.NORM_TYPE) {
assert$18(i <= 576);
a1 = gi.region0_count = gfc.bv_scf[i - 2];
a2 = gi.region1_count = gfc.bv_scf[i - 1];
assert$18(a1 + a2 + 2 < Encoder_1.SBPSY_l);
a2 = gfc.scalefac_band.l[a1 + a2 + 2];
a1 = gfc.scalefac_band.l[a1 + 1];
if (a2 < i) {
var bi = new Bits(bits);
gi.table_select[2] = choose_table(ix, a2, i, bi);
bits = bi.bits;
}
} else {
gi.region0_count = 7;
gi.region1_count = Encoder_1.SBMAX_l - 1 - 7 - 1;
a1 = gfc.scalefac_band.l[7 + 1];
a2 = i;
if (a1 > a2) {
a1 = a2;
}
}
a1 = Math.min(a1, i);
a2 = Math.min(a2, i);
assert$18(a1 >= 0);
assert$18(a2 >= 0);
if (0 < a1) {
var bi = new Bits(bits);
gi.table_select[0] = choose_table(ix, 0, a1, bi);
bits = bi.bits;
}
if (a1 < a2) {
var bi = new Bits(bits);
gi.table_select[1] = choose_table(ix, a1, a2, bi);
bits = bi.bits;
}
if (gfc.use_best_huffman == 2) {
gi.part2_3_length = bits;
best_huffman_divide(gfc, gi);
bits = gi.part2_3_length;
}
if (prev_noise != null) {
if (gi.block_type == Encoder_1.NORM_TYPE) {
var sfb = 0;
while (gfc.scalefac_band.l[sfb] < gi.big_values) {
sfb++;
}
prev_noise.sfb_count1 = sfb;
}
}
return bits;
};
this.count_bits = function(gfc, xr, gi, prev_noise) {
var ix = gi.l3_enc;
var w = QuantizePVT_1.IXMAX_VAL / qupvt.IPOW20(gi.global_gain);
if (gi.xrpow_max > w)
return QuantizePVT_1.LARGE_BITS;
quantize_xrpow(xr, ix, qupvt.IPOW20(gi.global_gain), gi, prev_noise);
if ((gfc.substep_shaping & 2) != 0) {
var j = 0;
var gain = gi.global_gain + gi.scalefac_scale;
var roundfac = 0.634521682242439 / qupvt.IPOW20(gain);
for (var sfb = 0; sfb < gi.sfbmax; sfb++) {
var width = gi.width[sfb];
assert$18(width >= 0);
if (0 == gfc.pseudohalf[sfb]) {
j += width;
} else {
var k;
for (k = j, j += width; k < j; ++k) {
ix[k] = xr[k] >= roundfac ? ix[k] : 0;
}
}
}
}
return this.noquant_count_bits(gfc, gi, prev_noise);
};
function recalc_divide_init(gfc, cod_info, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {
var bigv = cod_info.big_values;
for (var r0 = 0; r0 <= 7 + 15; r0++) {
r01_bits[r0] = QuantizePVT_1.LARGE_BITS;
}
for (var r0 = 0; r0 < 16; r0++) {
var a1 = gfc.scalefac_band.l[r0 + 1];
if (a1 >= bigv)
break;
var r0bits = 0;
var bi = new Bits(r0bits);
var r0t = choose_table(ix, 0, a1, bi);
r0bits = bi.bits;
for (var r1 = 0; r1 < 8; r1++) {
var a2 = gfc.scalefac_band.l[r0 + r1 + 2];
if (a2 >= bigv)
break;
var bits = r0bits;
bi = new Bits(bits);
var r1t = choose_table(ix, a1, a2, bi);
bits = bi.bits;
if (r01_bits[r0 + r1] > bits) {
r01_bits[r0 + r1] = bits;
r01_div[r0 + r1] = r0;
r0_tbl[r0 + r1] = r0t;
r1_tbl[r0 + r1] = r1t;
}
}
}
}
function recalc_divide_sub(gfc, cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {
var bigv = cod_info2.big_values;
for (var r2 = 2; r2 < Encoder_1.SBMAX_l + 1; r2++) {
var a2 = gfc.scalefac_band.l[r2];
if (a2 >= bigv)
break;
var bits = r01_bits[r2 - 2] + cod_info2.count1bits;
if (gi.part2_3_length <= bits)
break;
var bi = new Bits(bits);
var r2t = choose_table(ix, a2, bigv, bi);
bits = bi.bits;
if (gi.part2_3_length <= bits)
continue;
gi.assign(cod_info2);
gi.part2_3_length = bits;
gi.region0_count = r01_div[r2 - 2];
gi.region1_count = r2 - 2 - r01_div[r2 - 2];
gi.table_select[0] = r0_tbl[r2 - 2];
gi.table_select[1] = r1_tbl[r2 - 2];
gi.table_select[2] = r2t;
}
}
this.best_huffman_divide = function(gfc, gi) {
var cod_info2 = new GrInfo_1();
var ix = gi.l3_enc;
var r01_bits = new_int$18(7 + 15 + 1);
var r01_div = new_int$18(7 + 15 + 1);
var r0_tbl = new_int$18(7 + 15 + 1);
var r1_tbl = new_int$18(7 + 15 + 1);
if (gi.block_type == Encoder_1.SHORT_TYPE && gfc.mode_gr == 1)
return;
cod_info2.assign(gi);
if (gi.block_type == Encoder_1.NORM_TYPE) {
recalc_divide_init(gfc, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl);
recalc_divide_sub(
gfc,
cod_info2,
gi,
ix,
r01_bits,
r01_div,
r0_tbl,
r1_tbl
);
}
var i = cod_info2.big_values;
if (i == 0 || (ix[i - 2] | ix[i - 1]) > 1)
return;
i = gi.count1 + 2;
if (i > 576)
return;
cod_info2.assign(gi);
cod_info2.count1 = i;
var a1 = 0;
var a2 = 0;
assert$18(i <= 576);
for (; i > cod_info2.big_values; i -= 4) {
var p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
a1 += Tables_1.t32l[p];
a2 += Tables_1.t33l[p];
}
cod_info2.big_values = i;
cod_info2.count1table_select = 0;
if (a1 > a2) {
a1 = a2;
cod_info2.count1table_select = 1;
}
cod_info2.count1bits = a1;
if (cod_info2.block_type == Encoder_1.NORM_TYPE)
recalc_divide_sub(
gfc,
cod_info2,
gi,
ix,
r01_bits,
r01_div,
r0_tbl,
r1_tbl
);
else {
cod_info2.part2_3_length = a1;
a1 = gfc.scalefac_band.l[7 + 1];
if (a1 > i) {
a1 = i;
}
if (a1 > 0) {
var bi = new Bits(cod_info2.part2_3_length);
cod_info2.table_select[0] = choose_table(ix, 0, a1, bi);
cod_info2.part2_3_length = bi.bits;
}
if (i > a1) {
var bi = new Bits(cod_info2.part2_3_length);
cod_info2.table_select[1] = choose_table(ix, a1, i, bi);
cod_info2.part2_3_length = bi.bits;
}
if (gi.part2_3_length > cod_info2.part2_3_length)
gi.assign(cod_info2);
}
};
var slen1_n = [1, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16];
var slen2_n = [1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8];
var slen1_tab = [0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4];
var slen2_tab = [0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3];
Takehiro$1.slen1_tab = slen1_tab;
Takehiro$1.slen2_tab = slen2_tab;
function scfsi_calc(ch, l3_side) {
var sfb;
var gi = l3_side.tt[1][ch];
var g0 = l3_side.tt[0][ch];
for (var i = 0; i < Tables_1.scfsi_band.length - 1; i++) {
for (sfb = Tables_1.scfsi_band[i]; sfb < Tables_1.scfsi_band[i + 1]; sfb++) {
if (g0.scalefac[sfb] != gi.scalefac[sfb] && gi.scalefac[sfb] >= 0)
break;
}
if (sfb == Tables_1.scfsi_band[i + 1]) {
for (sfb = Tables_1.scfsi_band[i]; sfb < Tables_1.scfsi_band[i + 1]; sfb++) {
gi.scalefac[sfb] = -1;
}
l3_side.scfsi[ch][i] = 1;
}
}
var s1 = 0;
var c1 = 0;
for (sfb = 0; sfb < 11; sfb++) {
if (gi.scalefac[sfb] == -1)
continue;
c1++;
if (s1 < gi.scalefac[sfb])
s1 = gi.scalefac[sfb];
}
var s2 = 0;
var c2 = 0;
for (; sfb < Encoder_1.SBPSY_l; sfb++) {
if (gi.scalefac[sfb] == -1)
continue;
c2++;
if (s2 < gi.scalefac[sfb])
s2 = gi.scalefac[sfb];
}
for (var i = 0; i < 16; i++) {
if (s1 < slen1_n[i] && s2 < slen2_n[i]) {
var c = slen1_tab[i] * c1 + slen2_tab[i] * c2;
if (gi.part2_length > c) {
gi.part2_length = c;
gi.scalefac_compress = i;
}
}
}
}
this.best_scalefac_store = function(gfc, gr, ch, l3_side) {
var gi = l3_side.tt[gr][ch];
var sfb, i, j, l;
var recalc = 0;
j = 0;
for (sfb = 0; sfb < gi.sfbmax; sfb++) {
var width = gi.width[sfb];
assert$18(width >= 0);
j += width;
for (l = -width; l < 0; l++) {
if (gi.l3_enc[l + j] != 0)
break;
}
if (l == 0)
gi.scalefac[sfb] = recalc = -2;
}
if (0 == gi.scalefac_scale && 0 == gi.preflag) {
var s = 0;
for (sfb = 0; sfb < gi.sfbmax; sfb++)
if (gi.scalefac[sfb] > 0)
s |= gi.scalefac[sfb];
if (0 == (s & 1) && s != 0) {
for (sfb = 0; sfb < gi.sfbmax; sfb++)
if (gi.scalefac[sfb] > 0)
gi.scalefac[sfb] >>= 1;
gi.scalefac_scale = recalc = 1;
}
}
if (0 == gi.preflag && gi.block_type != Encoder_1.SHORT_TYPE && gfc.mode_gr == 2) {
for (sfb = 11; sfb < Encoder_1.SBPSY_l; sfb++)
if (gi.scalefac[sfb] < qupvt.pretab[sfb] && gi.scalefac[sfb] != -2)
break;
if (sfb == Encoder_1.SBPSY_l) {
for (sfb = 11; sfb < Encoder_1.SBPSY_l; sfb++)
if (gi.scalefac[sfb] > 0)
gi.scalefac[sfb] -= qupvt.pretab[sfb];
gi.preflag = recalc = 1;
}
}
for (i = 0; i < 4; i++)
l3_side.scfsi[ch][i] = 0;
if (gfc.mode_gr == 2 && gr == 1 && l3_side.tt[0][ch].block_type != Encoder_1.SHORT_TYPE && l3_side.tt[1][ch].block_type != Encoder_1.SHORT_TYPE) {
scfsi_calc(ch, l3_side);
recalc = 0;
}
for (sfb = 0; sfb < gi.sfbmax; sfb++) {
if (gi.scalefac[sfb] == -2) {
gi.scalefac[sfb] = 0;
}
}
if (recalc != 0) {
if (gfc.mode_gr == 2) {
this.scale_bitcount(gi);
} else {
this.scale_bitcount_lsf(gfc, gi);
}
}
};
function all_scalefactors_not_negative(scalefac, n) {
for (var i = 0; i < n; ++i) {
if (scalefac[i] < 0)
return false;
}
return true;
}
var scale_short = [
0,
18,
36,
54,
54,
36,
54,
72,
54,
72,
90,
72,
90,
108,
108,
126
];
var scale_mixed = [
0,
18,
36,
54,
51,
35,
53,
71,
52,
70,
88,
69,
87,
105,
104,
122
];
var scale_long = [
0,
10,
20,
30,
33,
21,
31,
41,
32,
42,
52,
43,
53,
63,
64,
74
];
this.scale_bitcount = function(cod_info) {
var k, sfb, max_slen1 = 0, max_slen2 = 0;
var tab;
var scalefac = cod_info.scalefac;
assert$18(all_scalefactors_not_negative(scalefac, cod_info.sfbmax));
if (cod_info.block_type == Encoder_1.SHORT_TYPE) {
tab = scale_short;
if (cod_info.mixed_block_flag != 0)
tab = scale_mixed;
} else {
tab = scale_long;
if (0 == cod_info.preflag) {
for (sfb = 11; sfb < Encoder_1.SBPSY_l; sfb++)
if (scalefac[sfb] < qupvt.pretab[sfb])
break;
if (sfb == Encoder_1.SBPSY_l) {
cod_info.preflag = 1;
for (sfb = 11; sfb < Encoder_1.SBPSY_l; sfb++)
scalefac[sfb] -= qupvt.pretab[sfb];
}
}
}
for (sfb = 0; sfb < cod_info.sfbdivide; sfb++)
if (max_slen1 < scalefac[sfb])
max_slen1 = scalefac[sfb];
for (; sfb < cod_info.sfbmax; sfb++)
if (max_slen2 < scalefac[sfb])
max_slen2 = scalefac[sfb];
cod_info.part2_length = QuantizePVT_1.LARGE_BITS;
for (k = 0; k < 16; k++) {
if (max_slen1 < slen1_n[k] && max_slen2 < slen2_n[k] && cod_info.part2_length > tab[k]) {
cod_info.part2_length = tab[k];
cod_info.scalefac_compress = k;
}
}
return cod_info.part2_length == QuantizePVT_1.LARGE_BITS;
};
var max_range_sfac_tab = [
[15, 15, 7, 7],
[15, 15, 7, 0],
[7, 3, 0, 0],
[15, 31, 31, 0],
[7, 7, 7, 0],
[3, 3, 0, 0]
];
this.scale_bitcount_lsf = function(gfc, cod_info) {
var table_number, row_in_table, partition, nr_sfb, window2;
var over;
var i, sfb;
var max_sfac = new_int$18(4);
var scalefac = cod_info.scalefac;
if (cod_info.preflag != 0)
table_number = 2;
else
table_number = 0;
for (i = 0; i < 4; i++)
max_sfac[i] = 0;
if (cod_info.block_type == Encoder_1.SHORT_TYPE) {
row_in_table = 1;
var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
for (sfb = 0, partition = 0; partition < 4; partition++) {
nr_sfb = partition_table[partition] / 3;
for (i = 0; i < nr_sfb; i++, sfb++)
for (window2 = 0; window2 < 3; window2++)
if (scalefac[sfb * 3 + window2] > max_sfac[partition])
max_sfac[partition] = scalefac[sfb * 3 + window2];
}
} else {
row_in_table = 0;
var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
for (sfb = 0, partition = 0; partition < 4; partition++) {
nr_sfb = partition_table[partition];
for (i = 0; i < nr_sfb; i++, sfb++)
if (scalefac[sfb] > max_sfac[partition])
max_sfac[partition] = scalefac[sfb];
}
}
for (over = false, partition = 0; partition < 4; partition++) {
if (max_sfac[partition] > max_range_sfac_tab[table_number][partition])
over = true;
}
if (!over) {
var slen1, slen2, slen3, slen4;
cod_info.sfb_partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];
for (partition = 0; partition < 4; partition++)
cod_info.slen[partition] = log2tab[max_sfac[partition]];
slen1 = cod_info.slen[0];
slen2 = cod_info.slen[1];
slen3 = cod_info.slen[2];
slen4 = cod_info.slen[3];
switch (table_number) {
case 0:
cod_info.scalefac_compress = (slen1 * 5 + slen2 << 4) + (slen3 << 2) + slen4;
break;
case 1:
cod_info.scalefac_compress = 400 + (slen1 * 5 + slen2 << 2) + slen3;
break;
case 2:
cod_info.scalefac_compress = 500 + slen1 * 3 + slen2;
break;
default:
System$18.err.printf("intensity stereo not implemented yet\n");
break;
}
}
if (!over) {
assert$18(cod_info.sfb_partition_table != null);
cod_info.part2_length = 0;
for (partition = 0; partition < 4; partition++)
cod_info.part2_length += cod_info.slen[partition] * cod_info.sfb_partition_table[partition];
}
return over;
};
var log2tab = [
0,
1,
2,
2,
3,
3,
3,
3,
4,
4,
4,
4,
4,
4,
4,
4
];
this.huffman_init = function(gfc) {
for (var i = 2; i <= 576; i += 2) {
var scfb_anz = 0, bv_index;
while (gfc.scalefac_band.l[++scfb_anz] < i)
;
bv_index = subdv_table[scfb_anz][0];
while (gfc.scalefac_band.l[bv_index + 1] > i)
bv_index--;
if (bv_index < 0) {
bv_index = subdv_table[scfb_anz][0];
}
gfc.bv_scf[i - 2] = bv_index;
bv_index = subdv_table[scfb_anz][1];
while (gfc.scalefac_band.l[bv_index + gfc.bv_scf[i - 2] + 2] > i)
bv_index--;
if (bv_index < 0) {
bv_index = subdv_table[scfb_anz][1];
}
gfc.bv_scf[i - 1] = bv_index;
}
};
}
var Takehiro_1 = Takehiro$1;
var System$17 = common.System;
var Arrays$17 = common.Arrays;
var new_byte$17 = common.new_byte;
var new_float_n$17 = common.new_float_n;
var new_int$17 = common.new_int;
var assert$17 = common.assert;
BitStream$1.EQ = function(a, b) {
return Math.abs(a) > Math.abs(b) ? Math.abs(a - b) <= Math.abs(a) * 1e-6 : Math.abs(a - b) <= Math.abs(b) * 1e-6;
};
BitStream$1.NEQ = function(a, b) {
return !BitStream$1.EQ(a, b);
};
function BitStream$1() {
var self = this;
var CRC16_POLYNOMIAL = 32773;
var MAX_LENGTH = 32;
var ga = null;
var mpg = null;
var ver = null;
var vbr = null;
this.setModules = function(_ga, _mpg, _ver, _vbr) {
ga = _ga;
mpg = _mpg;
ver = _ver;
vbr = _vbr;
};
var buf = null;
var totbit = 0;
var bufByteIdx = 0;
var bufBitIdx = 0;
this.getframebits = function(gfp) {
var gfc = gfp.internal_flags;
var bit_rate;
if (gfc.bitrate_index != 0)
bit_rate = Tables_1.bitrate_table[gfp.version][gfc.bitrate_index];
else
bit_rate = gfp.brate;
assert$17(8 <= bit_rate && bit_rate <= 640);
var bytes = 0 | (gfp.version + 1) * 72e3 * bit_rate / gfp.out_samplerate + gfc.padding;
return 8 * bytes;
};
function putheader_bits(gfc) {
System$17.arraycopy(gfc.header[gfc.w_ptr].buf, 0, buf, bufByteIdx, gfc.sideinfo_len);
bufByteIdx += gfc.sideinfo_len;
totbit += gfc.sideinfo_len * 8;
gfc.w_ptr = gfc.w_ptr + 1 & LameInternalFlags_1.MAX_HEADER_BUF - 1;
}
function putbits2(gfc, val, j) {
assert$17(j < MAX_LENGTH - 2);
while (j > 0) {
var k;
if (bufBitIdx == 0) {
bufBitIdx = 8;
bufByteIdx++;
assert$17(bufByteIdx < Lame.LAME_MAXMP3BUFFER);
assert$17(gfc.header[gfc.w_ptr].write_timing >= totbit);
if (gfc.header[gfc.w_ptr].write_timing == totbit) {
putheader_bits(gfc);
}
buf[bufByteIdx] = 0;
}
k = Math.min(j, bufBitIdx);
j -= k;
bufBitIdx -= k;
assert$17(j < MAX_LENGTH);
assert$17(bufBitIdx < MAX_LENGTH);
buf[bufByteIdx] |= val >> j << bufBitIdx;
totbit += k;
}
}
function putbits_noheaders(gfc, val, j) {
assert$17(j < MAX_LENGTH - 2);
while (j > 0) {
var k;
if (bufBitIdx == 0) {
bufBitIdx = 8;
bufByteIdx++;
assert$17(bufByteIdx < Lame.LAME_MAXMP3BUFFER);
buf[bufByteIdx] = 0;
}
k = Math.min(j, bufBitIdx);
j -= k;
bufBitIdx -= k;
assert$17(j < MAX_LENGTH);
assert$17(bufBitIdx < MAX_LENGTH);
buf[bufByteIdx] |= val >> j << bufBitIdx;
totbit += k;
}
}
function drain_into_ancillary(gfp, remainingBits) {
var gfc = gfp.internal_flags;
var i;
assert$17(remainingBits >= 0);
if (remainingBits >= 8) {
putbits2(gfc, 76, 8);
remainingBits -= 8;
}
if (remainingBits >= 8) {
putbits2(gfc, 65, 8);
remainingBits -= 8;
}
if (remainingBits >= 8) {
putbits2(gfc, 77, 8);
remainingBits -= 8;
}
if (remainingBits >= 8) {
putbits2(gfc, 69, 8);
remainingBits -= 8;
}
if (remainingBits >= 32) {
var version = ver.getLameShortVersion();
if (remainingBits >= 32)
for (i = 0; i < version.length && remainingBits >= 8; ++i) {
remainingBits -= 8;
putbits2(gfc, version.charAt(i), 8);
}
}
for (; remainingBits >= 1; remainingBits -= 1) {
putbits2(gfc, gfc.ancillary_flag, 1);
gfc.ancillary_flag ^= !gfp.disable_reservoir ? 1 : 0;
}
assert$17(remainingBits == 0);
}
function writeheader(gfc, val, j) {
var ptr = gfc.header[gfc.h_ptr].ptr;
while (j > 0) {
var k = Math.min(j, 8 - (ptr & 7));
j -= k;
assert$17(j < MAX_LENGTH);
gfc.header[gfc.h_ptr].buf[ptr >> 3] |= val >> j << 8 - (ptr & 7) - k;
ptr += k;
}
gfc.header[gfc.h_ptr].ptr = ptr;
}
function CRC_update(value, crc) {
value <<= 8;
for (var i = 0; i < 8; i++) {
value <<= 1;
crc <<= 1;
if (((crc ^ value) & 65536) != 0)
crc ^= CRC16_POLYNOMIAL;
}
return crc;
}
this.CRC_writeheader = function(gfc, header) {
var crc = 65535;
crc = CRC_update(header[2] & 255, crc);
crc = CRC_update(header[3] & 255, crc);
for (var i = 6; i < gfc.sideinfo_len; i++) {
crc = CRC_update(header[i] & 255, crc);
}
header[4] = byte(crc >> 8);
header[5] = byte(crc & 255);
};
function encodeSideInfo2(gfp, bitsPerFrame) {
var gfc = gfp.internal_flags;
var l3_side;
var gr, ch;
l3_side = gfc.l3_side;
gfc.header[gfc.h_ptr].ptr = 0;
Arrays$17.fill(gfc.header[gfc.h_ptr].buf, 0, gfc.sideinfo_len, 0);
if (gfp.out_samplerate < 16e3)
writeheader(gfc, 4094, 12);
else
writeheader(gfc, 4095, 12);
writeheader(gfc, gfp.version, 1);
writeheader(gfc, 4 - 3, 2);
writeheader(gfc, !gfp.error_protection ? 1 : 0, 1);
writeheader(gfc, gfc.bitrate_index, 4);
writeheader(gfc, gfc.samplerate_index, 2);
writeheader(gfc, gfc.padding, 1);
writeheader(gfc, gfp.extension, 1);
writeheader(gfc, gfp.mode.ordinal(), 2);
writeheader(gfc, gfc.mode_ext, 2);
writeheader(gfc, gfp.copyright, 1);
writeheader(gfc, gfp.original, 1);
writeheader(gfc, gfp.emphasis, 2);
if (gfp.error_protection) {
writeheader(gfc, 0, 16);
}
if (gfp.version == 1) {
assert$17(l3_side.main_data_begin >= 0);
writeheader(gfc, l3_side.main_data_begin, 9);
if (gfc.channels_out == 2)
writeheader(gfc, l3_side.private_bits, 3);
else
writeheader(gfc, l3_side.private_bits, 5);
for (ch = 0; ch < gfc.channels_out; ch++) {
var band;
for (band = 0; band < 4; band++) {
writeheader(gfc, l3_side.scfsi[ch][band], 1);
}
}
for (gr = 0; gr < 2; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
var gi = l3_side.tt[gr][ch];
writeheader(gfc, gi.part2_3_length + gi.part2_length, 12);
writeheader(gfc, gi.big_values / 2, 9);
writeheader(gfc, gi.global_gain, 8);
writeheader(gfc, gi.scalefac_compress, 4);
if (gi.block_type != Encoder_1.NORM_TYPE) {
writeheader(gfc, 1, 1);
writeheader(gfc, gi.block_type, 2);
writeheader(gfc, gi.mixed_block_flag, 1);
if (gi.table_select[0] == 14)
gi.table_select[0] = 16;
writeheader(gfc, gi.table_select[0], 5);
if (gi.table_select[1] == 14)
gi.table_select[1] = 16;
writeheader(gfc, gi.table_select[1], 5);
writeheader(gfc, gi.subblock_gain[0], 3);
writeheader(gfc, gi.subblock_gain[1], 3);
writeheader(gfc, gi.subblock_gain[2], 3);
} else {
writeheader(gfc, 0, 1);
if (gi.table_select[0] == 14)
gi.table_select[0] = 16;
writeheader(gfc, gi.table_select[0], 5);
if (gi.table_select[1] == 14)
gi.table_select[1] = 16;
writeheader(gfc, gi.table_select[1], 5);
if (gi.table_select[2] == 14)
gi.table_select[2] = 16;
writeheader(gfc, gi.table_select[2], 5);
assert$17(0 <= gi.region0_count && gi.region0_count < 16);
assert$17(0 <= gi.region1_count && gi.region1_count < 8);
writeheader(gfc, gi.region0_count, 4);
writeheader(gfc, gi.region1_count, 3);
}
writeheader(gfc, gi.preflag, 1);
writeheader(gfc, gi.scalefac_scale, 1);
writeheader(gfc, gi.count1table_select, 1);
}
}
} else {
assert$17(l3_side.main_data_begin >= 0);
writeheader(gfc, l3_side.main_data_begin, 8);
writeheader(gfc, l3_side.private_bits, gfc.channels_out);
gr = 0;
for (ch = 0; ch < gfc.channels_out; ch++) {
var gi = l3_side.tt[gr][ch];
writeheader(gfc, gi.part2_3_length + gi.part2_length, 12);
writeheader(gfc, gi.big_values / 2, 9);
writeheader(gfc, gi.global_gain, 8);
writeheader(gfc, gi.scalefac_compress, 9);
if (gi.block_type != Encoder_1.NORM_TYPE) {
writeheader(gfc, 1, 1);
writeheader(gfc, gi.block_type, 2);
writeheader(gfc, gi.mixed_block_flag, 1);
if (gi.table_select[0] == 14)
gi.table_select[0] = 16;
writeheader(gfc, gi.table_select[0], 5);
if (gi.table_select[1] == 14)
gi.table_select[1] = 16;
writeheader(gfc, gi.table_select[1], 5);
writeheader(gfc, gi.subblock_gain[0], 3);
writeheader(gfc, gi.subblock_gain[1], 3);
writeheader(gfc, gi.subblock_gain[2], 3);
} else {
writeheader(gfc, 0, 1);
if (gi.table_select[0] == 14)
gi.table_select[0] = 16;
writeheader(gfc, gi.table_select[0], 5);
if (gi.table_select[1] == 14)
gi.table_select[1] = 16;
writeheader(gfc, gi.table_select[1], 5);
if (gi.table_select[2] == 14)
gi.table_select[2] = 16;
writeheader(gfc, gi.table_select[2], 5);
assert$17(0 <= gi.region0_count && gi.region0_count < 16);
assert$17(0 <= gi.region1_count && gi.region1_count < 8);
writeheader(gfc, gi.region0_count, 4);
writeheader(gfc, gi.region1_count, 3);
}
writeheader(gfc, gi.scalefac_scale, 1);
writeheader(gfc, gi.count1table_select, 1);
}
}
if (gfp.error_protection) {
CRC_writeheader(gfc, gfc.header[gfc.h_ptr].buf);
}
{
var old = gfc.h_ptr;
assert$17(gfc.header[old].ptr == gfc.sideinfo_len * 8);
gfc.h_ptr = old + 1 & LameInternalFlags_1.MAX_HEADER_BUF - 1;
gfc.header[gfc.h_ptr].write_timing = gfc.header[old].write_timing + bitsPerFrame;
if (gfc.h_ptr == gfc.w_ptr) {
System$17.err.println("Error: MAX_HEADER_BUF too small in bitstream.c \n");
}
}
}
function huffman_coder_count1(gfc, gi) {
var h = Tables_1.ht[gi.count1table_select + 32];
var i, bits = 0;
var ix = gi.big_values;
var xr = gi.big_values;
assert$17(gi.count1table_select < 2);
for (i = (gi.count1 - gi.big_values) / 4; i > 0; --i) {
var huffbits = 0;
var p = 0, v;
v = gi.l3_enc[ix + 0];
if (v != 0) {
p += 8;
if (gi.xr[xr + 0] < 0)
huffbits++;
assert$17(v <= 1);
}
v = gi.l3_enc[ix + 1];
if (v != 0) {
p += 4;
huffbits *= 2;
if (gi.xr[xr + 1] < 0)
huffbits++;
assert$17(v <= 1);
}
v = gi.l3_enc[ix + 2];
if (v != 0) {
p += 2;
huffbits *= 2;
if (gi.xr[xr + 2] < 0)
huffbits++;
assert$17(v <= 1);
}
v = gi.l3_enc[ix + 3];
if (v != 0) {
p++;
huffbits *= 2;
if (gi.xr[xr + 3] < 0)
huffbits++;
assert$17(v <= 1);
}
ix += 4;
xr += 4;
putbits2(gfc, huffbits + h.table[p], h.hlen[p]);
bits += h.hlen[p];
}
return bits;
}
function Huffmancode(gfc, tableindex, start, end, gi) {
var h = Tables_1.ht[tableindex];
var bits = 0;
assert$17(tableindex < 32);
if (0 == tableindex)
return bits;
for (var i = start; i < end; i += 2) {
var cbits = 0;
var xbits = 0;
var linbits = h.xlen;
var xlen = h.xlen;
var ext = 0;
var x1 = gi.l3_enc[i];
var x2 = gi.l3_enc[i + 1];
if (x1 != 0) {
if (gi.xr[i] < 0)
ext++;
cbits--;
}
if (tableindex > 15) {
if (x1 > 14) {
var linbits_x1 = x1 - 15;
assert$17(linbits_x1 <= h.linmax);
ext |= linbits_x1 << 1;
xbits = linbits;
x1 = 15;
}
if (x2 > 14) {
var linbits_x2 = x2 - 15;
assert$17(linbits_x2 <= h.linmax);
ext <<= linbits;
ext |= linbits_x2;
xbits += linbits;
x2 = 15;
}
xlen = 16;
}
if (x2 != 0) {
ext <<= 1;
if (gi.xr[i + 1] < 0)
ext++;
cbits--;
}
assert$17((x1 | x2) < 16);
x1 = x1 * xlen + x2;
xbits -= cbits;
cbits += h.hlen[x1];
assert$17(cbits <= MAX_LENGTH);
assert$17(xbits <= MAX_LENGTH);
putbits2(gfc, h.table[x1], cbits);
putbits2(gfc, ext, xbits);
bits += cbits + xbits;
}
return bits;
}
function ShortHuffmancodebits(gfc, gi) {
var region1Start = 3 * gfc.scalefac_band.s[3];
if (region1Start > gi.big_values)
region1Start = gi.big_values;
var bits = Huffmancode(gfc, gi.table_select[0], 0, region1Start, gi);
bits += Huffmancode(
gfc,
gi.table_select[1],
region1Start,
gi.big_values,
gi
);
return bits;
}
function LongHuffmancodebits(gfc, gi) {
var bigvalues, bits;
var region1Start, region2Start;
bigvalues = gi.big_values;
assert$17(0 <= bigvalues && bigvalues <= 576);
var i = gi.region0_count + 1;
assert$17(0 <= i);
assert$17(i < gfc.scalefac_band.l.length);
region1Start = gfc.scalefac_band.l[i];
i += gi.region1_count + 1;
assert$17(0 <= i);
assert$17(i < gfc.scalefac_band.l.length);
region2Start = gfc.scalefac_band.l[i];
if (region1Start > bigvalues)
region1Start = bigvalues;
if (region2Start > bigvalues)
region2Start = bigvalues;
bits = Huffmancode(gfc, gi.table_select[0], 0, region1Start, gi);
bits += Huffmancode(
gfc,
gi.table_select[1],
region1Start,
region2Start,
gi
);
bits += Huffmancode(
gfc,
gi.table_select[2],
region2Start,
bigvalues,
gi
);
return bits;
}
function writeMainData(gfp) {
var gr, ch, sfb, data_bits, tot_bits = 0;
var gfc = gfp.internal_flags;
var l3_side = gfc.l3_side;
if (gfp.version == 1) {
for (gr = 0; gr < 2; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
var gi = l3_side.tt[gr][ch];
var slen1 = Takehiro_1.slen1_tab[gi.scalefac_compress];
var slen2 = Takehiro_1.slen2_tab[gi.scalefac_compress];
data_bits = 0;
for (sfb = 0; sfb < gi.sfbdivide; sfb++) {
if (gi.scalefac[sfb] == -1)
continue;
putbits2(gfc, gi.scalefac[sfb], slen1);
data_bits += slen1;
}
for (; sfb < gi.sfbmax; sfb++) {
if (gi.scalefac[sfb] == -1)
continue;
putbits2(gfc, gi.scalefac[sfb], slen2);
data_bits += slen2;
}
assert$17(data_bits == gi.part2_length);
if (gi.block_type == Encoder_1.SHORT_TYPE) {
data_bits += ShortHuffmancodebits(gfc, gi);
} else {
data_bits += LongHuffmancodebits(gfc, gi);
}
data_bits += huffman_coder_count1(gfc, gi);
assert$17(data_bits == gi.part2_3_length + gi.part2_length);
tot_bits += data_bits;
}
}
} else {
gr = 0;
for (ch = 0; ch < gfc.channels_out; ch++) {
var gi = l3_side.tt[gr][ch];
var i, sfb_partition, scale_bits = 0;
assert$17(gi.sfb_partition_table != null);
data_bits = 0;
sfb = 0;
sfb_partition = 0;
if (gi.block_type == Encoder_1.SHORT_TYPE) {
for (; sfb_partition < 4; sfb_partition++) {
var sfbs = gi.sfb_partition_table[sfb_partition] / 3;
var slen = gi.slen[sfb_partition];
for (i = 0; i < sfbs; i++, sfb++) {
putbits2(
gfc,
Math.max(gi.scalefac[sfb * 3 + 0], 0),
slen
);
putbits2(
gfc,
Math.max(gi.scalefac[sfb * 3 + 1], 0),
slen
);
putbits2(
gfc,
Math.max(gi.scalefac[sfb * 3 + 2], 0),
slen
);
scale_bits += 3 * slen;
}
}
data_bits += ShortHuffmancodebits(gfc, gi);
} else {
for (; sfb_partition < 4; sfb_partition++) {
var sfbs = gi.sfb_partition_table[sfb_partition];
var slen = gi.slen[sfb_partition];
for (i = 0; i < sfbs; i++, sfb++) {
putbits2(gfc, Math.max(gi.scalefac[sfb], 0), slen);
scale_bits += slen;
}
}
data_bits += LongHuffmancodebits(gfc, gi);
}
data_bits += huffman_coder_count1(gfc, gi);
assert$17(data_bits == gi.part2_3_length);
assert$17(scale_bits == gi.part2_length);
tot_bits += scale_bits + data_bits;
}
}
return tot_bits;
}
function TotalBytes() {
this.total = 0;
}
function compute_flushbits(gfp, total_bytes_output) {
var gfc = gfp.internal_flags;
var flushbits, remaining_headers;
var bitsPerFrame;
var last_ptr, first_ptr;
first_ptr = gfc.w_ptr;
last_ptr = gfc.h_ptr - 1;
if (last_ptr == -1)
last_ptr = LameInternalFlags_1.MAX_HEADER_BUF - 1;
flushbits = gfc.header[last_ptr].write_timing - totbit;
total_bytes_output.total = flushbits;
if (flushbits >= 0) {
remaining_headers = 1 + last_ptr - first_ptr;
if (last_ptr < first_ptr)
remaining_headers = 1 + last_ptr - first_ptr + LameInternalFlags_1.MAX_HEADER_BUF;
flushbits -= remaining_headers * 8 * gfc.sideinfo_len;
}
bitsPerFrame = self.getframebits(gfp);
flushbits += bitsPerFrame;
total_bytes_output.total += bitsPerFrame;
if (total_bytes_output.total % 8 != 0)
total_bytes_output.total = 1 + total_bytes_output.total / 8;
else
total_bytes_output.total = total_bytes_output.total / 8;
total_bytes_output.total += bufByteIdx + 1;
if (flushbits < 0) {
System$17.err.println("strange error flushing buffer ... \n");
}
return flushbits;
}
this.flush_bitstream = function(gfp) {
var gfc = gfp.internal_flags;
var l3_side;
var flushbits;
var last_ptr = gfc.h_ptr - 1;
if (last_ptr == -1)
last_ptr = LameInternalFlags_1.MAX_HEADER_BUF - 1;
l3_side = gfc.l3_side;
if ((flushbits = compute_flushbits(gfp, new TotalBytes())) < 0)
return;
drain_into_ancillary(gfp, flushbits);
assert$17(gfc.header[last_ptr].write_timing + this.getframebits(gfp) == totbit);
gfc.ResvSize = 0;
l3_side.main_data_begin = 0;
if (gfc.findReplayGain) {
var RadioGain = ga.GetTitleGain(gfc.rgdata);
assert$17(NEQ(RadioGain, GainAnalysis.GAIN_NOT_ENOUGH_SAMPLES));
gfc.RadioGain = Math.floor(RadioGain * 10 + 0.5) | 0;
}
if (gfc.findPeakSample) {
gfc.noclipGainChange = Math.ceil(Math.log10(gfc.PeakSample / 32767) * 20 * 10) | 0;
if (gfc.noclipGainChange > 0) {
if (EQ(gfp.scale, 1) || EQ(gfp.scale, 0))
gfc.noclipScale = Math.floor(32767 / gfc.PeakSample * 100) / 100;
else {
gfc.noclipScale = -1;
}
} else
gfc.noclipScale = -1;
}
};
this.add_dummy_byte = function(gfp, val, n) {
var gfc = gfp.internal_flags;
var i;
while (n-- > 0) {
putbits_noheaders(gfc, val, 8);
for (i = 0; i < LameInternalFlags_1.MAX_HEADER_BUF; ++i)
gfc.header[i].write_timing += 8;
}
};
this.format_bitstream = function(gfp) {
var gfc = gfp.internal_flags;
var l3_side;
l3_side = gfc.l3_side;
var bitsPerFrame = this.getframebits(gfp);
drain_into_ancillary(gfp, l3_side.resvDrain_pre);
encodeSideInfo2(gfp, bitsPerFrame);
var bits = 8 * gfc.sideinfo_len;
bits += writeMainData(gfp);
drain_into_ancillary(gfp, l3_side.resvDrain_post);
bits += l3_side.resvDrain_post;
l3_side.main_data_begin += (bitsPerFrame - bits) / 8;
if (compute_flushbits(gfp, new TotalBytes()) != gfc.ResvSize) {
System$17.err.println("Internal buffer inconsistency. flushbits <> ResvSize");
}
if (l3_side.main_data_begin * 8 != gfc.ResvSize) {
System$17.err.printf(
"bit reservoir error: \nl3_side.main_data_begin: %d \nResvoir size: %d \nresv drain (post) %d \nresv drain (pre) %d \nheader and sideinfo: %d \ndata bits: %d \ntotal bits: %d (remainder: %d) \nbitsperframe: %d \n",
8 * l3_side.main_data_begin,
gfc.ResvSize,
l3_side.resvDrain_post,
l3_side.resvDrain_pre,
8 * gfc.sideinfo_len,
bits - l3_side.resvDrain_post - 8 * gfc.sideinfo_len,
bits,
bits % 8,
bitsPerFrame
);
System$17.err.println("This is a fatal error. It has several possible causes:");
System$17.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations");
System$17.err.println(" 9%% Your system is overclocked");
System$17.err.println(" 1%% bug in LAME encoding library");
gfc.ResvSize = l3_side.main_data_begin * 8;
}
assert$17(totbit % 8 == 0);
if (totbit > 1e9) {
var i;
for (i = 0; i < LameInternalFlags_1.MAX_HEADER_BUF; ++i)
gfc.header[i].write_timing -= totbit;
totbit = 0;
}
return 0;
};
this.copy_buffer = function(gfc, buffer, bufferPos, size, mp3data) {
var minimum = bufByteIdx + 1;
if (minimum <= 0)
return 0;
if (size != 0 && minimum > size) {
return -1;
}
System$17.arraycopy(buf, 0, buffer, bufferPos, minimum);
bufByteIdx = -1;
bufBitIdx = 0;
if (mp3data != 0) {
var crc = new_int$17(1);
crc[0] = gfc.nMusicCRC;
vbr.updateMusicCRC(crc, buffer, bufferPos, minimum);
gfc.nMusicCRC = crc[0];
if (minimum > 0) {
gfc.VBR_seek_table.nBytesWritten += minimum;
}
if (gfc.decode_on_the_fly) {
var pcm_buf = new_float_n$17([2, 1152]);
var mp3_in = minimum;
var samples_out = -1;
var i;
while (samples_out != 0) {
samples_out = mpg.hip_decode1_unclipped(
gfc.hip,
buffer,
bufferPos,
mp3_in,
pcm_buf[0],
pcm_buf[1]
);
mp3_in = 0;
if (samples_out == -1) {
samples_out = 0;
}
if (samples_out > 0) {
assert$17(samples_out <= 1152);
if (gfc.findPeakSample) {
for (i = 0; i < samples_out; i++) {
if (pcm_buf[0][i] > gfc.PeakSample)
gfc.PeakSample = pcm_buf[0][i];
else if (-pcm_buf[0][i] > gfc.PeakSample)
gfc.PeakSample = -pcm_buf[0][i];
}
if (gfc.channels_out > 1)
for (i = 0; i < samples_out; i++) {
if (pcm_buf[1][i] > gfc.PeakSample)
gfc.PeakSample = pcm_buf[1][i];
else if (-pcm_buf[1][i] > gfc.PeakSample)
gfc.PeakSample = -pcm_buf[1][i];
}
}
if (gfc.findReplayGain) {
if (ga.AnalyzeSamples(
gfc.rgdata,
pcm_buf[0],
0,
pcm_buf[1],
0,
samples_out,
gfc.channels_out
) == GainAnalysis.GAIN_ANALYSIS_ERROR)
return -6;
}
}
}
}
}
return minimum;
};
this.init_bit_stream_w = function(gfc) {
buf = new_byte$17(Lame.LAME_MAXMP3BUFFER);
gfc.h_ptr = gfc.w_ptr = 0;
gfc.header[gfc.h_ptr].write_timing = 0;
bufByteIdx = -1;
bufBitIdx = 0;
totbit = 0;
};
}
var BitStream_1 = BitStream$1;
var System$2 = common.System;
var VbrMode$2 = common.VbrMode;
var ShortBlock$2 = common.ShortBlock;
var new_float$2 = common.new_float;
var new_int_n$2 = common.new_int_n;
var new_short_n$1 = common.new_short_n;
var assert$2 = common.assert;
function Lame$1() {
var self = this;
var LAME_MAXALBUMART = 128 * 1024;
Lame$1.V9 = 410;
Lame$1.V8 = 420;
Lame$1.V7 = 430;
Lame$1.V6 = 440;
Lame$1.V5 = 450;
Lame$1.V4 = 460;
Lame$1.V3 = 470;
Lame$1.V2 = 480;
Lame$1.V1 = 490;
Lame$1.V0 = 500;
Lame$1.R3MIX = 1e3;
Lame$1.STANDARD = 1001;
Lame$1.EXTREME = 1002;
Lame$1.INSANE = 1003;
Lame$1.STANDARD_FAST = 1004;
Lame$1.EXTREME_FAST = 1005;
Lame$1.MEDIUM = 1006;
Lame$1.MEDIUM_FAST = 1007;
var LAME_MAXMP3BUFFER = 16384 + LAME_MAXALBUMART;
Lame$1.LAME_MAXMP3BUFFER = LAME_MAXMP3BUFFER;
var ga;
var bs;
var p;
var qupvt;
var qu;
var psy = new PsyModel_1();
var vbr;
var ver;
var id3;
var mpglib;
this.enc = new Encoder_1();
this.setModules = function(_ga, _bs, _p, _qupvt, _qu, _vbr, _ver, _id3, _mpglib) {
ga = _ga;
bs = _bs;
p = _p;
qupvt = _qupvt;
qu = _qu;
vbr = _vbr;
ver = _ver;
id3 = _id3;
mpglib = _mpglib;
this.enc.setModules(bs, psy, qupvt, vbr);
};
function PSY() {
this.mask_adjust = 0;
this.mask_adjust_short = 0;
this.bo_l_weight = new_float$2(Encoder_1.SBMAX_l);
this.bo_s_weight = new_float$2(Encoder_1.SBMAX_s);
}
function LowPassHighPass() {
this.lowerlimit = 0;
}
function BandPass(bitrate, lPass) {
this.lowpass = lPass;
}
var LAME_ID = 4294479419;
function lame_init_old(gfp) {
var gfc;
gfp.class_id = LAME_ID;
gfc = gfp.internal_flags = new LameInternalFlags_1();
gfp.mode = MPEGMode.NOT_SET;
gfp.original = 1;
gfp.in_samplerate = 44100;
gfp.num_channels = 2;
gfp.num_samples = -1;
gfp.bWriteVbrTag = true;
gfp.quality = -1;
gfp.short_blocks = null;
gfc.subblock_gain = -1;
gfp.lowpassfreq = 0;
gfp.highpassfreq = 0;
gfp.lowpasswidth = -1;
gfp.highpasswidth = -1;
gfp.VBR = VbrMode$2.vbr_off;
gfp.VBR_q = 4;
gfp.ATHcurve = -1;
gfp.VBR_mean_bitrate_kbps = 128;
gfp.VBR_min_bitrate_kbps = 0;
gfp.VBR_max_bitrate_kbps = 0;
gfp.VBR_hard_min = 0;
gfc.VBR_min_bitrate = 1;
gfc.VBR_max_bitrate = 13;
gfp.quant_comp = -1;
gfp.quant_comp_short = -1;
gfp.msfix = -1;
gfc.resample_ratio = 1;
gfc.OldValue[0] = 180;
gfc.OldValue[1] = 180;
gfc.CurrentStep[0] = 4;
gfc.CurrentStep[1] = 4;
gfc.masking_lower = 1;
gfc.nsPsy.attackthre = -1;
gfc.nsPsy.attackthre_s = -1;
gfp.scale = -1;
gfp.athaa_type = -1;
gfp.ATHtype = -1;
gfp.athaa_loudapprox = -1;
gfp.athaa_sensitivity = 0;
gfp.useTemporal = null;
gfp.interChRatio = -1;
gfc.mf_samples_to_encode = Encoder_1.ENCDELAY + Encoder_1.POSTDELAY;
gfp.encoder_padding = 0;
gfc.mf_size = Encoder_1.ENCDELAY - Encoder_1.MDCTDELAY;
gfp.findReplayGain = false;
gfp.decode_on_the_fly = false;
gfc.decode_on_the_fly = false;
gfc.findReplayGain = false;
gfc.findPeakSample = false;
gfc.RadioGain = 0;
gfc.AudiophileGain = 0;
gfc.noclipGainChange = 0;
gfc.noclipScale = -1;
gfp.preset = 0;
gfp.write_id3tag_automatic = true;
return 0;
}
this.lame_init = function() {
var gfp = new LameGlobalFlags_1();
var ret = lame_init_old(gfp);
if (ret != 0) {
return null;
}
gfp.lame_allocated_gfp = 1;
return gfp;
};
function filter_coef(x) {
if (x > 1)
return 0;
if (x <= 0)
return 1;
return Math.cos(Math.PI / 2 * x);
}
this.nearestBitrateFullIndex = function(bitrate) {
var full_bitrate_table = [
8,
16,
24,
32,
40,
48,
56,
64,
80,
96,
112,
128,
160,
192,
224,
256,
320
];
var lower_range = 0, lower_range_kbps = 0, upper_range = 0, upper_range_kbps = 0;
upper_range_kbps = full_bitrate_table[16];
upper_range = 16;
lower_range_kbps = full_bitrate_table[16];
lower_range = 16;
for (var b = 0; b < 16; b++) {
if (Math.max(bitrate, full_bitrate_table[b + 1]) != bitrate) {
upper_range_kbps = full_bitrate_table[b + 1];
upper_range = b + 1;
lower_range_kbps = full_bitrate_table[b];
lower_range = b;
break;
}
}
if (upper_range_kbps - bitrate > bitrate - lower_range_kbps) {
return lower_range;
}
return upper_range;
};
function optimum_samplefreq(lowpassfreq, input_samplefreq) {
var suggested_samplefreq = 44100;
if (input_samplefreq >= 48e3)
suggested_samplefreq = 48e3;
else if (input_samplefreq >= 44100)
suggested_samplefreq = 44100;
else if (input_samplefreq >= 32e3)
suggested_samplefreq = 32e3;
else if (input_samplefreq >= 24e3)
suggested_samplefreq = 24e3;
else if (input_samplefreq >= 22050)
suggested_samplefreq = 22050;
else if (input_samplefreq >= 16e3)
suggested_samplefreq = 16e3;
else if (input_samplefreq >= 12e3)
suggested_samplefreq = 12e3;
else if (input_samplefreq >= 11025)
suggested_samplefreq = 11025;
else if (input_samplefreq >= 8e3)
suggested_samplefreq = 8e3;
if (lowpassfreq == -1)
return suggested_samplefreq;
if (lowpassfreq <= 15960)
suggested_samplefreq = 44100;
if (lowpassfreq <= 15250)
suggested_samplefreq = 32e3;
if (lowpassfreq <= 11220)
suggested_samplefreq = 24e3;
if (lowpassfreq <= 9970)
suggested_samplefreq = 22050;
if (lowpassfreq <= 7230)
suggested_samplefreq = 16e3;
if (lowpassfreq <= 5420)
suggested_samplefreq = 12e3;
if (lowpassfreq <= 4510)
suggested_samplefreq = 11025;
if (lowpassfreq <= 3970)
suggested_samplefreq = 8e3;
if (input_samplefreq < suggested_samplefreq) {
if (input_samplefreq > 44100) {
return 48e3;
}
if (input_samplefreq > 32e3) {
return 44100;
}
if (input_samplefreq > 24e3) {
return 32e3;
}
if (input_samplefreq > 22050) {
return 24e3;
}
if (input_samplefreq > 16e3) {
return 22050;
}
if (input_samplefreq > 12e3) {
return 16e3;
}
if (input_samplefreq > 11025) {
return 12e3;
}
if (input_samplefreq > 8e3) {
return 11025;
}
return 8e3;
}
return suggested_samplefreq;
}
function SmpFrqIndex(sample_freq, gpf) {
switch (sample_freq) {
case 44100:
gpf.version = 1;
return 0;
case 48e3:
gpf.version = 1;
return 1;
case 32e3:
gpf.version = 1;
return 2;
case 22050:
gpf.version = 0;
return 0;
case 24e3:
gpf.version = 0;
return 1;
case 16e3:
gpf.version = 0;
return 2;
case 11025:
gpf.version = 0;
return 0;
case 12e3:
gpf.version = 0;
return 1;
case 8e3:
gpf.version = 0;
return 2;
default:
gpf.version = 0;
return -1;
}
}
function FindNearestBitrate(bRate, version, samplerate) {
if (samplerate < 16e3)
version = 2;
var bitrate = Tables_1.bitrate_table[version][1];
for (var i = 2; i <= 14; i++) {
if (Tables_1.bitrate_table[version][i] > 0) {
if (Math.abs(Tables_1.bitrate_table[version][i] - bRate) < Math.abs(bitrate - bRate))
bitrate = Tables_1.bitrate_table[version][i];
}
}
return bitrate;
}
function BitrateIndex(bRate, version, samplerate) {
if (samplerate < 16e3)
version = 2;
for (var i = 0; i <= 14; i++) {
if (Tables_1.bitrate_table[version][i] > 0) {
if (Tables_1.bitrate_table[version][i] == bRate) {
return i;
}
}
}
return -1;
}
function optimum_bandwidth(lh, bitrate) {
var freq_map = [
new BandPass(8, 2e3),
new BandPass(16, 3700),
new BandPass(24, 3900),
new BandPass(32, 5500),
new BandPass(40, 7e3),
new BandPass(48, 7500),
new BandPass(56, 1e4),
new BandPass(64, 11e3),
new BandPass(80, 13500),
new BandPass(96, 15100),
new BandPass(112, 15600),
new BandPass(128, 17e3),
new BandPass(160, 17500),
new BandPass(192, 18600),
new BandPass(224, 19400),
new BandPass(256, 19700),
new BandPass(320, 20500)
];
var table_index = self.nearestBitrateFullIndex(bitrate);
lh.lowerlimit = freq_map[table_index].lowpass;
}
function lame_init_params_ppflt(gfp) {
var gfc = gfp.internal_flags;
var lowpass_band = 32;
var highpass_band = -1;
if (gfc.lowpass1 > 0) {
var minband = 999;
for (var band = 0; band <= 31; band++) {
var freq = band / 31;
if (freq >= gfc.lowpass2) {
lowpass_band = Math.min(lowpass_band, band);
}
if (gfc.lowpass1 < freq && freq < gfc.lowpass2) {
minband = Math.min(minband, band);
}
}
if (minband == 999) {
gfc.lowpass1 = (lowpass_band - 0.75) / 31;
} else {
gfc.lowpass1 = (minband - 0.75) / 31;
}
gfc.lowpass2 = lowpass_band / 31;
}
if (gfc.highpass2 > 0) {
if (gfc.highpass2 < 0.9 * (0.75 / 31)) {
gfc.highpass1 = 0;
gfc.highpass2 = 0;
System$2.err.println("Warning: highpass filter disabled. highpass frequency too small\n");
}
}
if (gfc.highpass2 > 0) {
var maxband = -1;
for (var band = 0; band <= 31; band++) {
var freq = band / 31;
if (freq <= gfc.highpass1) {
highpass_band = Math.max(highpass_band, band);
}
if (gfc.highpass1 < freq && freq < gfc.highpass2) {
maxband = Math.max(maxband, band);
}
}
gfc.highpass1 = highpass_band / 31;
if (maxband == -1) {
gfc.highpass2 = (highpass_band + 0.75) / 31;
} else {
gfc.highpass2 = (maxband + 0.75) / 31;
}
}
for (var band = 0; band < 32; band++) {
var fc1, fc2;
var freq = band / 31;
if (gfc.highpass2 > gfc.highpass1) {
fc1 = filter_coef((gfc.highpass2 - freq) / (gfc.highpass2 - gfc.highpass1 + 1e-20));
} else {
fc1 = 1;
}
if (gfc.lowpass2 > gfc.lowpass1) {
fc2 = filter_coef((freq - gfc.lowpass1) / (gfc.lowpass2 - gfc.lowpass1 + 1e-20));
} else {
fc2 = 1;
}
gfc.amp_filter[band] = fc1 * fc2;
}
}
function lame_init_qval(gfp) {
var gfc = gfp.internal_flags;
switch (gfp.quality) {
default:
case 9:
gfc.psymodel = 0;
gfc.noise_shaping = 0;
gfc.noise_shaping_amp = 0;
gfc.noise_shaping_stop = 0;
gfc.use_best_huffman = 0;
gfc.full_outer_loop = 0;
break;
case 8:
gfp.quality = 7;
case 7:
gfc.psymodel = 1;
gfc.noise_shaping = 0;
gfc.noise_shaping_amp = 0;
gfc.noise_shaping_stop = 0;
gfc.use_best_huffman = 0;
gfc.full_outer_loop = 0;
break;
case 6:
gfc.psymodel = 1;
if (gfc.noise_shaping == 0)
gfc.noise_shaping = 1;
gfc.noise_shaping_amp = 0;
gfc.noise_shaping_stop = 0;
if (gfc.subblock_gain == -1)
gfc.subblock_gain = 1;
gfc.use_best_huffman = 0;
gfc.full_outer_loop = 0;
break;
case 5:
gfc.psymodel = 1;
if (gfc.noise_shaping == 0)
gfc.noise_shaping = 1;
gfc.noise_shaping_amp = 0;
gfc.noise_shaping_stop = 0;
if (gfc.subblock_gain == -1)
gfc.subblock_gain = 1;
gfc.use_best_huffman = 0;
gfc.full_outer_loop = 0;
break;
case 4:
gfc.psymodel = 1;
if (gfc.noise_shaping == 0)
gfc.noise_shaping = 1;
gfc.noise_shaping_amp = 0;
gfc.noise_shaping_stop = 0;
if (gfc.subblock_gain == -1)
gfc.subblock_gain = 1;
gfc.use_best_huffman = 1;
gfc.full_outer_loop = 0;
break;
case 3:
gfc.psymodel = 1;
if (gfc.noise_shaping == 0)
gfc.noise_shaping = 1;
gfc.noise_shaping_amp = 1;
gfc.noise_shaping_stop = 1;
if (gfc.subblock_gain == -1)
gfc.subblock_gain = 1;
gfc.use_best_huffman = 1;
gfc.full_outer_loop = 0;
break;
case 2:
gfc.psymodel = 1;
if (gfc.noise_shaping == 0)
gfc.noise_shaping = 1;
if (gfc.substep_shaping == 0)
gfc.substep_shaping = 2;
gfc.noise_shaping_amp = 1;
gfc.noise_shaping_stop = 1;
if (gfc.subblock_gain == -1)
gfc.subblock_gain = 1;
gfc.use_best_huffman = 1;
gfc.full_outer_loop = 0;
break;
case 1:
gfc.psymodel = 1;
if (gfc.noise_shaping == 0)
gfc.noise_shaping = 1;
if (gfc.substep_shaping == 0)
gfc.substep_shaping = 2;
gfc.noise_shaping_amp = 2;
gfc.noise_shaping_stop = 1;
if (gfc.subblock_gain == -1)
gfc.subblock_gain = 1;
gfc.use_best_huffman = 1;
gfc.full_outer_loop = 0;
break;
case 0:
gfc.psymodel = 1;
if (gfc.noise_shaping == 0)
gfc.noise_shaping = 1;
if (gfc.substep_shaping == 0)
gfc.substep_shaping = 2;
gfc.noise_shaping_amp = 2;
gfc.noise_shaping_stop = 1;
if (gfc.subblock_gain == -1)
gfc.subblock_gain = 1;
gfc.use_best_huffman = 1;
gfc.full_outer_loop = 0;
break;
}
}
function lame_init_bitstream(gfp) {
var gfc = gfp.internal_flags;
gfp.frameNum = 0;
if (gfp.write_id3tag_automatic) {
id3.id3tag_write_v2(gfp);
}
gfc.bitrate_stereoMode_Hist = new_int_n$2([16, 4 + 1]);
gfc.bitrate_blockType_Hist = new_int_n$2([16, 4 + 1 + 1]);
gfc.PeakSample = 0;
if (gfp.bWriteVbrTag)
vbr.InitVbrTag(gfp);
}
this.lame_init_params = function(gfp) {
var gfc = gfp.internal_flags;
gfc.Class_ID = 0;
if (gfc.ATH == null)
gfc.ATH = new ATH_1();
if (gfc.PSY == null)
gfc.PSY = new PSY();
if (gfc.rgdata == null)
gfc.rgdata = new ReplayGain_1();
gfc.channels_in = gfp.num_channels;
if (gfc.channels_in == 1)
gfp.mode = MPEGMode.MONO;
gfc.channels_out = gfp.mode == MPEGMode.MONO ? 1 : 2;
gfc.mode_ext = Encoder_1.MPG_MD_MS_LR;
if (gfp.mode == MPEGMode.MONO)
gfp.force_ms = false;
if (gfp.VBR == VbrMode$2.vbr_off && gfp.VBR_mean_bitrate_kbps != 128 && gfp.brate == 0)
gfp.brate = gfp.VBR_mean_bitrate_kbps;
if (gfp.VBR == VbrMode$2.vbr_off || gfp.VBR == VbrMode$2.vbr_mtrh || gfp.VBR == VbrMode$2.vbr_mt) {
} else {
gfp.free_format = false;
}
if (gfp.VBR == VbrMode$2.vbr_off && gfp.brate == 0) {
if (BitStream_1.EQ(gfp.compression_ratio, 0))
gfp.compression_ratio = 11.025;
}
if (gfp.VBR == VbrMode$2.vbr_off && gfp.compression_ratio > 0) {
if (gfp.out_samplerate == 0)
gfp.out_samplerate = map2MP3Frequency(int(0.97 * gfp.in_samplerate));
gfp.brate = 0 | gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.compression_ratio);
gfc.samplerate_index = SmpFrqIndex(gfp.out_samplerate, gfp);
if (!gfp.free_format)
gfp.brate = FindNearestBitrate(
gfp.brate,
gfp.version,
gfp.out_samplerate
);
}
if (gfp.out_samplerate != 0) {
if (gfp.out_samplerate < 16e3) {
gfp.VBR_mean_bitrate_kbps = Math.max(
gfp.VBR_mean_bitrate_kbps,
8
);
gfp.VBR_mean_bitrate_kbps = Math.min(
gfp.VBR_mean_bitrate_kbps,
64
);
} else if (gfp.out_samplerate < 32e3) {
gfp.VBR_mean_bitrate_kbps = Math.max(
gfp.VBR_mean_bitrate_kbps,
8
);
gfp.VBR_mean_bitrate_kbps = Math.min(
gfp.VBR_mean_bitrate_kbps,
160
);
} else {
gfp.VBR_mean_bitrate_kbps = Math.max(
gfp.VBR_mean_bitrate_kbps,
32
);
gfp.VBR_mean_bitrate_kbps = Math.min(
gfp.VBR_mean_bitrate_kbps,
320
);
}
}
if (gfp.lowpassfreq == 0) {
var lowpass = 16e3;
switch (gfp.VBR) {
case VbrMode$2.vbr_off: {
var lh = new LowPassHighPass();
optimum_bandwidth(lh, gfp.brate);
lowpass = lh.lowerlimit;
break;
}
case VbrMode$2.vbr_abr: {
var lh = new LowPassHighPass();
optimum_bandwidth(lh, gfp.VBR_mean_bitrate_kbps);
lowpass = lh.lowerlimit;
break;
}
case VbrMode$2.vbr_rh: {
var x = [
19500,
19e3,
18600,
18e3,
17500,
16e3,
15600,
14900,
12500,
1e4,
3950
];
if (0 <= gfp.VBR_q && gfp.VBR_q <= 9) {
var a = x[gfp.VBR_q], b = x[gfp.VBR_q + 1], m = gfp.VBR_q_frac;
lowpass = linear_int(a, b, m);
} else {
lowpass = 19500;
}
break;
}
default: {
var x = [
19500,
19e3,
18500,
18e3,
17500,
16500,
15500,
14500,
12500,
9500,
3950
];
if (0 <= gfp.VBR_q && gfp.VBR_q <= 9) {
var a = x[gfp.VBR_q], b = x[gfp.VBR_q + 1], m = gfp.VBR_q_frac;
lowpass = linear_int(a, b, m);
} else {
lowpass = 19500;
}
}
}
if (gfp.mode == MPEGMode.MONO && (gfp.VBR == VbrMode$2.vbr_off || gfp.VBR == VbrMode$2.vbr_abr))
lowpass *= 1.5;
gfp.lowpassfreq = lowpass | 0;
}
if (gfp.out_samplerate == 0) {
if (2 * gfp.lowpassfreq > gfp.in_samplerate) {
gfp.lowpassfreq = gfp.in_samplerate / 2;
}
gfp.out_samplerate = optimum_samplefreq(
gfp.lowpassfreq | 0,
gfp.in_samplerate
);
}
gfp.lowpassfreq = Math.min(20500, gfp.lowpassfreq);
gfp.lowpassfreq = Math.min(gfp.out_samplerate / 2, gfp.lowpassfreq);
if (gfp.VBR == VbrMode$2.vbr_off) {
gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
}
if (gfp.VBR == VbrMode$2.vbr_abr) {
gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.VBR_mean_bitrate_kbps);
}
if (!gfp.bWriteVbrTag) {
gfp.findReplayGain = false;
gfp.decode_on_the_fly = false;
gfc.findPeakSample = false;
}
gfc.findReplayGain = gfp.findReplayGain;
gfc.decode_on_the_fly = gfp.decode_on_the_fly;
if (gfc.decode_on_the_fly)
gfc.findPeakSample = true;
if (gfc.findReplayGain) {
if (ga.InitGainAnalysis(gfc.rgdata, gfp.out_samplerate) == GainAnalysis.INIT_GAIN_ANALYSIS_ERROR) {
gfp.internal_flags = null;
return -6;
}
}
if (gfc.decode_on_the_fly && !gfp.decode_only) {
if (gfc.hip != null) {
mpglib.hip_decode_exit(gfc.hip);
}
gfc.hip = mpglib.hip_decode_init();
}
gfc.mode_gr = gfp.out_samplerate <= 24e3 ? 1 : 2;
gfp.framesize = 576 * gfc.mode_gr;
gfp.encoder_delay = Encoder_1.ENCDELAY;
gfc.resample_ratio = gfp.in_samplerate / gfp.out_samplerate;
switch (gfp.VBR) {
case VbrMode$2.vbr_mt:
case VbrMode$2.vbr_rh:
case VbrMode$2.vbr_mtrh:
{
var cmp = [
5.7,
6.5,
7.3,
8.2,
10,
11.9,
13,
14,
15,
16.5
];
gfp.compression_ratio = cmp[gfp.VBR_q];
}
break;
case VbrMode$2.vbr_abr:
gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.VBR_mean_bitrate_kbps);
break;
default:
gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
break;
}
if (gfp.mode == MPEGMode.NOT_SET) {
gfp.mode = MPEGMode.JOINT_STEREO;
}
if (gfp.highpassfreq > 0) {
gfc.highpass1 = 2 * gfp.highpassfreq;
if (gfp.highpasswidth >= 0)
gfc.highpass2 = 2 * (gfp.highpassfreq + gfp.highpasswidth);
else
gfc.highpass2 = (1 + 0) * 2 * gfp.highpassfreq;
gfc.highpass1 /= gfp.out_samplerate;
gfc.highpass2 /= gfp.out_samplerate;
} else {
gfc.highpass1 = 0;
gfc.highpass2 = 0;
}
if (gfp.lowpassfreq > 0) {
gfc.lowpass2 = 2 * gfp.lowpassfreq;
if (gfp.lowpasswidth >= 0) {
gfc.lowpass1 = 2 * (gfp.lowpassfreq - gfp.lowpasswidth);
if (gfc.lowpass1 < 0)
gfc.lowpass1 = 0;
} else {
gfc.lowpass1 = (1 - 0) * 2 * gfp.lowpassfreq;
}
gfc.lowpass1 /= gfp.out_samplerate;
gfc.lowpass2 /= gfp.out_samplerate;
} else {
gfc.lowpass1 = 0;
gfc.lowpass2 = 0;
}
lame_init_params_ppflt(gfp);
gfc.samplerate_index = SmpFrqIndex(gfp.out_samplerate, gfp);
if (gfc.samplerate_index < 0) {
gfp.internal_flags = null;
return -1;
}
if (gfp.VBR == VbrMode$2.vbr_off) {
if (gfp.free_format) {
gfc.bitrate_index = 0;
} else {
gfp.brate = FindNearestBitrate(
gfp.brate,
gfp.version,
gfp.out_samplerate
);
gfc.bitrate_index = BitrateIndex(
gfp.brate,
gfp.version,
gfp.out_samplerate
);
if (gfc.bitrate_index <= 0) {
gfp.internal_flags = null;
return -1;
}
}
} else {
gfc.bitrate_index = 1;
}
if (gfp.analysis)
gfp.bWriteVbrTag = false;
if (gfc.pinfo != null)
gfp.bWriteVbrTag = false;
bs.init_bit_stream_w(gfc);
var j = gfc.samplerate_index + 3 * gfp.version + 6 * (gfp.out_samplerate < 16e3 ? 1 : 0);
for (var i = 0; i < Encoder_1.SBMAX_l + 1; i++)
gfc.scalefac_band.l[i] = qupvt.sfBandIndex[j].l[i];
for (var i = 0; i < Encoder_1.PSFB21 + 1; i++) {
var size = (gfc.scalefac_band.l[22] - gfc.scalefac_band.l[21]) / Encoder_1.PSFB21;
var start = gfc.scalefac_band.l[21] + i * size;
gfc.scalefac_band.psfb21[i] = start;
}
gfc.scalefac_band.psfb21[Encoder_1.PSFB21] = 576;
for (var i = 0; i < Encoder_1.SBMAX_s + 1; i++)
gfc.scalefac_band.s[i] = qupvt.sfBandIndex[j].s[i];
for (var i = 0; i < Encoder_1.PSFB12 + 1; i++) {
var size = (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) / Encoder_1.PSFB12;
var start = gfc.scalefac_band.s[12] + i * size;
gfc.scalefac_band.psfb12[i] = start;
}
gfc.scalefac_band.psfb12[Encoder_1.PSFB12] = 192;
if (gfp.version == 1)
gfc.sideinfo_len = gfc.channels_out == 1 ? 4 + 17 : 4 + 32;
else
gfc.sideinfo_len = gfc.channels_out == 1 ? 4 + 9 : 4 + 17;
if (gfp.error_protection)
gfc.sideinfo_len += 2;
lame_init_bitstream(gfp);
gfc.Class_ID = LAME_ID;
{
var k;
for (k = 0; k < 19; k++)
gfc.nsPsy.pefirbuf[k] = 700 * gfc.mode_gr * gfc.channels_out;
if (gfp.ATHtype == -1)
gfp.ATHtype = 4;
}
assert$2(gfp.VBR_q <= 9);
assert$2(gfp.VBR_q >= 0);
switch (gfp.VBR) {
case VbrMode$2.vbr_mt:
gfp.VBR = VbrMode$2.vbr_mtrh;
case VbrMode$2.vbr_mtrh: {
if (gfp.useTemporal == null) {
gfp.useTemporal = false;
}
p.apply_preset(gfp, 500 - gfp.VBR_q * 10, 0);
if (gfp.quality < 0)
gfp.quality = LAME_DEFAULT_QUALITY;
if (gfp.quality < 5)
gfp.quality = 0;
if (gfp.quality > 5)
gfp.quality = 5;
gfc.PSY.mask_adjust = gfp.maskingadjust;
gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
if (gfp.experimentalY)
gfc.sfb21_extra = false;
else
gfc.sfb21_extra = gfp.out_samplerate > 44e3;
gfc.iteration_loop = new VBRNewIterationLoop(qu);
break;
}
case VbrMode$2.vbr_rh: {
p.apply_preset(gfp, 500 - gfp.VBR_q * 10, 0);
gfc.PSY.mask_adjust = gfp.maskingadjust;
gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
if (gfp.experimentalY)
gfc.sfb21_extra = false;
else
gfc.sfb21_extra = gfp.out_samplerate > 44e3;
if (gfp.quality > 6)
gfp.quality = 6;
if (gfp.quality < 0)
gfp.quality = LAME_DEFAULT_QUALITY;
gfc.iteration_loop = new VBROldIterationLoop(qu);
break;
}
default: {
var vbrmode;
gfc.sfb21_extra = false;
if (gfp.quality < 0)
gfp.quality = LAME_DEFAULT_QUALITY;
vbrmode = gfp.VBR;
if (vbrmode == VbrMode$2.vbr_off)
gfp.VBR_mean_bitrate_kbps = gfp.brate;
p.apply_preset(gfp, gfp.VBR_mean_bitrate_kbps, 0);
gfp.VBR = vbrmode;
gfc.PSY.mask_adjust = gfp.maskingadjust;
gfc.PSY.mask_adjust_short = gfp.maskingadjust_short;
if (vbrmode == VbrMode$2.vbr_off) {
gfc.iteration_loop = new CBRNewIterationLoop_1(qu);
} else {
gfc.iteration_loop = new ABRIterationLoop(qu);
}
break;
}
}
assert$2(gfp.scale >= 0);
if (gfp.VBR != VbrMode$2.vbr_off) {
gfc.VBR_min_bitrate = 1;
gfc.VBR_max_bitrate = 14;
if (gfp.out_samplerate < 16e3)
gfc.VBR_max_bitrate = 8;
if (gfp.VBR_min_bitrate_kbps != 0) {
gfp.VBR_min_bitrate_kbps = FindNearestBitrate(
gfp.VBR_min_bitrate_kbps,
gfp.version,
gfp.out_samplerate
);
gfc.VBR_min_bitrate = BitrateIndex(
gfp.VBR_min_bitrate_kbps,
gfp.version,
gfp.out_samplerate
);
if (gfc.VBR_min_bitrate < 0)
return -1;
}
if (gfp.VBR_max_bitrate_kbps != 0) {
gfp.VBR_max_bitrate_kbps = FindNearestBitrate(
gfp.VBR_max_bitrate_kbps,
gfp.version,
gfp.out_samplerate
);
gfc.VBR_max_bitrate = BitrateIndex(
gfp.VBR_max_bitrate_kbps,
gfp.version,
gfp.out_samplerate
);
if (gfc.VBR_max_bitrate < 0)
return -1;
}
gfp.VBR_min_bitrate_kbps = Tables_1.bitrate_table[gfp.version][gfc.VBR_min_bitrate];
gfp.VBR_max_bitrate_kbps = Tables_1.bitrate_table[gfp.version][gfc.VBR_max_bitrate];
gfp.VBR_mean_bitrate_kbps = Math.min(
Tables_1.bitrate_table[gfp.version][gfc.VBR_max_bitrate],
gfp.VBR_mean_bitrate_kbps
);
gfp.VBR_mean_bitrate_kbps = Math.max(
Tables_1.bitrate_table[gfp.version][gfc.VBR_min_bitrate],
gfp.VBR_mean_bitrate_kbps
);
}
if (gfp.tune) {
gfc.PSY.mask_adjust += gfp.tune_value_a;
gfc.PSY.mask_adjust_short += gfp.tune_value_a;
}
lame_init_qval(gfp);
assert$2(gfp.scale >= 0);
if (gfp.athaa_type < 0)
gfc.ATH.useAdjust = 3;
else
gfc.ATH.useAdjust = gfp.athaa_type;
gfc.ATH.aaSensitivityP = Math.pow(10, gfp.athaa_sensitivity / -10);
if (gfp.short_blocks == null) {
gfp.short_blocks = ShortBlock$2.short_block_allowed;
}
if (gfp.short_blocks == ShortBlock$2.short_block_allowed && (gfp.mode == MPEGMode.JOINT_STEREO || gfp.mode == MPEGMode.STEREO)) {
gfp.short_blocks = ShortBlock$2.short_block_coupled;
}
if (gfp.quant_comp < 0)
gfp.quant_comp = 1;
if (gfp.quant_comp_short < 0)
gfp.quant_comp_short = 0;
if (gfp.msfix < 0)
gfp.msfix = 0;
gfp.exp_nspsytune = gfp.exp_nspsytune | 1;
if (gfp.internal_flags.nsPsy.attackthre < 0)
gfp.internal_flags.nsPsy.attackthre = PsyModel_1.NSATTACKTHRE;
if (gfp.internal_flags.nsPsy.attackthre_s < 0)
gfp.internal_flags.nsPsy.attackthre_s = PsyModel_1.NSATTACKTHRE_S;
assert$2(gfp.scale >= 0);
if (gfp.scale < 0)
gfp.scale = 1;
if (gfp.ATHtype < 0)
gfp.ATHtype = 4;
if (gfp.ATHcurve < 0)
gfp.ATHcurve = 4;
if (gfp.athaa_loudapprox < 0)
gfp.athaa_loudapprox = 2;
if (gfp.interChRatio < 0)
gfp.interChRatio = 0;
if (gfp.useTemporal == null)
gfp.useTemporal = true;
gfc.slot_lag = gfc.frac_SpF = 0;
if (gfp.VBR == VbrMode$2.vbr_off)
gfc.slot_lag = gfc.frac_SpF = (gfp.version + 1) * 72e3 * gfp.brate % gfp.out_samplerate | 0;
qupvt.iteration_init(gfp);
psy.psymodel_init(gfp);
assert$2(gfp.scale >= 0);
return 0;
};
function update_inbuffer_size(gfc, nsamples) {
if (gfc.in_buffer_0 == null || gfc.in_buffer_nsamples < nsamples) {
gfc.in_buffer_0 = new_float$2(nsamples);
gfc.in_buffer_1 = new_float$2(nsamples);
gfc.in_buffer_nsamples = nsamples;
}
}
this.lame_encode_flush = function(gfp, mp3buffer, mp3bufferPos, mp3buffer_size) {
var gfc = gfp.internal_flags;
var buffer = new_short_n$1([2, 1152]);
var imp3 = 0, mp3count, mp3buffer_size_remaining;
var end_padding;
var frames_left;
var samples_to_encode = gfc.mf_samples_to_encode - Encoder_1.POSTDELAY;
var mf_needed = calcNeeded(gfp);
if (gfc.mf_samples_to_encode < 1) {
return 0;
}
mp3count = 0;
if (gfp.in_samplerate != gfp.out_samplerate) {
samples_to_encode += 16 * gfp.out_samplerate / gfp.in_samplerate;
}
end_padding = gfp.framesize - samples_to_encode % gfp.framesize;
if (end_padding < 576)
end_padding += gfp.framesize;
gfp.encoder_padding = end_padding;
frames_left = (samples_to_encode + end_padding) / gfp.framesize;
while (frames_left > 0 && imp3 >= 0) {
var bunch = mf_needed - gfc.mf_size;
var frame_num = gfp.frameNum;
bunch *= gfp.in_samplerate;
bunch /= gfp.out_samplerate;
if (bunch > 1152)
bunch = 1152;
if (bunch < 1)
bunch = 1;
mp3buffer_size_remaining = mp3buffer_size - mp3count;
if (mp3buffer_size == 0)
mp3buffer_size_remaining = 0;
imp3 = this.lame_encode_buffer(
gfp,
buffer[0],
buffer[1],
bunch,
mp3buffer,
mp3bufferPos,
mp3buffer_size_remaining
);
mp3bufferPos += imp3;
mp3count += imp3;
frames_left -= frame_num != gfp.frameNum ? 1 : 0;
}
gfc.mf_samples_to_encode = 0;
if (imp3 < 0) {
return imp3;
}
mp3buffer_size_remaining = mp3buffer_size - mp3count;
if (mp3buffer_size == 0)
mp3buffer_size_remaining = 0;
bs.flush_bitstream(gfp);
imp3 = bs.copy_buffer(
gfc,
mp3buffer,
mp3bufferPos,
mp3buffer_size_remaining,
1
);
if (imp3 < 0) {
return imp3;
}
mp3bufferPos += imp3;
mp3count += imp3;
mp3buffer_size_remaining = mp3buffer_size - mp3count;
if (mp3buffer_size == 0)
mp3buffer_size_remaining = 0;
if (gfp.write_id3tag_automatic) {
id3.id3tag_write_v1(gfp);
imp3 = bs.copy_buffer(
gfc,
mp3buffer,
mp3bufferPos,
mp3buffer_size_remaining,
0
);
if (imp3 < 0) {
return imp3;
}
mp3count += imp3;
}
return mp3count;
};
this.lame_encode_buffer = function(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3bufPos, mp3buf_size) {
var gfc = gfp.internal_flags;
var in_buffer = [null, null];
if (gfc.Class_ID != LAME_ID)
return -3;
if (nsamples == 0)
return 0;
update_inbuffer_size(gfc, nsamples);
in_buffer[0] = gfc.in_buffer_0;
in_buffer[1] = gfc.in_buffer_1;
for (var i = 0; i < nsamples; i++) {
in_buffer[0][i] = buffer_l[i];
if (gfc.channels_in > 1)
in_buffer[1][i] = buffer_r[i];
}
return lame_encode_buffer_sample(
gfp,
in_buffer[0],
in_buffer[1],
nsamples,
mp3buf,
mp3bufPos,
mp3buf_size
);
};
function calcNeeded(gfp) {
var mf_needed = Encoder_1.BLKSIZE + gfp.framesize - Encoder_1.FFTOFFSET;
mf_needed = Math.max(mf_needed, 512 + gfp.framesize - 32);
assert$2(LameInternalFlags_1.MFSIZE >= mf_needed);
return mf_needed;
}
function lame_encode_buffer_sample(gfp, buffer_l, buffer_r, nsamples, mp3buf, mp3bufPos, mp3buf_size) {
var gfc = gfp.internal_flags;
var mp3size = 0, ret, i, ch, mf_needed;
var mp3out;
var mfbuf = [null, null];
var in_buffer = [null, null];
if (gfc.Class_ID != LAME_ID)
return -3;
if (nsamples == 0)
return 0;
mp3out = bs.copy_buffer(gfc, mp3buf, mp3bufPos, mp3buf_size, 0);
if (mp3out < 0)
return mp3out;
mp3bufPos += mp3out;
mp3size += mp3out;
in_buffer[0] = buffer_l;
in_buffer[1] = buffer_r;
if (BitStream_1.NEQ(gfp.scale, 0) && BitStream_1.NEQ(gfp.scale, 1)) {
for (i = 0; i < nsamples; ++i) {
in_buffer[0][i] *= gfp.scale;
if (gfc.channels_out == 2)
in_buffer[1][i] *= gfp.scale;
}
}
if (BitStream_1.NEQ(gfp.scale_left, 0) && BitStream_1.NEQ(gfp.scale_left, 1)) {
for (i = 0; i < nsamples; ++i) {
in_buffer[0][i] *= gfp.scale_left;
}
}
if (BitStream_1.NEQ(gfp.scale_right, 0) && BitStream_1.NEQ(gfp.scale_right, 1)) {
for (i = 0; i < nsamples; ++i) {
in_buffer[1][i] *= gfp.scale_right;
}
}
if (gfp.num_channels == 2 && gfc.channels_out == 1) {
for (i = 0; i < nsamples; ++i) {
in_buffer[0][i] = 0.5 * (in_buffer[0][i] + in_buffer[1][i]);
in_buffer[1][i] = 0;
}
}
mf_needed = calcNeeded(gfp);
mfbuf[0] = gfc.mfbuf[0];
mfbuf[1] = gfc.mfbuf[1];
var in_bufferPos = 0;
while (nsamples > 0) {
var in_buffer_ptr = [null, null];
var n_in = 0;
var n_out = 0;
in_buffer_ptr[0] = in_buffer[0];
in_buffer_ptr[1] = in_buffer[1];
var inOut = new InOut();
fill_buffer(
gfp,
mfbuf,
in_buffer_ptr,
in_bufferPos,
nsamples,
inOut
);
n_in = inOut.n_in;
n_out = inOut.n_out;
if (gfc.findReplayGain && !gfc.decode_on_the_fly) {
if (ga.AnalyzeSamples(
gfc.rgdata,
mfbuf[0],
gfc.mf_size,
mfbuf[1],
gfc.mf_size,
n_out,
gfc.channels_out
) == GainAnalysis.GAIN_ANALYSIS_ERROR)
return -6;
}
nsamples -= n_in;
in_bufferPos += n_in;
if (gfc.channels_out == 2)
;
gfc.mf_size += n_out;
assert$2(gfc.mf_size <= LameInternalFlags_1.MFSIZE);
if (gfc.mf_samples_to_encode < 1) {
gfc.mf_samples_to_encode = Encoder_1.ENCDELAY + Encoder_1.POSTDELAY;
}
gfc.mf_samples_to_encode += n_out;
if (gfc.mf_size >= mf_needed) {
var buf_size = mp3buf_size - mp3size;
if (mp3buf_size == 0)
buf_size = 0;
ret = lame_encode_frame(
gfp,
mfbuf[0],
mfbuf[1],
mp3buf,
mp3bufPos,
buf_size
);
if (ret < 0)
return ret;
mp3bufPos += ret;
mp3size += ret;
gfc.mf_size -= gfp.framesize;
gfc.mf_samples_to_encode -= gfp.framesize;
for (ch = 0; ch < gfc.channels_out; ch++)
for (i = 0; i < gfc.mf_size; i++)
mfbuf[ch][i] = mfbuf[ch][i + gfp.framesize];
}
}
assert$2(nsamples == 0);
return mp3size;
}
function lame_encode_frame(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
var ret = self.enc.lame_encode_mp3_frame(
gfp,
inbuf_l,
inbuf_r,
mp3buf,
mp3bufPos,
mp3buf_size
);
gfp.frameNum++;
return ret;
}
function InOut() {
this.n_in = 0;
this.n_out = 0;
}
function NumUsed() {
this.num_used = 0;
}
function gcd(i, j) {
return j != 0 ? gcd(j, i % j) : i;
}
function blackman(x, fcn, l) {
var wcn = Math.PI * fcn;
x /= l;
if (x < 0)
x = 0;
if (x > 1)
x = 1;
var x2 = x - 0.5;
var bkwn = 0.42 - 0.5 * Math.cos(2 * x * Math.PI) + 0.08 * Math.cos(4 * x * Math.PI);
if (Math.abs(x2) < 1e-9)
return wcn / Math.PI;
else
return bkwn * Math.sin(l * wcn * x2) / (Math.PI * l * x2);
}
function fill_buffer_resample(gfp, outbuf, outbufPos, desired_len, inbuf, in_bufferPos, len, num_used, ch) {
var gfc = gfp.internal_flags;
var i, j = 0, k;
var bpc = gfp.out_samplerate / gcd(gfp.out_samplerate, gfp.in_samplerate);
if (bpc > LameInternalFlags_1.BPC)
bpc = LameInternalFlags_1.BPC;
var intratio = Math.abs(gfc.resample_ratio - Math.floor(0.5 + gfc.resample_ratio)) < 1e-4 ? 1 : 0;
var fcn = 1 / gfc.resample_ratio;
if (fcn > 1)
fcn = 1;
var filter_l = 31;
if (0 == filter_l % 2)
--filter_l;
filter_l += intratio;
var BLACKSIZE = filter_l + 1;
if (gfc.fill_buffer_resample_init == 0) {
gfc.inbuf_old[0] = new_float$2(BLACKSIZE);
gfc.inbuf_old[1] = new_float$2(BLACKSIZE);
for (i = 0; i <= 2 * bpc; ++i)
gfc.blackfilt[i] = new_float$2(BLACKSIZE);
gfc.itime[0] = 0;
gfc.itime[1] = 0;
for (j = 0; j <= 2 * bpc; j++) {
var sum = 0;
var offset = (j - bpc) / (2 * bpc);
for (i = 0; i <= filter_l; i++)
sum += gfc.blackfilt[j][i] = blackman(
i - offset,
fcn,
filter_l
);
for (i = 0; i <= filter_l; i++)
gfc.blackfilt[j][i] /= sum;
}
gfc.fill_buffer_resample_init = 1;
}
var inbuf_old = gfc.inbuf_old[ch];
for (k = 0; k < desired_len; k++) {
var time0;
var joff;
time0 = k * gfc.resample_ratio;
j = 0 | Math.floor(time0 - gfc.itime[ch]);
if (filter_l + j - filter_l / 2 >= len)
break;
var offset = time0 - gfc.itime[ch] - (j + 0.5 * (filter_l % 2));
assert$2(Math.abs(offset) <= 0.501);
joff = 0 | Math.floor(offset * 2 * bpc + bpc + 0.5);
var xvalue = 0;
for (i = 0; i <= filter_l; ++i) {
var j2 = i + j - filter_l / 2;
var y;
assert$2(j2 < len);
assert$2(j2 + BLACKSIZE >= 0);
y = j2 < 0 ? inbuf_old[BLACKSIZE + j2] : inbuf[in_bufferPos + j2];
xvalue += y * gfc.blackfilt[joff][i];
}
outbuf[outbufPos + k] = xvalue;
}
num_used.num_used = Math.min(len, filter_l + j - filter_l / 2);
gfc.itime[ch] += num_used.num_used - k * gfc.resample_ratio;
if (num_used.num_used >= BLACKSIZE) {
for (i = 0; i < BLACKSIZE; i++)
inbuf_old[i] = inbuf[in_bufferPos + num_used.num_used + i - BLACKSIZE];
} else {
var n_shift = BLACKSIZE - num_used.num_used;
for (i = 0; i < n_shift; ++i)
inbuf_old[i] = inbuf_old[i + num_used.num_used];
for (j = 0; i < BLACKSIZE; ++i, ++j)
inbuf_old[i] = inbuf[in_bufferPos + j];
assert$2(j == num_used.num_used);
}
return k;
}
function fill_buffer(gfp, mfbuf, in_buffer, in_bufferPos, nsamples, io) {
var gfc = gfp.internal_flags;
if (gfc.resample_ratio < 0.9999 || gfc.resample_ratio > 1.0001) {
for (var ch = 0; ch < gfc.channels_out; ch++) {
var numUsed = new NumUsed();
io.n_out = fill_buffer_resample(
gfp,
mfbuf[ch],
gfc.mf_size,
gfp.framesize,
in_buffer[ch],
in_bufferPos,
nsamples,
numUsed,
ch
);
io.n_in = numUsed.num_used;
}
} else {
io.n_out = Math.min(gfp.framesize, nsamples);
io.n_in = io.n_out;
for (var i = 0; i < io.n_out; ++i) {
mfbuf[0][gfc.mf_size + i] = in_buffer[0][in_bufferPos + i];
if (gfc.channels_out == 2)
mfbuf[1][gfc.mf_size + i] = in_buffer[1][in_bufferPos + i];
}
}
}
}
var Lame_1 = Lame$1;
var VbrMode$20 = common.VbrMode;
function Presets$1() {
function VBRPresets(qual, comp, compS, y, shThreshold, shThresholdS, adj, adjShort, lower, curve, sens, inter, joint, mod, fix) {
this.vbr_q = qual;
this.quant_comp = comp;
this.quant_comp_s = compS;
this.expY = y;
this.st_lrm = shThreshold;
this.st_s = shThresholdS;
this.masking_adj = adj;
this.masking_adj_short = adjShort;
this.ath_lower = lower;
this.ath_curve = curve;
this.ath_sensitivity = sens;
this.interch = inter;
this.safejoint = joint;
this.sfb21mod = mod;
this.msfix = fix;
}
function ABRPresets(kbps, comp, compS, joint, fix, shThreshold, shThresholdS, bass, sc, mask, lower, curve, interCh, sfScale) {
this.quant_comp = comp;
this.quant_comp_s = compS;
this.safejoint = joint;
this.nsmsfix = fix;
this.st_lrm = shThreshold;
this.st_s = shThresholdS;
this.nsbass = bass;
this.scale = sc;
this.masking_adj = mask;
this.ath_lower = lower;
this.ath_curve = curve;
this.interch = interCh;
this.sfscale = sfScale;
}
var lame;
this.setModules = function(_lame) {
lame = _lame;
};
var vbr_old_switch_map = [
new VBRPresets(0, 9, 9, 0, 5.2, 125, -4.2, -6.3, 4.8, 1, 0, 0, 2, 21, 0.97),
new VBRPresets(1, 9, 9, 0, 5.3, 125, -3.6, -5.6, 4.5, 1.5, 0, 0, 2, 21, 1.35),
new VBRPresets(2, 9, 9, 0, 5.6, 125, -2.2, -3.5, 2.8, 2, 0, 0, 2, 21, 1.49),
new VBRPresets(3, 9, 9, 1, 5.8, 130, -1.8, -2.8, 2.6, 3, -4, 0, 2, 20, 1.64),
new VBRPresets(4, 9, 9, 1, 6, 135, -0.7, -1.1, 1.1, 3.5, -8, 0, 2, 0, 1.79),
new VBRPresets(5, 9, 9, 1, 6.4, 140, 0.5, 0.4, -7.5, 4, -12, 2e-4, 0, 0, 1.95),
new VBRPresets(6, 9, 9, 1, 6.6, 145, 0.67, 0.65, -14.7, 6.5, -19, 4e-4, 0, 0, 2.3),
new VBRPresets(7, 9, 9, 1, 6.6, 145, 0.8, 0.75, -19.7, 8, -22, 6e-4, 0, 0, 2.7),
new VBRPresets(8, 9, 9, 1, 6.6, 145, 1.2, 1.15, -27.5, 10, -23, 7e-4, 0, 0, 0),
new VBRPresets(9, 9, 9, 1, 6.6, 145, 1.6, 1.6, -36, 11, -25, 8e-4, 0, 0, 0),
new VBRPresets(10, 9, 9, 1, 6.6, 145, 2, 2, -36, 12, -25, 8e-4, 0, 0, 0)
];
var vbr_psy_switch_map = [
new VBRPresets(0, 9, 9, 0, 4.2, 25, -7, -4, 7.5, 1, 0, 0, 2, 26, 0.97),
new VBRPresets(1, 9, 9, 0, 4.2, 25, -5.6, -3.6, 4.5, 1.5, 0, 0, 2, 21, 1.35),
new VBRPresets(2, 9, 9, 0, 4.2, 25, -4.4, -1.8, 2, 2, 0, 0, 2, 18, 1.49),
new VBRPresets(3, 9, 9, 1, 4.2, 25, -3.4, -1.25, 1.1, 3, -4, 0, 2, 15, 1.64),
new VBRPresets(4, 9, 9, 1, 4.2, 25, -2.2, 0.1, 0, 3.5, -8, 0, 2, 0, 1.79),
new VBRPresets(5, 9, 9, 1, 4.2, 25, -1, 1.65, -7.7, 4, -12, 2e-4, 0, 0, 1.95),
new VBRPresets(6, 9, 9, 1, 4.2, 25, -0, 2.47, -7.7, 6.5, -19, 4e-4, 0, 0, 2),
new VBRPresets(7, 9, 9, 1, 4.2, 25, 0.5, 2, -14.5, 8, -22, 6e-4, 0, 0, 2),
new VBRPresets(8, 9, 9, 1, 4.2, 25, 1, 2.4, -22, 10, -23, 7e-4, 0, 0, 2),
new VBRPresets(9, 9, 9, 1, 4.2, 25, 1.5, 2.95, -30, 11, -25, 8e-4, 0, 0, 2),
new VBRPresets(10, 9, 9, 1, 4.2, 25, 2, 2.95, -36, 12, -30, 8e-4, 0, 0, 2)
];
function apply_vbr_preset(gfp, a, enforce) {
var vbr_preset = gfp.VBR == VbrMode$20.vbr_rh ? vbr_old_switch_map : vbr_psy_switch_map;
var x = gfp.VBR_q_frac;
var p = vbr_preset[a];
var q = vbr_preset[a + 1];
var set = p;
p.st_lrm = p.st_lrm + x * (q.st_lrm - p.st_lrm);
p.st_s = p.st_s + x * (q.st_s - p.st_s);
p.masking_adj = p.masking_adj + x * (q.masking_adj - p.masking_adj);
p.masking_adj_short = p.masking_adj_short + x * (q.masking_adj_short - p.masking_adj_short);
p.ath_lower = p.ath_lower + x * (q.ath_lower - p.ath_lower);
p.ath_curve = p.ath_curve + x * (q.ath_curve - p.ath_curve);
p.ath_sensitivity = p.ath_sensitivity + x * (q.ath_sensitivity - p.ath_sensitivity);
p.interch = p.interch + x * (q.interch - p.interch);
p.msfix = p.msfix + x * (q.msfix - p.msfix);
lame_set_VBR_q(gfp, set.vbr_q);
if (enforce != 0)
gfp.quant_comp = set.quant_comp;
else if (!(Math.abs(gfp.quant_comp - -1) > 0))
gfp.quant_comp = set.quant_comp;
if (enforce != 0)
gfp.quant_comp_short = set.quant_comp_s;
else if (!(Math.abs(gfp.quant_comp_short - -1) > 0))
gfp.quant_comp_short = set.quant_comp_s;
if (set.expY != 0) {
gfp.experimentalY = set.expY != 0;
}
if (enforce != 0)
gfp.internal_flags.nsPsy.attackthre = set.st_lrm;
else if (!(Math.abs(gfp.internal_flags.nsPsy.attackthre - -1) > 0))
gfp.internal_flags.nsPsy.attackthre = set.st_lrm;
if (enforce != 0)
gfp.internal_flags.nsPsy.attackthre_s = set.st_s;
else if (!(Math.abs(gfp.internal_flags.nsPsy.attackthre_s - -1) > 0))
gfp.internal_flags.nsPsy.attackthre_s = set.st_s;
if (enforce != 0)
gfp.maskingadjust = set.masking_adj;
else if (!(Math.abs(gfp.maskingadjust - 0) > 0))
gfp.maskingadjust = set.masking_adj;
if (enforce != 0)
gfp.maskingadjust_short = set.masking_adj_short;
else if (!(Math.abs(gfp.maskingadjust_short - 0) > 0))
gfp.maskingadjust_short = set.masking_adj_short;
if (enforce != 0)
gfp.ATHlower = -set.ath_lower / 10;
else if (!(Math.abs(-gfp.ATHlower * 10 - 0) > 0))
gfp.ATHlower = -set.ath_lower / 10;
if (enforce != 0)
gfp.ATHcurve = set.ath_curve;
else if (!(Math.abs(gfp.ATHcurve - -1) > 0))
gfp.ATHcurve = set.ath_curve;
if (enforce != 0)
gfp.athaa_sensitivity = set.ath_sensitivity;
else if (!(Math.abs(gfp.athaa_sensitivity - -1) > 0))
gfp.athaa_sensitivity = set.ath_sensitivity;
if (set.interch > 0) {
if (enforce != 0)
gfp.interChRatio = set.interch;
else if (!(Math.abs(gfp.interChRatio - -1) > 0))
gfp.interChRatio = set.interch;
}
if (set.safejoint > 0) {
gfp.exp_nspsytune = gfp.exp_nspsytune | set.safejoint;
}
if (set.sfb21mod > 0) {
gfp.exp_nspsytune = gfp.exp_nspsytune | set.sfb21mod << 20;
}
if (enforce != 0)
gfp.msfix = set.msfix;
else if (!(Math.abs(gfp.msfix - -1) > 0))
gfp.msfix = set.msfix;
if (enforce == 0) {
gfp.VBR_q = a;
gfp.VBR_q_frac = x;
}
}
var abr_switch_map = [
new ABRPresets(8, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -30, 11, 12e-4, 1),
/* 8, impossible to use in stereo */
new ABRPresets(16, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -25, 11, 1e-3, 1),
/* 16 */
new ABRPresets(24, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -20, 11, 1e-3, 1),
/* 24 */
new ABRPresets(32, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -15, 11, 1e-3, 1),
/* 32 */
new ABRPresets(40, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -10, 11, 9e-4, 1),
/* 40 */
new ABRPresets(48, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -10, 11, 9e-4, 1),
/* 48 */
new ABRPresets(56, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -6, 11, 8e-4, 1),
/* 56 */
new ABRPresets(64, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, -2, 11, 8e-4, 1),
/* 64 */
new ABRPresets(80, 9, 9, 0, 0, 6.6, 145, 0, 0.95, 0, 0, 8, 7e-4, 1),
/* 80 */
new ABRPresets(96, 9, 9, 0, 2.5, 6.6, 145, 0, 0.95, 0, 1, 5.5, 6e-4, 1),
/* 96 */
new ABRPresets(112, 9, 9, 0, 2.25, 6.6, 145, 0, 0.95, 0, 2, 4.5, 5e-4, 1),
/* 112 */
new ABRPresets(128, 9, 9, 0, 1.95, 6.4, 140, 0, 0.95, 0, 3, 4, 2e-4, 1),
/* 128 */
new ABRPresets(160, 9, 9, 1, 1.79, 6, 135, 0, 0.95, -2, 5, 3.5, 0, 1),
/* 160 */
new ABRPresets(192, 9, 9, 1, 1.49, 5.6, 125, 0, 0.97, -4, 7, 3, 0, 0),
/* 192 */
new ABRPresets(224, 9, 9, 1, 1.25, 5.2, 125, 0, 0.98, -6, 9, 2, 0, 0),
/* 224 */
new ABRPresets(256, 9, 9, 1, 0.97, 5.2, 125, 0, 1, -8, 10, 1, 0, 0),
/* 256 */
new ABRPresets(320, 9, 9, 1, 0.9, 5.2, 125, 0, 1, -10, 12, 0, 0, 0)
/* 320 */
];
function apply_abr_preset(gfp, preset, enforce) {
var actual_bitrate = preset;
var r = lame.nearestBitrateFullIndex(preset);
gfp.VBR = VbrMode$20.vbr_abr;
gfp.VBR_mean_bitrate_kbps = actual_bitrate;
gfp.VBR_mean_bitrate_kbps = Math.min(gfp.VBR_mean_bitrate_kbps, 320);
gfp.VBR_mean_bitrate_kbps = Math.max(gfp.VBR_mean_bitrate_kbps, 8);
gfp.brate = gfp.VBR_mean_bitrate_kbps;
if (gfp.VBR_mean_bitrate_kbps > 320) {
gfp.disable_reservoir = true;
}
if (abr_switch_map[r].safejoint > 0)
gfp.exp_nspsytune = gfp.exp_nspsytune | 2;
if (abr_switch_map[r].sfscale > 0) {
gfp.internal_flags.noise_shaping = 2;
}
if (Math.abs(abr_switch_map[r].nsbass) > 0) {
var k = int(abr_switch_map[r].nsbass * 4);
if (k < 0)
k += 64;
gfp.exp_nspsytune = gfp.exp_nspsytune | k << 2;
}
if (enforce != 0)
gfp.quant_comp = abr_switch_map[r].quant_comp;
else if (!(Math.abs(gfp.quant_comp - -1) > 0))
gfp.quant_comp = abr_switch_map[r].quant_comp;
if (enforce != 0)
gfp.quant_comp_short = abr_switch_map[r].quant_comp_s;
else if (!(Math.abs(gfp.quant_comp_short - -1) > 0))
gfp.quant_comp_short = abr_switch_map[r].quant_comp_s;
if (enforce != 0)
gfp.msfix = abr_switch_map[r].nsmsfix;
else if (!(Math.abs(gfp.msfix - -1) > 0))
gfp.msfix = abr_switch_map[r].nsmsfix;
if (enforce != 0)
gfp.internal_flags.nsPsy.attackthre = abr_switch_map[r].st_lrm;
else if (!(Math.abs(gfp.internal_flags.nsPsy.attackthre - -1) > 0))
gfp.internal_flags.nsPsy.attackthre = abr_switch_map[r].st_lrm;
if (enforce != 0)
gfp.internal_flags.nsPsy.attackthre_s = abr_switch_map[r].st_s;
else if (!(Math.abs(gfp.internal_flags.nsPsy.attackthre_s - -1) > 0))
gfp.internal_flags.nsPsy.attackthre_s = abr_switch_map[r].st_s;
if (enforce != 0)
gfp.scale = abr_switch_map[r].scale;
else if (!(Math.abs(gfp.scale - -1) > 0))
gfp.scale = abr_switch_map[r].scale;
if (enforce != 0)
gfp.maskingadjust = abr_switch_map[r].masking_adj;
else if (!(Math.abs(gfp.maskingadjust - 0) > 0))
gfp.maskingadjust = abr_switch_map[r].masking_adj;
if (abr_switch_map[r].masking_adj > 0) {
if (enforce != 0)
gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 0.9;
else if (!(Math.abs(gfp.maskingadjust_short - 0) > 0))
gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 0.9;
} else {
if (enforce != 0)
gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 1.1;
else if (!(Math.abs(gfp.maskingadjust_short - 0) > 0))
gfp.maskingadjust_short = abr_switch_map[r].masking_adj * 1.1;
}
if (enforce != 0)
gfp.ATHlower = -abr_switch_map[r].ath_lower / 10;
else if (!(Math.abs(-gfp.ATHlower * 10 - 0) > 0))
gfp.ATHlower = -abr_switch_map[r].ath_lower / 10;
if (enforce != 0)
gfp.ATHcurve = abr_switch_map[r].ath_curve;
else if (!(Math.abs(gfp.ATHcurve - -1) > 0))
gfp.ATHcurve = abr_switch_map[r].ath_curve;
if (enforce != 0)
gfp.interChRatio = abr_switch_map[r].interch;
else if (!(Math.abs(gfp.interChRatio - -1) > 0))
gfp.interChRatio = abr_switch_map[r].interch;
return preset;
}
this.apply_preset = function(gfp, preset, enforce) {
switch (preset) {
case Lame.R3MIX: {
preset = Lame.V3;
gfp.VBR = VbrMode$20.vbr_mtrh;
break;
}
case Lame.MEDIUM: {
preset = Lame.V4;
gfp.VBR = VbrMode$20.vbr_rh;
break;
}
case Lame.MEDIUM_FAST: {
preset = Lame.V4;
gfp.VBR = VbrMode$20.vbr_mtrh;
break;
}
case Lame.STANDARD: {
preset = Lame.V2;
gfp.VBR = VbrMode$20.vbr_rh;
break;
}
case Lame.STANDARD_FAST: {
preset = Lame.V2;
gfp.VBR = VbrMode$20.vbr_mtrh;
break;
}
case Lame.EXTREME: {
preset = Lame.V0;
gfp.VBR = VbrMode$20.vbr_rh;
break;
}
case Lame.EXTREME_FAST: {
preset = Lame.V0;
gfp.VBR = VbrMode$20.vbr_mtrh;
break;
}
case Lame.INSANE: {
preset = 320;
gfp.preset = preset;
apply_abr_preset(gfp, preset, enforce);
gfp.VBR = VbrMode$20.vbr_off;
return preset;
}
}
gfp.preset = preset;
{
switch (preset) {
case Lame.V9:
apply_vbr_preset(gfp, 9, enforce);
return preset;
case Lame.V8:
apply_vbr_preset(gfp, 8, enforce);
return preset;
case Lame.V7:
apply_vbr_preset(gfp, 7, enforce);
return preset;
case Lame.V6:
apply_vbr_preset(gfp, 6, enforce);
return preset;
case Lame.V5:
apply_vbr_preset(gfp, 5, enforce);
return preset;
case Lame.V4:
apply_vbr_preset(gfp, 4, enforce);
return preset;
case Lame.V3:
apply_vbr_preset(gfp, 3, enforce);
return preset;
case Lame.V2:
apply_vbr_preset(gfp, 2, enforce);
return preset;
case Lame.V1:
apply_vbr_preset(gfp, 1, enforce);
return preset;
case Lame.V0:
apply_vbr_preset(gfp, 0, enforce);
return preset;
default:
break;
}
}
if (8 <= preset && preset <= 320) {
return apply_abr_preset(gfp, preset, enforce);
}
gfp.preset = 0;
return preset;
};
function lame_set_VBR_q(gfp, VBR_q) {
var ret = 0;
if (0 > VBR_q) {
ret = -1;
VBR_q = 0;
}
if (9 < VBR_q) {
ret = -1;
VBR_q = 9;
}
gfp.VBR_q = VBR_q;
gfp.VBR_q_frac = 0;
return ret;
}
}
var Presets_1 = Presets$1;
function VBRQuantize() {
var qupvt;
var tak;
this.setModules = function(_qupvt, _tk) {
qupvt = _qupvt;
tak = _tk;
};
}
var VBRQuantize_1 = VBRQuantize;
function CalcNoiseResult$1() {
this.over_noise = 0;
this.tot_noise = 0;
this.max_noise = 0;
this.over_count = 0;
this.over_SSD = 0;
this.bits = 0;
}
var CalcNoiseResult_1 = CalcNoiseResult$1;
var new_float$22 = common.new_float;
var new_int$22 = common.new_int;
function CalcNoiseData() {
this.global_gain = 0;
this.sfb_count1 = 0;
this.step = new_int$22(39);
this.noise = new_float$22(39);
this.noise_log = new_float$22(39);
}
var CalcNoiseData_1 = CalcNoiseData;
var System$21 = common.System;
var VbrMode$21 = common.VbrMode;
var Util$21 = common.Util;
var Arrays$21 = common.Arrays;
var new_float$21 = common.new_float;
var assert$21 = common.assert;
function Quantize$1() {
var bs;
this.rv = null;
var rv;
this.qupvt = null;
var qupvt;
var vbr = new VBRQuantize_1();
var tk;
this.setModules = function(_bs, _rv, _qupvt, _tk) {
bs = _bs;
rv = _rv;
this.rv = _rv;
qupvt = _qupvt;
this.qupvt = _qupvt;
tk = _tk;
vbr.setModules(qupvt, tk);
};
this.ms_convert = function(l3_side, gr) {
for (var i = 0; i < 576; ++i) {
var l = l3_side.tt[gr][0].xr[i];
var r = l3_side.tt[gr][1].xr[i];
l3_side.tt[gr][0].xr[i] = (l + r) * (Util$21.SQRT2 * 0.5);
l3_side.tt[gr][1].xr[i] = (l - r) * (Util$21.SQRT2 * 0.5);
}
};
function init_xrpow_core(cod_info, xrpow, upper, sum) {
sum = 0;
for (var i = 0; i <= upper; ++i) {
var tmp = Math.abs(cod_info.xr[i]);
sum += tmp;
xrpow[i] = Math.sqrt(tmp * Math.sqrt(tmp));
if (xrpow[i] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[i];
}
return sum;
}
this.init_xrpow = function(gfc, cod_info, xrpow) {
var sum = 0;
var upper = 0 | cod_info.max_nonzero_coeff;
assert$21(xrpow != null);
cod_info.xrpow_max = 0;
assert$21(0 <= upper && upper <= 575);
Arrays$21.fill(xrpow, upper, 576, 0);
sum = init_xrpow_core(cod_info, xrpow, upper, sum);
if (sum > 1e-20) {
var j = 0;
if ((gfc.substep_shaping & 2) != 0)
j = 1;
for (var i = 0; i < cod_info.psymax; i++)
gfc.pseudohalf[i] = j;
return true;
}
Arrays$21.fill(cod_info.l3_enc, 0, 576, 0);
return false;
};
function psfb21_analogsilence(gfc, cod_info) {
var ath = gfc.ATH;
var xr = cod_info.xr;
if (cod_info.block_type != Encoder_1.SHORT_TYPE) {
var stop = false;
for (var gsfb = Encoder_1.PSFB21 - 1; gsfb >= 0 && !stop; gsfb--) {
var start = gfc.scalefac_band.psfb21[gsfb];
var end = gfc.scalefac_band.psfb21[gsfb + 1];
var ath21 = qupvt.athAdjust(
ath.adjust,
ath.psfb21[gsfb],
ath.floor
);
if (gfc.nsPsy.longfact[21] > 1e-12)
ath21 *= gfc.nsPsy.longfact[21];
for (var j = end - 1; j >= start; j--) {
if (Math.abs(xr[j]) < ath21)
xr[j] = 0;
else {
stop = true;
break;
}
}
}
} else {
for (var block = 0; block < 3; block++) {
var stop = false;
for (var gsfb = Encoder_1.PSFB12 - 1; gsfb >= 0 && !stop; gsfb--) {
var start = gfc.scalefac_band.s[12] * 3 + (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) * block + (gfc.scalefac_band.psfb12[gsfb] - gfc.scalefac_band.psfb12[0]);
var end = start + (gfc.scalefac_band.psfb12[gsfb + 1] - gfc.scalefac_band.psfb12[gsfb]);
var ath12 = qupvt.athAdjust(
ath.adjust,
ath.psfb12[gsfb],
ath.floor
);
if (gfc.nsPsy.shortfact[12] > 1e-12)
ath12 *= gfc.nsPsy.shortfact[12];
for (var j = end - 1; j >= start; j--) {
if (Math.abs(xr[j]) < ath12)
xr[j] = 0;
else {
stop = true;
break;
}
}
}
}
}
}
this.init_outer_loop = function(gfc, cod_info) {
cod_info.part2_3_length = 0;
cod_info.big_values = 0;
cod_info.count1 = 0;
cod_info.global_gain = 210;
cod_info.scalefac_compress = 0;
cod_info.table_select[0] = 0;
cod_info.table_select[1] = 0;
cod_info.table_select[2] = 0;
cod_info.subblock_gain[0] = 0;
cod_info.subblock_gain[1] = 0;
cod_info.subblock_gain[2] = 0;
cod_info.subblock_gain[3] = 0;
cod_info.region0_count = 0;
cod_info.region1_count = 0;
cod_info.preflag = 0;
cod_info.scalefac_scale = 0;
cod_info.count1table_select = 0;
cod_info.part2_length = 0;
cod_info.sfb_lmax = Encoder_1.SBPSY_l;
cod_info.sfb_smin = Encoder_1.SBPSY_s;
cod_info.psy_lmax = gfc.sfb21_extra ? Encoder_1.SBMAX_l : Encoder_1.SBPSY_l;
cod_info.psymax = cod_info.psy_lmax;
cod_info.sfbmax = cod_info.sfb_lmax;
cod_info.sfbdivide = 11;
for (var sfb = 0; sfb < Encoder_1.SBMAX_l; sfb++) {
cod_info.width[sfb] = gfc.scalefac_band.l[sfb + 1] - gfc.scalefac_band.l[sfb];
cod_info.window[sfb] = 3;
}
if (cod_info.block_type == Encoder_1.SHORT_TYPE) {
var ixwork = new_float$21(576);
cod_info.sfb_smin = 0;
cod_info.sfb_lmax = 0;
if (cod_info.mixed_block_flag != 0) {
cod_info.sfb_smin = 3;
cod_info.sfb_lmax = gfc.mode_gr * 2 + 4;
}
cod_info.psymax = cod_info.sfb_lmax + 3 * ((gfc.sfb21_extra ? Encoder_1.SBMAX_s : Encoder_1.SBPSY_s) - cod_info.sfb_smin);
cod_info.sfbmax = cod_info.sfb_lmax + 3 * (Encoder_1.SBPSY_s - cod_info.sfb_smin);
cod_info.sfbdivide = cod_info.sfbmax - 18;
cod_info.psy_lmax = cod_info.sfb_lmax;
var ix = gfc.scalefac_band.l[cod_info.sfb_lmax];
System$21.arraycopy(cod_info.xr, 0, ixwork, 0, 576);
for (var sfb = cod_info.sfb_smin; sfb < Encoder_1.SBMAX_s; sfb++) {
var start = gfc.scalefac_band.s[sfb];
var end = gfc.scalefac_band.s[sfb + 1];
for (var window2 = 0; window2 < 3; window2++) {
for (var l = start; l < end; l++) {
cod_info.xr[ix++] = ixwork[3 * l + window2];
}
}
}
var j = cod_info.sfb_lmax;
for (var sfb = cod_info.sfb_smin; sfb < Encoder_1.SBMAX_s; sfb++) {
cod_info.width[j] = cod_info.width[j + 1] = cod_info.width[j + 2] = gfc.scalefac_band.s[sfb + 1] - gfc.scalefac_band.s[sfb];
cod_info.window[j] = 0;
cod_info.window[j + 1] = 1;
cod_info.window[j + 2] = 2;
j += 3;
}
}
cod_info.count1bits = 0;
cod_info.sfb_partition_table = qupvt.nr_of_sfb_block[0][0];
cod_info.slen[0] = 0;
cod_info.slen[1] = 0;
cod_info.slen[2] = 0;
cod_info.slen[3] = 0;
cod_info.max_nonzero_coeff = 575;
Arrays$21.fill(cod_info.scalefac, 0);
psfb21_analogsilence(gfc, cod_info);
};
function BinSearchDirection(ordinal) {
this.ordinal = ordinal;
}
BinSearchDirection.BINSEARCH_NONE = new BinSearchDirection(0);
BinSearchDirection.BINSEARCH_UP = new BinSearchDirection(1);
BinSearchDirection.BINSEARCH_DOWN = new BinSearchDirection(2);
function bin_search_StepSize(gfc, cod_info, desired_rate, ch, xrpow) {
var nBits;
var CurrentStep = gfc.CurrentStep[ch];
var flagGoneOver = false;
var start = gfc.OldValue[ch];
var Direction = BinSearchDirection.BINSEARCH_NONE;
cod_info.global_gain = start;
desired_rate -= cod_info.part2_length;
assert$21(CurrentStep != 0);
for (; ; ) {
var step;
nBits = tk.count_bits(gfc, xrpow, cod_info, null);
if (CurrentStep == 1 || nBits == desired_rate)
break;
if (nBits > desired_rate) {
if (Direction == BinSearchDirection.BINSEARCH_DOWN)
flagGoneOver = true;
if (flagGoneOver)
CurrentStep /= 2;
Direction = BinSearchDirection.BINSEARCH_UP;
step = CurrentStep;
} else {
if (Direction == BinSearchDirection.BINSEARCH_UP)
flagGoneOver = true;
if (flagGoneOver)
CurrentStep /= 2;
Direction = BinSearchDirection.BINSEARCH_DOWN;
step = -CurrentStep;
}
cod_info.global_gain += step;
if (cod_info.global_gain < 0) {
cod_info.global_gain = 0;
flagGoneOver = true;
}
if (cod_info.global_gain > 255) {
cod_info.global_gain = 255;
flagGoneOver = true;
}
}
assert$21(cod_info.global_gain >= 0);
assert$21(cod_info.global_gain < 256);
while (nBits > desired_rate && cod_info.global_gain < 255) {
cod_info.global_gain++;
nBits = tk.count_bits(gfc, xrpow, cod_info, null);
}
gfc.CurrentStep[ch] = start - cod_info.global_gain >= 4 ? 4 : 2;
gfc.OldValue[ch] = cod_info.global_gain;
cod_info.part2_3_length = nBits;
return nBits;
}
this.trancate_smallspectrums = function(gfc, gi, l3_xmin, work) {
var distort = new_float$21(L3Side_1.SFBMAX);
if (0 == (gfc.substep_shaping & 4) && gi.block_type == Encoder_1.SHORT_TYPE || (gfc.substep_shaping & 128) != 0)
return;
qupvt.calc_noise(gi, l3_xmin, distort, new CalcNoiseResult_1(), null);
for (var j = 0; j < 576; j++) {
var xr = 0;
if (gi.l3_enc[j] != 0)
xr = Math.abs(gi.xr[j]);
work[j] = xr;
}
var j = 0;
var sfb = 8;
if (gi.block_type == Encoder_1.SHORT_TYPE)
sfb = 6;
do {
var allowedNoise, trancateThreshold;
var nsame, start;
var width = gi.width[sfb];
j += width;
if (distort[sfb] >= 1)
continue;
Arrays$21.sort(work, j - width, width);
if (BitStream.EQ(work[j - 1], 0))
continue;
allowedNoise = (1 - distort[sfb]) * l3_xmin[sfb];
trancateThreshold = 0;
start = 0;
do {
var noise;
for (nsame = 1; start + nsame < width; nsame++)
if (BitStream.NEQ(work[start + j - width], work[start + j + nsame - width]))
break;
noise = work[start + j - width] * work[start + j - width] * nsame;
if (allowedNoise < noise) {
if (start != 0)
trancateThreshold = work[start + j - width - 1];
break;
}
allowedNoise -= noise;
start += nsame;
} while (start < width);
if (BitStream.EQ(trancateThreshold, 0))
continue;
do {
if (Math.abs(gi.xr[j - width]) <= trancateThreshold)
gi.l3_enc[j - width] = 0;
} while (--width > 0);
} while (++sfb < gi.psymax);
gi.part2_3_length = tk.noquant_count_bits(gfc, gi, null);
};
function loop_break(cod_info) {
for (var sfb = 0; sfb < cod_info.sfbmax; sfb++)
if (cod_info.scalefac[sfb] + cod_info.subblock_gain[cod_info.window[sfb]] == 0)
return false;
return true;
}
function penalties(noise) {
return Util$21.FAST_LOG10(0.368 + 0.632 * noise * noise * noise);
}
function get_klemm_noise(distort, gi) {
var klemm_noise = 1e-37;
for (var sfb = 0; sfb < gi.psymax; sfb++)
klemm_noise += penalties(distort[sfb]);
return Math.max(1e-20, klemm_noise);
}
function quant_compare(quant_comp, best, calc, gi, distort) {
var better;
switch (quant_comp) {
default:
case 9: {
if (best.over_count > 0) {
better = calc.over_SSD <= best.over_SSD;
if (calc.over_SSD == best.over_SSD)
better = calc.bits < best.bits;
} else {
better = calc.max_noise < 0 && calc.max_noise * 10 + calc.bits <= best.max_noise * 10 + best.bits;
}
break;
}
case 0:
better = calc.over_count < best.over_count || calc.over_count == best.over_count && calc.over_noise < best.over_noise || calc.over_count == best.over_count && BitStream.EQ(calc.over_noise, best.over_noise) && calc.tot_noise < best.tot_noise;
break;
case 8:
calc.max_noise = get_klemm_noise(distort, gi);
case 1:
better = calc.max_noise < best.max_noise;
break;
case 2:
better = calc.tot_noise < best.tot_noise;
break;
case 3:
better = calc.tot_noise < best.tot_noise && calc.max_noise < best.max_noise;
break;
case 4:
better = calc.max_noise <= 0 && best.max_noise > 0.2 || calc.max_noise <= 0 && best.max_noise < 0 && best.max_noise > calc.max_noise - 0.2 && calc.tot_noise < best.tot_noise || calc.max_noise <= 0 && best.max_noise > 0 && best.max_noise > calc.max_noise - 0.2 && calc.tot_noise < best.tot_noise + best.over_noise || calc.max_noise > 0 && best.max_noise > -0.05 && best.max_noise > calc.max_noise - 0.1 && calc.tot_noise + calc.over_noise < best.tot_noise + best.over_noise || calc.max_noise > 0 && best.max_noise > -0.1 && best.max_noise > calc.max_noise - 0.15 && calc.tot_noise + calc.over_noise + calc.over_noise < best.tot_noise + best.over_noise + best.over_noise;
break;
case 5:
better = calc.over_noise < best.over_noise || BitStream.EQ(calc.over_noise, best.over_noise) && calc.tot_noise < best.tot_noise;
break;
case 6:
better = calc.over_noise < best.over_noise || BitStream.EQ(calc.over_noise, best.over_noise) && (calc.max_noise < best.max_noise || BitStream.EQ(calc.max_noise, best.max_noise) && calc.tot_noise <= best.tot_noise);
break;
case 7:
better = calc.over_count < best.over_count || calc.over_noise < best.over_noise;
break;
}
if (best.over_count == 0) {
better = better && calc.bits < best.bits;
}
return better;
}
function amp_scalefac_bands(gfp, cod_info, distort, xrpow, bRefine) {
var gfc = gfp.internal_flags;
var ifqstep34;
if (cod_info.scalefac_scale == 0) {
ifqstep34 = 1.2968395546510096;
} else {
ifqstep34 = 1.6817928305074292;
}
var trigger = 0;
for (var sfb = 0; sfb < cod_info.sfbmax; sfb++) {
if (trigger < distort[sfb])
trigger = distort[sfb];
}
var noise_shaping_amp = gfc.noise_shaping_amp;
if (noise_shaping_amp == 3) {
if (bRefine)
noise_shaping_amp = 2;
else
noise_shaping_amp = 1;
}
switch (noise_shaping_amp) {
case 2:
break;
case 1:
if (trigger > 1)
trigger = Math.pow(trigger, 0.5);
else
trigger *= 0.95;
break;
case 0:
default:
if (trigger > 1)
trigger = 1;
else
trigger *= 0.95;
break;
}
var j = 0;
for (var sfb = 0; sfb < cod_info.sfbmax; sfb++) {
var width = cod_info.width[sfb];
var l;
j += width;
if (distort[sfb] < trigger)
continue;
if ((gfc.substep_shaping & 2) != 0) {
gfc.pseudohalf[sfb] = 0 == gfc.pseudohalf[sfb] ? 1 : 0;
if (0 == gfc.pseudohalf[sfb] && gfc.noise_shaping_amp == 2)
return;
}
cod_info.scalefac[sfb]++;
for (l = -width; l < 0; l++) {
xrpow[j + l] *= ifqstep34;
if (xrpow[j + l] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l];
}
if (gfc.noise_shaping_amp == 2)
return;
}
}
function inc_scalefac_scale(cod_info, xrpow) {
var ifqstep34 = 1.2968395546510096;
var j = 0;
for (var sfb = 0; sfb < cod_info.sfbmax; sfb++) {
var width = cod_info.width[sfb];
var s = cod_info.scalefac[sfb];
if (cod_info.preflag != 0)
s += qupvt.pretab[sfb];
j += width;
if ((s & 1) != 0) {
s++;
for (var l = -width; l < 0; l++) {
xrpow[j + l] *= ifqstep34;
if (xrpow[j + l] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l];
}
}
cod_info.scalefac[sfb] = s >> 1;
}
cod_info.preflag = 0;
cod_info.scalefac_scale = 1;
}
function inc_subblock_gain(gfc, cod_info, xrpow) {
var sfb;
var scalefac = cod_info.scalefac;
for (sfb = 0; sfb < cod_info.sfb_lmax; sfb++) {
if (scalefac[sfb] >= 16)
return true;
}
for (var window2 = 0; window2 < 3; window2++) {
var s1 = 0;
var s2 = 0;
for (sfb = cod_info.sfb_lmax + window2; sfb < cod_info.sfbdivide; sfb += 3) {
if (s1 < scalefac[sfb])
s1 = scalefac[sfb];
}
for (; sfb < cod_info.sfbmax; sfb += 3) {
if (s2 < scalefac[sfb])
s2 = scalefac[sfb];
}
if (s1 < 16 && s2 < 8)
continue;
if (cod_info.subblock_gain[window2] >= 7)
return true;
cod_info.subblock_gain[window2]++;
var j = gfc.scalefac_band.l[cod_info.sfb_lmax];
for (sfb = cod_info.sfb_lmax + window2; sfb < cod_info.sfbmax; sfb += 3) {
var amp;
var width = cod_info.width[sfb];
var s = scalefac[sfb];
assert$21(s >= 0);
s = s - (4 >> cod_info.scalefac_scale);
if (s >= 0) {
scalefac[sfb] = s;
j += width * 3;
continue;
}
scalefac[sfb] = 0;
{
var gain = 210 + (s << cod_info.scalefac_scale + 1);
amp = qupvt.IPOW20(gain);
}
j += width * (window2 + 1);
for (var l = -width; l < 0; l++) {
xrpow[j + l] *= amp;
if (xrpow[j + l] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l];
}
j += width * (3 - window2 - 1);
}
{
var amp = qupvt.IPOW20(202);
j += cod_info.width[sfb] * (window2 + 1);
for (var l = -cod_info.width[sfb]; l < 0; l++) {
xrpow[j + l] *= amp;
if (xrpow[j + l] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l];
}
}
}
return false;
}
function balance_noise(gfp, cod_info, distort, xrpow, bRefine) {
var gfc = gfp.internal_flags;
amp_scalefac_bands(gfp, cod_info, distort, xrpow, bRefine);
var status = loop_break(cod_info);
if (status)
return false;
if (gfc.mode_gr == 2)
status = tk.scale_bitcount(cod_info);
else
status = tk.scale_bitcount_lsf(gfc, cod_info);
if (!status)
return true;
if (gfc.noise_shaping > 1) {
Arrays$21.fill(gfc.pseudohalf, 0);
if (0 == cod_info.scalefac_scale) {
inc_scalefac_scale(cod_info, xrpow);
status = false;
} else {
if (cod_info.block_type == Encoder_1.SHORT_TYPE && gfc.subblock_gain > 0) {
status = inc_subblock_gain(gfc, cod_info, xrpow) || loop_break(cod_info);
}
}
}
if (!status) {
if (gfc.mode_gr == 2)
status = tk.scale_bitcount(cod_info);
else
status = tk.scale_bitcount_lsf(gfc, cod_info);
}
return !status;
}
this.outer_loop = function(gfp, cod_info, l3_xmin, xrpow, ch, targ_bits) {
var gfc = gfp.internal_flags;
var cod_info_w = new GrInfo_1();
var save_xrpow = new_float$21(576);
var distort = new_float$21(L3Side_1.SFBMAX);
var best_noise_info = new CalcNoiseResult_1();
var better;
var prev_noise = new CalcNoiseData_1();
var best_part2_3_length = 9999999;
var bEndOfSearch = false;
var bRefine = false;
var best_ggain_pass1 = 0;
bin_search_StepSize(gfc, cod_info, targ_bits, ch, xrpow);
if (0 == gfc.noise_shaping)
return 100;
qupvt.calc_noise(
cod_info,
l3_xmin,
distort,
best_noise_info,
prev_noise
);
best_noise_info.bits = cod_info.part2_3_length;
cod_info_w.assign(cod_info);
var age = 0;
System$21.arraycopy(xrpow, 0, save_xrpow, 0, 576);
while (!bEndOfSearch) {
do {
var noise_info = new CalcNoiseResult_1();
var search_limit;
var maxggain = 255;
if ((gfc.substep_shaping & 2) != 0) {
search_limit = 20;
} else {
search_limit = 3;
}
if (gfc.sfb21_extra) {
if (distort[cod_info_w.sfbmax] > 1)
break;
if (cod_info_w.block_type == Encoder_1.SHORT_TYPE && (distort[cod_info_w.sfbmax + 1] > 1 || distort[cod_info_w.sfbmax + 2] > 1))
break;
}
if (!balance_noise(gfp, cod_info_w, distort, xrpow, bRefine))
break;
if (cod_info_w.scalefac_scale != 0)
maxggain = 254;
var huff_bits = targ_bits - cod_info_w.part2_length;
if (huff_bits <= 0)
break;
while ((cod_info_w.part2_3_length = tk.count_bits(
gfc,
xrpow,
cod_info_w,
prev_noise
)) > huff_bits && cod_info_w.global_gain <= maxggain)
cod_info_w.global_gain++;
if (cod_info_w.global_gain > maxggain)
break;
if (best_noise_info.over_count == 0) {
while ((cod_info_w.part2_3_length = tk.count_bits(
gfc,
xrpow,
cod_info_w,
prev_noise
)) > best_part2_3_length && cod_info_w.global_gain <= maxggain)
cod_info_w.global_gain++;
if (cod_info_w.global_gain > maxggain)
break;
}
qupvt.calc_noise(
cod_info_w,
l3_xmin,
distort,
noise_info,
prev_noise
);
noise_info.bits = cod_info_w.part2_3_length;
if (cod_info.block_type != Encoder_1.SHORT_TYPE) {
better = gfp.quant_comp;
} else
better = gfp.quant_comp_short;
better = quant_compare(
better,
best_noise_info,
noise_info,
cod_info_w,
distort
) ? 1 : 0;
if (better != 0) {
best_part2_3_length = cod_info.part2_3_length;
best_noise_info = noise_info;
cod_info.assign(cod_info_w);
age = 0;
System$21.arraycopy(xrpow, 0, save_xrpow, 0, 576);
} else {
if (gfc.full_outer_loop == 0) {
if (++age > search_limit && best_noise_info.over_count == 0)
break;
if (gfc.noise_shaping_amp == 3 && bRefine && age > 30)
break;
if (gfc.noise_shaping_amp == 3 && bRefine && cod_info_w.global_gain - best_ggain_pass1 > 15)
break;
}
}
} while (cod_info_w.global_gain + cod_info_w.scalefac_scale < 255);
if (gfc.noise_shaping_amp == 3) {
if (!bRefine) {
cod_info_w.assign(cod_info);
System$21.arraycopy(save_xrpow, 0, xrpow, 0, 576);
age = 0;
best_ggain_pass1 = cod_info_w.global_gain;
bRefine = true;
} else {
bEndOfSearch = true;
}
} else {
bEndOfSearch = true;
}
}
assert$21(cod_info.global_gain + cod_info.scalefac_scale <= 255);
if (gfp.VBR == VbrMode$21.vbr_rh || gfp.VBR == VbrMode$21.vbr_mtrh)
System$21.arraycopy(save_xrpow, 0, xrpow, 0, 576);
else if ((gfc.substep_shaping & 1) != 0)
trancate_smallspectrums(gfc, cod_info, l3_xmin, xrpow);
return best_noise_info.over_count;
};
this.iteration_finish_one = function(gfc, gr, ch) {
var l3_side = gfc.l3_side;
var cod_info = l3_side.tt[gr][ch];
tk.best_scalefac_store(gfc, gr, ch, l3_side);
if (gfc.use_best_huffman == 1)
tk.best_huffman_divide(gfc, cod_info);
rv.ResvAdjust(gfc, cod_info);
};
this.VBR_encode_granule = function(gfp, cod_info, l3_xmin, xrpow, ch, min_bits, max_bits) {
var gfc = gfp.internal_flags;
var bst_cod_info = new GrInfo_1();
var bst_xrpow = new_float$21(576);
var Max_bits = max_bits;
var real_bits = max_bits + 1;
var this_bits = (max_bits + min_bits) / 2;
var dbits, over, found = 0;
var sfb21_extra = gfc.sfb21_extra;
assert$21(Max_bits <= LameInternalFlags.MAX_BITS_PER_CHANNEL);
Arrays$21.fill(bst_cod_info.l3_enc, 0);
do {
assert$21(this_bits >= min_bits);
assert$21(this_bits <= max_bits);
assert$21(min_bits <= max_bits);
if (this_bits > Max_bits - 42)
gfc.sfb21_extra = false;
else
gfc.sfb21_extra = sfb21_extra;
over = outer_loop(gfp, cod_info, l3_xmin, xrpow, ch, this_bits);
if (over <= 0) {
found = 1;
real_bits = cod_info.part2_3_length;
bst_cod_info.assign(cod_info);
System$21.arraycopy(xrpow, 0, bst_xrpow, 0, 576);
max_bits = real_bits - 32;
dbits = max_bits - min_bits;
this_bits = (max_bits + min_bits) / 2;
} else {
min_bits = this_bits + 32;
dbits = max_bits - min_bits;
this_bits = (max_bits + min_bits) / 2;
if (found != 0) {
found = 2;
cod_info.assign(bst_cod_info);
System$21.arraycopy(bst_xrpow, 0, xrpow, 0, 576);
}
}
} while (dbits > 12);
gfc.sfb21_extra = sfb21_extra;
if (found == 2) {
System$21.arraycopy(bst_cod_info.l3_enc, 0, cod_info.l3_enc, 0, 576);
}
assert$21(cod_info.part2_3_length <= Max_bits);
};
this.get_framebits = function(gfp, frameBits) {
var gfc = gfp.internal_flags;
gfc.bitrate_index = gfc.VBR_min_bitrate;
var bitsPerFrame = bs.getframebits(gfp);
gfc.bitrate_index = 1;
bitsPerFrame = bs.getframebits(gfp);
for (var i = 1; i <= gfc.VBR_max_bitrate; i++) {
gfc.bitrate_index = i;
var mb = new MeanBits(bitsPerFrame);
frameBits[i] = rv.ResvFrameBegin(gfp, mb);
bitsPerFrame = mb.bits;
}
};
this.VBR_old_prepare = function(gfp, pe, ms_ener_ratio, ratio, l3_xmin, frameBits, min_bits, max_bits, bands) {
var gfc = gfp.internal_flags;
var masking_lower_db, adjust = 0;
var analog_silence = 1;
var bits = 0;
gfc.bitrate_index = gfc.VBR_max_bitrate;
var avg = rv.ResvFrameBegin(gfp, new MeanBits(0)) / gfc.mode_gr;
get_framebits(gfp, frameBits);
for (var gr = 0; gr < gfc.mode_gr; gr++) {
var mxb = qupvt.on_pe(gfp, pe, max_bits[gr], avg, gr, 0);
if (gfc.mode_ext == Encoder_1.MPG_MD_MS_LR) {
ms_convert(gfc.l3_side, gr);
qupvt.reduce_side(max_bits[gr], ms_ener_ratio[gr], avg, mxb);
}
for (var ch = 0; ch < gfc.channels_out; ++ch) {
var cod_info = gfc.l3_side.tt[gr][ch];
if (cod_info.block_type != Encoder_1.SHORT_TYPE) {
adjust = 1.28 / (1 + Math.exp(3.5 - pe[gr][ch] / 300)) - 0.05;
masking_lower_db = gfc.PSY.mask_adjust - adjust;
} else {
adjust = 2.56 / (1 + Math.exp(3.5 - pe[gr][ch] / 300)) - 0.14;
masking_lower_db = gfc.PSY.mask_adjust_short - adjust;
}
gfc.masking_lower = Math.pow(
10,
masking_lower_db * 0.1
);
init_outer_loop(gfc, cod_info);
bands[gr][ch] = qupvt.calc_xmin(
gfp,
ratio[gr][ch],
cod_info,
l3_xmin[gr][ch]
);
if (bands[gr][ch] != 0)
analog_silence = 0;
min_bits[gr][ch] = 126;
bits += max_bits[gr][ch];
}
}
for (var gr = 0; gr < gfc.mode_gr; gr++) {
for (var ch = 0; ch < gfc.channels_out; ch++) {
if (bits > frameBits[gfc.VBR_max_bitrate]) {
max_bits[gr][ch] *= frameBits[gfc.VBR_max_bitrate];
max_bits[gr][ch] /= bits;
}
if (min_bits[gr][ch] > max_bits[gr][ch])
min_bits[gr][ch] = max_bits[gr][ch];
}
}
return analog_silence;
};
this.bitpressure_strategy = function(gfc, l3_xmin, min_bits, max_bits) {
for (var gr = 0; gr < gfc.mode_gr; gr++) {
for (var ch = 0; ch < gfc.channels_out; ch++) {
var gi = gfc.l3_side.tt[gr][ch];
var pxmin = l3_xmin[gr][ch];
var pxminPos = 0;
for (var sfb = 0; sfb < gi.psy_lmax; sfb++)
pxmin[pxminPos++] *= 1 + 0.029 * sfb * sfb / Encoder_1.SBMAX_l / Encoder_1.SBMAX_l;
if (gi.block_type == Encoder_1.SHORT_TYPE) {
for (var sfb = gi.sfb_smin; sfb < Encoder_1.SBMAX_s; sfb++) {
pxmin[pxminPos++] *= 1 + 0.029 * sfb * sfb / Encoder_1.SBMAX_s / Encoder_1.SBMAX_s;
pxmin[pxminPos++] *= 1 + 0.029 * sfb * sfb / Encoder_1.SBMAX_s / Encoder_1.SBMAX_s;
pxmin[pxminPos++] *= 1 + 0.029 * sfb * sfb / Encoder_1.SBMAX_s / Encoder_1.SBMAX_s;
}
}
max_bits[gr][ch] = 0 | Math.max(
min_bits[gr][ch],
0.9 * max_bits[gr][ch]
);
}
}
};
this.VBR_new_prepare = function(gfp, pe, ratio, l3_xmin, frameBits, max_bits) {
var gfc = gfp.internal_flags;
var analog_silence = 1;
var avg = 0, bits = 0;
var maximum_framebits;
if (!gfp.free_format) {
gfc.bitrate_index = gfc.VBR_max_bitrate;
var mb = new MeanBits(avg);
rv.ResvFrameBegin(gfp, mb);
avg = mb.bits;
get_framebits(gfp, frameBits);
maximum_framebits = frameBits[gfc.VBR_max_bitrate];
} else {
gfc.bitrate_index = 0;
var mb = new MeanBits(avg);
maximum_framebits = rv.ResvFrameBegin(gfp, mb);
avg = mb.bits;
frameBits[0] = maximum_framebits;
}
for (var gr = 0; gr < gfc.mode_gr; gr++) {
qupvt.on_pe(gfp, pe, max_bits[gr], avg, gr, 0);
if (gfc.mode_ext == Encoder_1.MPG_MD_MS_LR) {
ms_convert(gfc.l3_side, gr);
}
for (var ch = 0; ch < gfc.channels_out; ++ch) {
var cod_info = gfc.l3_side.tt[gr][ch];
gfc.masking_lower = Math.pow(
10,
gfc.PSY.mask_adjust * 0.1
);
init_outer_loop(gfc, cod_info);
if (0 != qupvt.calc_xmin(
gfp,
ratio[gr][ch],
cod_info,
l3_xmin[gr][ch]
))
analog_silence = 0;
bits += max_bits[gr][ch];
}
}
for (var gr = 0; gr < gfc.mode_gr; gr++) {
for (var ch = 0; ch < gfc.channels_out; ch++) {
if (bits > maximum_framebits) {
max_bits[gr][ch] *= maximum_framebits;
max_bits[gr][ch] /= bits;
}
}
}
return analog_silence;
};
this.calc_target_bits = function(gfp, pe, ms_ener_ratio, targ_bits, analog_silence_bits, max_frame_bits) {
var gfc = gfp.internal_flags;
var l3_side = gfc.l3_side;
var res_factor;
var gr, ch, totbits, mean_bits = 0;
gfc.bitrate_index = gfc.VBR_max_bitrate;
var mb = new MeanBits(mean_bits);
max_frame_bits[0] = rv.ResvFrameBegin(gfp, mb);
mean_bits = mb.bits;
gfc.bitrate_index = 1;
mean_bits = bs.getframebits(gfp) - gfc.sideinfo_len * 8;
analog_silence_bits[0] = mean_bits / (gfc.mode_gr * gfc.channels_out);
mean_bits = gfp.VBR_mean_bitrate_kbps * gfp.framesize * 1e3;
if ((gfc.substep_shaping & 1) != 0)
mean_bits *= 1.09;
mean_bits /= gfp.out_samplerate;
mean_bits -= gfc.sideinfo_len * 8;
mean_bits /= gfc.mode_gr * gfc.channels_out;
res_factor = 0.93 + 0.07 * (11 - gfp.compression_ratio) / (11 - 5.5);
if (res_factor < 0.9)
res_factor = 0.9;
if (res_factor > 1)
res_factor = 1;
for (gr = 0; gr < gfc.mode_gr; gr++) {
var sum = 0;
for (ch = 0; ch < gfc.channels_out; ch++) {
targ_bits[gr][ch] = int(res_factor * mean_bits);
if (pe[gr][ch] > 700) {
var add_bits = int((pe[gr][ch] - 700) / 1.4);
var cod_info = l3_side.tt[gr][ch];
targ_bits[gr][ch] = int(res_factor * mean_bits);
if (cod_info.block_type == Encoder_1.SHORT_TYPE) {
if (add_bits < mean_bits / 2)
add_bits = mean_bits / 2;
}
if (add_bits > mean_bits * 3 / 2)
add_bits = mean_bits * 3 / 2;
else if (add_bits < 0)
add_bits = 0;
targ_bits[gr][ch] += add_bits;
}
if (targ_bits[gr][ch] > LameInternalFlags.MAX_BITS_PER_CHANNEL) {
targ_bits[gr][ch] = LameInternalFlags.MAX_BITS_PER_CHANNEL;
}
sum += targ_bits[gr][ch];
}
if (sum > LameInternalFlags.MAX_BITS_PER_GRANULE) {
for (ch = 0; ch < gfc.channels_out; ++ch) {
targ_bits[gr][ch] *= LameInternalFlags.MAX_BITS_PER_GRANULE;
targ_bits[gr][ch] /= sum;
}
}
}
if (gfc.mode_ext == Encoder_1.MPG_MD_MS_LR)
for (gr = 0; gr < gfc.mode_gr; gr++) {
qupvt.reduce_side(
targ_bits[gr],
ms_ener_ratio[gr],
mean_bits * gfc.channels_out,
LameInternalFlags.MAX_BITS_PER_GRANULE
);
}
totbits = 0;
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
if (targ_bits[gr][ch] > LameInternalFlags.MAX_BITS_PER_CHANNEL)
targ_bits[gr][ch] = LameInternalFlags.MAX_BITS_PER_CHANNEL;
totbits += targ_bits[gr][ch];
}
}
if (totbits > max_frame_bits[0]) {
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
targ_bits[gr][ch] *= max_frame_bits[0];
targ_bits[gr][ch] /= totbits;
}
}
}
};
}
var Quantize_1 = Quantize$1;
var assert$23 = common.assert;
function Reservoir$1() {
var bs;
this.setModules = function(_bs) {
bs = _bs;
};
this.ResvFrameBegin = function(gfp, mean_bits) {
var gfc = gfp.internal_flags;
var maxmp3buf;
var l3_side = gfc.l3_side;
var frameLength = bs.getframebits(gfp);
mean_bits.bits = (frameLength - gfc.sideinfo_len * 8) / gfc.mode_gr;
var resvLimit = 8 * 256 * gfc.mode_gr - 8;
if (gfp.brate > 320) {
maxmp3buf = 8 * int(gfp.brate * 1e3 / (gfp.out_samplerate / 1152) / 8 + 0.5);
} else {
maxmp3buf = 8 * 1440;
if (gfp.strict_ISO) {
maxmp3buf = 8 * int(32e4 / (gfp.out_samplerate / 1152) / 8 + 0.5);
}
}
gfc.ResvMax = maxmp3buf - frameLength;
if (gfc.ResvMax > resvLimit)
gfc.ResvMax = resvLimit;
if (gfc.ResvMax < 0 || gfp.disable_reservoir)
gfc.ResvMax = 0;
var fullFrameBits = mean_bits.bits * gfc.mode_gr + Math.min(gfc.ResvSize, gfc.ResvMax);
if (fullFrameBits > maxmp3buf)
fullFrameBits = maxmp3buf;
assert$23(0 == gfc.ResvMax % 8);
assert$23(gfc.ResvMax >= 0);
l3_side.resvDrain_pre = 0;
if (gfc.pinfo != null) {
gfc.pinfo.mean_bits = mean_bits.bits / 2;
gfc.pinfo.resvsize = gfc.ResvSize;
}
return fullFrameBits;
};
this.ResvMaxBits = function(gfp, mean_bits, targ_bits, cbr) {
var gfc = gfp.internal_flags;
var add_bits;
var ResvSize = gfc.ResvSize, ResvMax = gfc.ResvMax;
if (cbr != 0)
ResvSize += mean_bits;
if ((gfc.substep_shaping & 1) != 0)
ResvMax *= 0.9;
targ_bits.bits = mean_bits;
if (ResvSize * 10 > ResvMax * 9) {
add_bits = ResvSize - ResvMax * 9 / 10;
targ_bits.bits += add_bits;
gfc.substep_shaping |= 128;
} else {
add_bits = 0;
gfc.substep_shaping &= 127;
if (!gfp.disable_reservoir && 0 == (gfc.substep_shaping & 1))
targ_bits.bits -= 0.1 * mean_bits;
}
var extra_bits = ResvSize < gfc.ResvMax * 6 / 10 ? ResvSize : gfc.ResvMax * 6 / 10;
extra_bits -= add_bits;
if (extra_bits < 0)
extra_bits = 0;
return extra_bits;
};
this.ResvAdjust = function(gfc, gi) {
gfc.ResvSize -= gi.part2_3_length + gi.part2_length;
};
this.ResvFrameEnd = function(gfc, mean_bits) {
var over_bits;
var l3_side = gfc.l3_side;
gfc.ResvSize += mean_bits * gfc.mode_gr;
var stuffingBits = 0;
l3_side.resvDrain_post = 0;
l3_side.resvDrain_pre = 0;
if ((over_bits = gfc.ResvSize % 8) != 0)
stuffingBits += over_bits;
over_bits = gfc.ResvSize - stuffingBits - gfc.ResvMax;
if (over_bits > 0) {
assert$23(0 == over_bits % 8);
assert$23(over_bits >= 0);
stuffingBits += over_bits;
}
{
var mdb_bytes = Math.min(l3_side.main_data_begin * 8, stuffingBits) / 8;
l3_side.resvDrain_pre += 8 * mdb_bytes;
stuffingBits -= 8 * mdb_bytes;
gfc.ResvSize -= 8 * mdb_bytes;
l3_side.main_data_begin -= mdb_bytes;
}
l3_side.resvDrain_post += stuffingBits;
gfc.ResvSize -= stuffingBits;
};
}
var Reservoir_1 = Reservoir$1;
function Version() {
var LAME_URL = "http://www.mp3dev.org/";
var LAME_MAJOR_VERSION = 3;
var LAME_MINOR_VERSION = 98;
var LAME_PATCH_VERSION = 4;
var PSY_MAJOR_VERSION = 0;
var PSY_MINOR_VERSION = 93;
this.getLameVersion = function() {
return LAME_MAJOR_VERSION + "." + LAME_MINOR_VERSION + "." + LAME_PATCH_VERSION;
};
this.getLameShortVersion = function() {
return LAME_MAJOR_VERSION + "." + LAME_MINOR_VERSION + "." + LAME_PATCH_VERSION;
};
this.getLameVeryShortVersion = function() {
return "LAME" + LAME_MAJOR_VERSION + "." + LAME_MINOR_VERSION + "r";
};
this.getPsyVersion = function() {
return PSY_MAJOR_VERSION + "." + PSY_MINOR_VERSION;
};
this.getLameUrl = function() {
return LAME_URL;
};
this.getLameOsBitness = function() {
return "32bits";
};
}
var Version_1 = Version;
var System$22 = common.System;
var VbrMode$22 = common.VbrMode;
var ShortBlock$22 = common.ShortBlock;
var Arrays$22 = common.Arrays;
var new_byte$22 = common.new_byte;
var assert$24 = common.assert;
VBRTag.NUMTOCENTRIES = 100;
VBRTag.MAXFRAMESIZE = 2880;
function VBRTag() {
var lame;
var bs;
var v;
this.setModules = function(_lame, _bs, _v) {
lame = _lame;
bs = _bs;
v = _v;
};
var FRAMES_FLAG = 1;
var BYTES_FLAG = 2;
var TOC_FLAG = 4;
var VBR_SCALE_FLAG = 8;
var NUMTOCENTRIES = VBRTag.NUMTOCENTRIES;
var MAXFRAMESIZE = VBRTag.MAXFRAMESIZE;
var VBRHEADERSIZE = NUMTOCENTRIES + 4 + 4 + 4 + 4 + 4;
var LAMEHEADERSIZE = VBRHEADERSIZE + 9 + 1 + 1 + 8 + 1 + 1 + 3 + 1 + 1 + 2 + 4 + 2 + 2;
var XING_BITRATE1 = 128;
var XING_BITRATE2 = 64;
var XING_BITRATE25 = 32;
var ISO_8859_1 = null;
var VBRTag0 = "Xing";
var VBRTag1 = "Info";
var crc16Lookup = [
0,
49345,
49537,
320,
49921,
960,
640,
49729,
50689,
1728,
1920,
51009,
1280,
50625,
50305,
1088,
52225,
3264,
3456,
52545,
3840,
53185,
52865,
3648,
2560,
51905,
52097,
2880,
51457,
2496,
2176,
51265,
55297,
6336,
6528,
55617,
6912,
56257,
55937,
6720,
7680,
57025,
57217,
8e3,
56577,
7616,
7296,
56385,
5120,
54465,
54657,
5440,
55041,
6080,
5760,
54849,
53761,
4800,
4992,
54081,
4352,
53697,
53377,
4160,
61441,
12480,
12672,
61761,
13056,
62401,
62081,
12864,
13824,
63169,
63361,
14144,
62721,
13760,
13440,
62529,
15360,
64705,
64897,
15680,
65281,
16320,
16e3,
65089,
64001,
15040,
15232,
64321,
14592,
63937,
63617,
14400,
10240,
59585,
59777,
10560,
60161,
11200,
10880,
59969,
60929,
11968,
12160,
61249,
11520,
60865,
60545,
11328,
58369,
9408,
9600,
58689,
9984,
59329,
59009,
9792,
8704,
58049,
58241,
9024,
57601,
8640,
8320,
57409,
40961,
24768,
24960,
41281,
25344,
41921,
41601,
25152,
26112,
42689,
42881,
26432,
42241,
26048,
25728,
42049,
27648,
44225,
44417,
27968,
44801,
28608,
28288,
44609,
43521,
27328,
27520,
43841,
26880,
43457,
43137,
26688,
30720,
47297,
47489,
31040,
47873,
31680,
31360,
47681,
48641,
32448,
32640,
48961,
32e3,
48577,
48257,
31808,
46081,
29888,
30080,
46401,
30464,
47041,
46721,
30272,
29184,
45761,
45953,
29504,
45313,
29120,
28800,
45121,
20480,
37057,
37249,
20800,
37633,
21440,
21120,
37441,
38401,
22208,
22400,
38721,
21760,
38337,
38017,
21568,
39937,
23744,
23936,
40257,
24320,
40897,
40577,
24128,
23040,
39617,
39809,
23360,
39169,
22976,
22656,
38977,
34817,
18624,
18816,
35137,
19200,
35777,
35457,
19008,
19968,
36545,
36737,
20288,
36097,
19904,
19584,
35905,
17408,
33985,
34177,
17728,
34561,
18368,
18048,
34369,
33281,
17088,
17280,
33601,
16640,
33217,
32897,
16448
];
function addVbr(v2, bitrate) {
v2.nVbrNumFrames++;
v2.sum += bitrate;
v2.seen++;
if (v2.seen < v2.want) {
return;
}
if (v2.pos < v2.size) {
v2.bag[v2.pos] = v2.sum;
v2.pos++;
v2.seen = 0;
}
if (v2.pos == v2.size) {
for (var i = 1; i < v2.size; i += 2) {
v2.bag[i / 2] = v2.bag[i];
}
v2.want *= 2;
v2.pos /= 2;
}
}
function xingSeekTable(v2, t) {
if (v2.pos <= 0)
return;
for (var i = 1; i < NUMTOCENTRIES; ++i) {
var j = i / NUMTOCENTRIES, act, sum;
var indx = 0 | Math.floor(j * v2.pos);
if (indx > v2.pos - 1)
indx = v2.pos - 1;
act = v2.bag[indx];
sum = v2.sum;
var seek_point = 0 | 256 * act / sum;
if (seek_point > 255)
seek_point = 255;
t[i] = 255 & seek_point;
}
}
this.addVbrFrame = function(gfp) {
var gfc = gfp.internal_flags;
var kbps = Tables.bitrate_table[gfp.version][gfc.bitrate_index];
assert$24(gfc.VBR_seek_table.bag != null);
addVbr(gfc.VBR_seek_table, kbps);
};
function extractInteger(buf, bufPos) {
var x = buf[bufPos + 0] & 255;
x <<= 8;
x |= buf[bufPos + 1] & 255;
x <<= 8;
x |= buf[bufPos + 2] & 255;
x <<= 8;
x |= buf[bufPos + 3] & 255;
return x;
}
function createInteger(buf, bufPos, value) {
buf[bufPos + 0] = 255 & (value >> 24 & 255);
buf[bufPos + 1] = 255 & (value >> 16 & 255);
buf[bufPos + 2] = 255 & (value >> 8 & 255);
buf[bufPos + 3] = 255 & (value & 255);
}
function createShort(buf, bufPos, value) {
buf[bufPos + 0] = 255 & (value >> 8 & 255);
buf[bufPos + 1] = 255 & (value & 255);
}
function isVbrTag(buf, bufPos) {
return new String(buf, bufPos, VBRTag0.length(), ISO_8859_1).equals(VBRTag0) || new String(buf, bufPos, VBRTag1.length(), ISO_8859_1).equals(VBRTag1);
}
function shiftInBitsValue(x, n, v2) {
return 255 & (x << n | v2 & ~(-1 << n));
}
function setLameTagFrameHeader(gfp, buffer) {
var gfc = gfp.internal_flags;
buffer[0] = shiftInBitsValue(buffer[0], 8, 255);
buffer[1] = shiftInBitsValue(buffer[1], 3, 7);
buffer[1] = shiftInBitsValue(
buffer[1],
1,
gfp.out_samplerate < 16e3 ? 0 : 1
);
buffer[1] = shiftInBitsValue(buffer[1], 1, gfp.version);
buffer[1] = shiftInBitsValue(buffer[1], 2, 4 - 3);
buffer[1] = shiftInBitsValue(buffer[1], 1, !gfp.error_protection ? 1 : 0);
buffer[2] = shiftInBitsValue(buffer[2], 4, gfc.bitrate_index);
buffer[2] = shiftInBitsValue(buffer[2], 2, gfc.samplerate_index);
buffer[2] = shiftInBitsValue(buffer[2], 1, 0);
buffer[2] = shiftInBitsValue(buffer[2], 1, gfp.extension);
buffer[3] = shiftInBitsValue(buffer[3], 2, gfp.mode.ordinal());
buffer[3] = shiftInBitsValue(buffer[3], 2, gfc.mode_ext);
buffer[3] = shiftInBitsValue(buffer[3], 1, gfp.copyright);
buffer[3] = shiftInBitsValue(buffer[3], 1, gfp.original);
buffer[3] = shiftInBitsValue(buffer[3], 2, gfp.emphasis);
buffer[0] = 255;
var abyte = 255 & (buffer[1] & 241);
var bitrate;
if (1 == gfp.version) {
bitrate = XING_BITRATE1;
} else {
if (gfp.out_samplerate < 16e3)
bitrate = XING_BITRATE25;
else
bitrate = XING_BITRATE2;
}
if (gfp.VBR == VbrMode$22.vbr_off)
bitrate = gfp.brate;
var bbyte;
if (gfp.free_format)
bbyte = 0;
else
bbyte = 255 & 16 * lame.BitrateIndex(
bitrate,
gfp.version,
gfp.out_samplerate
);
if (gfp.version == 1) {
buffer[1] = 255 & (abyte | 10);
abyte = 255 & (buffer[2] & 13);
buffer[2] = 255 & (bbyte | abyte);
} else {
buffer[1] = 255 & (abyte | 2);
abyte = 255 & (buffer[2] & 13);
buffer[2] = 255 & (bbyte | abyte);
}
}
this.getVbrTag = function(buf) {
var pTagData = new VBRTagData();
var bufPos = 0;
pTagData.flags = 0;
var hId = buf[bufPos + 1] >> 3 & 1;
var hSrIndex = buf[bufPos + 2] >> 2 & 3;
var hMode = buf[bufPos + 3] >> 6 & 3;
var hBitrate = buf[bufPos + 2] >> 4 & 15;
hBitrate = Tables.bitrate_table[hId][hBitrate];
if (buf[bufPos + 1] >> 4 == 14)
pTagData.samprate = Tables.samplerate_table[2][hSrIndex];
else
pTagData.samprate = Tables.samplerate_table[hId][hSrIndex];
if (hId != 0) {
if (hMode != 3)
bufPos += 32 + 4;
else
bufPos += 17 + 4;
} else {
if (hMode != 3)
bufPos += 17 + 4;
else
bufPos += 9 + 4;
}
if (!isVbrTag(buf, bufPos))
return null;
bufPos += 4;
pTagData.hId = hId;
var head_flags = pTagData.flags = extractInteger(buf, bufPos);
bufPos += 4;
if ((head_flags & FRAMES_FLAG) != 0) {
pTagData.frames = extractInteger(buf, bufPos);
bufPos += 4;
}
if ((head_flags & BYTES_FLAG) != 0) {
pTagData.bytes = extractInteger(buf, bufPos);
bufPos += 4;
}
if ((head_flags & TOC_FLAG) != 0) {
if (pTagData.toc != null) {
for (var i = 0; i < NUMTOCENTRIES; i++)
pTagData.toc[i] = buf[bufPos + i];
}
bufPos += NUMTOCENTRIES;
}
pTagData.vbrScale = -1;
if ((head_flags & VBR_SCALE_FLAG) != 0) {
pTagData.vbrScale = extractInteger(buf, bufPos);
bufPos += 4;
}
pTagData.headersize = (hId + 1) * 72e3 * hBitrate / pTagData.samprate;
bufPos += 21;
var encDelay = buf[bufPos + 0] << 4;
encDelay += buf[bufPos + 1] >> 4;
var encPadding = (buf[bufPos + 1] & 15) << 8;
encPadding += buf[bufPos + 2] & 255;
if (encDelay < 0 || encDelay > 3e3)
encDelay = -1;
if (encPadding < 0 || encPadding > 3e3)
encPadding = -1;
pTagData.encDelay = encDelay;
pTagData.encPadding = encPadding;
return pTagData;
};
this.InitVbrTag = function(gfp) {
var gfc = gfp.internal_flags;
var kbps_header;
if (1 == gfp.version) {
kbps_header = XING_BITRATE1;
} else {
if (gfp.out_samplerate < 16e3)
kbps_header = XING_BITRATE25;
else
kbps_header = XING_BITRATE2;
}
if (gfp.VBR == VbrMode$22.vbr_off)
kbps_header = gfp.brate;
var totalFrameSize = (gfp.version + 1) * 72e3 * kbps_header / gfp.out_samplerate;
var headerSize = gfc.sideinfo_len + LAMEHEADERSIZE;
gfc.VBR_seek_table.TotalFrameSize = totalFrameSize;
if (totalFrameSize < headerSize || totalFrameSize > MAXFRAMESIZE) {
gfp.bWriteVbrTag = false;
return;
}
gfc.VBR_seek_table.nVbrNumFrames = 0;
gfc.VBR_seek_table.nBytesWritten = 0;
gfc.VBR_seek_table.sum = 0;
gfc.VBR_seek_table.seen = 0;
gfc.VBR_seek_table.want = 1;
gfc.VBR_seek_table.pos = 0;
if (gfc.VBR_seek_table.bag == null) {
gfc.VBR_seek_table.bag = new int[400]();
gfc.VBR_seek_table.size = 400;
}
var buffer = new_byte$22(MAXFRAMESIZE);
setLameTagFrameHeader(gfp, buffer);
var n = gfc.VBR_seek_table.TotalFrameSize;
for (var i = 0; i < n; ++i) {
bs.add_dummy_byte(gfp, buffer[i] & 255, 1);
}
};
function crcUpdateLookup(value, crc) {
var tmp = crc ^ value;
crc = crc >> 8 ^ crc16Lookup[tmp & 255];
return crc;
}
this.updateMusicCRC = function(crc, buffer, bufferPos, size) {
for (var i = 0; i < size; ++i)
crc[0] = crcUpdateLookup(buffer[bufferPos + i], crc[0]);
};
function putLameVBR(gfp, musicLength, streamBuffer, streamBufferPos, crc) {
var gfc = gfp.internal_flags;
var bytesWritten = 0;
var encDelay = gfp.encoder_delay;
var encPadding = gfp.encoder_padding;
var quality = 100 - 10 * gfp.VBR_q - gfp.quality;
var version = v.getLameVeryShortVersion();
var vbr;
var revision = 0;
var revMethod;
var vbrTypeTranslator = [1, 5, 3, 2, 4, 0, 3];
var lowpass = 0 | (gfp.lowpassfreq / 100 + 0.5 > 255 ? 255 : gfp.lowpassfreq / 100 + 0.5);
var peakSignalAmplitude = 0;
var radioReplayGain = 0;
var audiophileReplayGain = 0;
var noiseShaping = gfp.internal_flags.noise_shaping;
var stereoMode = 0;
var nonOptimal = 0;
var sourceFreq = 0;
var misc = 0;
var musicCRC = 0;
var expNPsyTune = (gfp.exp_nspsytune & 1) != 0;
var safeJoint = (gfp.exp_nspsytune & 2) != 0;
var noGapMore = false;
var noGapPrevious = false;
var noGapCount = gfp.internal_flags.nogap_total;
var noGapCurr = gfp.internal_flags.nogap_current;
var athType = gfp.ATHtype;
var flags = 0;
var abrBitrate;
switch (gfp.VBR) {
case vbr_abr:
abrBitrate = gfp.VBR_mean_bitrate_kbps;
break;
case vbr_off:
abrBitrate = gfp.brate;
break;
default:
abrBitrate = gfp.VBR_min_bitrate_kbps;
}
if (gfp.VBR.ordinal() < vbrTypeTranslator.length)
vbr = vbrTypeTranslator[gfp.VBR.ordinal()];
else
vbr = 0;
revMethod = 16 * revision + vbr;
if (gfc.findReplayGain) {
if (gfc.RadioGain > 510)
gfc.RadioGain = 510;
if (gfc.RadioGain < -510)
gfc.RadioGain = -510;
radioReplayGain = 8192;
radioReplayGain |= 3072;
if (gfc.RadioGain >= 0) {
radioReplayGain |= gfc.RadioGain;
} else {
radioReplayGain |= 512;
radioReplayGain |= -gfc.RadioGain;
}
}
if (gfc.findPeakSample)
peakSignalAmplitude = Math.abs(0 | gfc.PeakSample / 32767 * Math.pow(2, 23) + 0.5);
if (noGapCount != -1) {
if (noGapCurr > 0)
noGapPrevious = true;
if (noGapCurr < noGapCount - 1)
noGapMore = true;
}
flags = athType + ((expNPsyTune ? 1 : 0) << 4) + ((safeJoint ? 1 : 0) << 5) + ((noGapMore ? 1 : 0) << 6) + ((noGapPrevious ? 1 : 0) << 7);
if (quality < 0)
quality = 0;
switch (gfp.mode) {
case MONO:
stereoMode = 0;
break;
case STEREO:
stereoMode = 1;
break;
case DUAL_CHANNEL:
stereoMode = 2;
break;
case JOINT_STEREO:
if (gfp.force_ms)
stereoMode = 4;
else
stereoMode = 3;
break;
case NOT_SET:
default:
stereoMode = 7;
break;
}
if (gfp.in_samplerate <= 32e3)
sourceFreq = 0;
else if (gfp.in_samplerate == 48e3)
sourceFreq = 2;
else if (gfp.in_samplerate > 48e3)
sourceFreq = 3;
else {
sourceFreq = 1;
}
if (gfp.short_blocks == ShortBlock$22.short_block_forced || gfp.short_blocks == ShortBlock$22.short_block_dispensed || gfp.lowpassfreq == -1 && gfp.highpassfreq == -1 || /* "-k" */
gfp.scale_left < gfp.scale_right || gfp.scale_left > gfp.scale_right || gfp.disable_reservoir && gfp.brate < 320 || gfp.noATH || gfp.ATHonly || athType == 0 || gfp.in_samplerate <= 32e3)
nonOptimal = 1;
misc = noiseShaping + (stereoMode << 2) + (nonOptimal << 5) + (sourceFreq << 6);
musicCRC = gfc.nMusicCRC;
createInteger(streamBuffer, streamBufferPos + bytesWritten, quality);
bytesWritten += 4;
for (var j = 0; j < 9; j++) {
streamBuffer[streamBufferPos + bytesWritten + j] = 255 & version.charAt(j);
}
bytesWritten += 9;
streamBuffer[streamBufferPos + bytesWritten] = 255 & revMethod;
bytesWritten++;
streamBuffer[streamBufferPos + bytesWritten] = 255 & lowpass;
bytesWritten++;
createInteger(
streamBuffer,
streamBufferPos + bytesWritten,
peakSignalAmplitude
);
bytesWritten += 4;
createShort(
streamBuffer,
streamBufferPos + bytesWritten,
radioReplayGain
);
bytesWritten += 2;
createShort(
streamBuffer,
streamBufferPos + bytesWritten,
audiophileReplayGain
);
bytesWritten += 2;
streamBuffer[streamBufferPos + bytesWritten] = 255 & flags;
bytesWritten++;
if (abrBitrate >= 255)
streamBuffer[streamBufferPos + bytesWritten] = 255;
else
streamBuffer[streamBufferPos + bytesWritten] = 255 & abrBitrate;
bytesWritten++;
streamBuffer[streamBufferPos + bytesWritten] = 255 & encDelay >> 4;
streamBuffer[streamBufferPos + bytesWritten + 1] = 255 & (encDelay << 4) + (encPadding >> 8);
streamBuffer[streamBufferPos + bytesWritten + 2] = 255 & encPadding;
bytesWritten += 3;
streamBuffer[streamBufferPos + bytesWritten] = 255 & misc;
bytesWritten++;
streamBuffer[streamBufferPos + bytesWritten++] = 0;
createShort(streamBuffer, streamBufferPos + bytesWritten, gfp.preset);
bytesWritten += 2;
createInteger(streamBuffer, streamBufferPos + bytesWritten, musicLength);
bytesWritten += 4;
createShort(streamBuffer, streamBufferPos + bytesWritten, musicCRC);
bytesWritten += 2;
for (var i = 0; i < bytesWritten; i++)
crc = crcUpdateLookup(streamBuffer[streamBufferPos + i], crc);
createShort(streamBuffer, streamBufferPos + bytesWritten, crc);
bytesWritten += 2;
return bytesWritten;
}
function skipId3v2(fpStream) {
fpStream.seek(0);
var id3v2Header = new_byte$22(10);
fpStream.readFully(id3v2Header);
var id3v2TagSize;
if (!new String(id3v2Header, "ISO-8859-1").startsWith("ID3")) {
id3v2TagSize = ((id3v2Header[6] & 127) << 21 | (id3v2Header[7] & 127) << 14 | (id3v2Header[8] & 127) << 7 | id3v2Header[9] & 127) + id3v2Header.length;
} else {
id3v2TagSize = 0;
}
return id3v2TagSize;
}
this.getLameTagFrame = function(gfp, buffer) {
var gfc = gfp.internal_flags;
if (!gfp.bWriteVbrTag) {
return 0;
}
if (gfc.Class_ID != Lame.LAME_ID) {
return 0;
}
if (gfc.VBR_seek_table.pos <= 0) {
return 0;
}
if (buffer.length < gfc.VBR_seek_table.TotalFrameSize) {
return gfc.VBR_seek_table.TotalFrameSize;
}
Arrays$22.fill(buffer, 0, gfc.VBR_seek_table.TotalFrameSize, 0);
setLameTagFrameHeader(gfp, buffer);
var toc = new_byte$22(NUMTOCENTRIES);
if (gfp.free_format) {
for (var i = 1; i < NUMTOCENTRIES; ++i)
toc[i] = 255 & 255 * i / 100;
} else {
xingSeekTable(gfc.VBR_seek_table, toc);
}
var streamIndex = gfc.sideinfo_len;
if (gfp.error_protection)
streamIndex -= 2;
if (gfp.VBR == VbrMode$22.vbr_off) {
buffer[streamIndex++] = 255 & VBRTag1.charAt(0);
buffer[streamIndex++] = 255 & VBRTag1.charAt(1);
buffer[streamIndex++] = 255 & VBRTag1.charAt(2);
buffer[streamIndex++] = 255 & VBRTag1.charAt(3);
} else {
buffer[streamIndex++] = 255 & VBRTag0.charAt(0);
buffer[streamIndex++] = 255 & VBRTag0.charAt(1);
buffer[streamIndex++] = 255 & VBRTag0.charAt(2);
buffer[streamIndex++] = 255 & VBRTag0.charAt(3);
}
createInteger(buffer, streamIndex, FRAMES_FLAG + BYTES_FLAG + TOC_FLAG + VBR_SCALE_FLAG);
streamIndex += 4;
createInteger(buffer, streamIndex, gfc.VBR_seek_table.nVbrNumFrames);
streamIndex += 4;
var streamSize = gfc.VBR_seek_table.nBytesWritten + gfc.VBR_seek_table.TotalFrameSize;
createInteger(buffer, streamIndex, 0 | streamSize);
streamIndex += 4;
System$22.arraycopy(toc, 0, buffer, streamIndex, toc.length);
streamIndex += toc.length;
if (gfp.error_protection) {
bs.CRC_writeheader(gfc, buffer);
}
var crc = 0;
for (var i = 0; i < streamIndex; i++)
crc = crcUpdateLookup(buffer[i], crc);
streamIndex += putLameVBR(gfp, streamSize, buffer, streamIndex, crc);
return gfc.VBR_seek_table.TotalFrameSize;
};
this.putVbrTag = function(gfp, stream) {
var gfc = gfp.internal_flags;
if (gfc.VBR_seek_table.pos <= 0)
return -1;
stream.seek(stream.length());
if (stream.length() == 0)
return -1;
var id3v2TagSize = skipId3v2(stream);
stream.seek(id3v2TagSize);
var buffer = new_byte$22(MAXFRAMESIZE);
var bytes = getLameTagFrame(gfp, buffer);
if (bytes > buffer.length) {
return -1;
}
if (bytes < 1) {
return 0;
}
stream.write(buffer, 0, bytes);
return 0;
};
}
var VBRTag_1 = VBRTag;
var new_byte = common.new_byte;
var assert = common.assert;
Lame = Lame_1;
Presets = Presets_1;
GainAnalysis = GainAnalysis_1;
QuantizePVT = QuantizePVT_1;
Quantize = Quantize_1;
Takehiro = Takehiro_1;
Reservoir = Reservoir_1;
MPEGMode = MPEGMode_1;
BitStream = BitStream_1;
function GetAudio() {
var parse;
var mpg;
this.setModules = function(parse2, mpg2) {
parse = parse2;
mpg = mpg2;
};
}
function Parse() {
var ver;
var id3;
var pre;
this.setModules = function(ver2, id32, pre2) {
ver = ver2;
id3 = id32;
pre = pre2;
};
}
function MPGLib() {
}
function ID3Tag() {
var bits;
var ver;
this.setModules = function(_bits, _ver) {
bits = _bits;
ver = _ver;
};
}
function Mp3Encoder(channels, samplerate, kbps) {
if (arguments.length != 3) {
console.error("WARN: Mp3Encoder(channels, samplerate, kbps) not specified");
channels = 1;
samplerate = 44100;
kbps = 128;
}
var lame = new Lame();
var gaud = new GetAudio();
var ga = new GainAnalysis();
var bs = new BitStream();
var p = new Presets();
var qupvt = new QuantizePVT();
var qu = new Quantize();
var vbr = new VBRTag_1();
var ver = new Version_1();
var id3 = new ID3Tag();
var rv = new Reservoir();
var tak = new Takehiro();
var parse = new Parse();
var mpg = new MPGLib();
lame.setModules(ga, bs, p, qupvt, qu, vbr, ver, id3, mpg);
bs.setModules(ga, mpg, ver, vbr);
id3.setModules(bs, ver);
p.setModules(lame);
qu.setModules(bs, rv, qupvt, tak);
qupvt.setModules(tak, rv, lame.enc.psy);
rv.setModules(bs);
tak.setModules(qupvt);
vbr.setModules(lame, bs, ver);
gaud.setModules(parse, mpg);
parse.setModules(ver, id3, p);
var gfp = lame.lame_init();
gfp.num_channels = channels;
gfp.in_samplerate = samplerate;
gfp.brate = kbps;
gfp.mode = MPEGMode.STEREO;
gfp.quality = 3;
gfp.bWriteVbrTag = false;
gfp.disable_reservoir = true;
gfp.write_id3tag_automatic = false;
var retcode = lame.lame_init_params(gfp);
assert(0 == retcode);
var maxSamples = 1152;
var mp3buf_size = 0 | 1.25 * maxSamples + 7200;
var mp3buf = new_byte(mp3buf_size);
this.encodeBuffer = function(left, right) {
if (channels == 1) {
right = left;
}
assert(left.length == right.length);
if (left.length > maxSamples) {
maxSamples = left.length;
mp3buf_size = 0 | 1.25 * maxSamples + 7200;
mp3buf = new_byte(mp3buf_size);
}
var _sz = lame.lame_encode_buffer(gfp, left, right, left.length, mp3buf, 0, mp3buf_size);
return new Int8Array(mp3buf.subarray(0, _sz));
};
this.flush = function() {
var _sz = lame.lame_encode_flush(gfp, mp3buf, 0, mp3buf_size);
return new Int8Array(mp3buf.subarray(0, _sz));
};
}
function WavHeader() {
this.dataOffset = 0;
this.dataLen = 0;
this.channels = 0;
this.sampleRate = 0;
}
function fourccToInt(fourcc) {
return fourcc.charCodeAt(0) << 24 | fourcc.charCodeAt(1) << 16 | fourcc.charCodeAt(2) << 8 | fourcc.charCodeAt(3);
}
WavHeader.RIFF = fourccToInt("RIFF");
WavHeader.WAVE = fourccToInt("WAVE");
WavHeader.fmt_ = fourccToInt("fmt ");
WavHeader.data = fourccToInt("data");
WavHeader.readHeader = function(dataView) {
var w = new WavHeader();
var header = dataView.getUint32(0, false);
if (WavHeader.RIFF != header) {
return;
}
var fileLen = dataView.getUint32(4, true);
if (WavHeader.WAVE != dataView.getUint32(8, false)) {
return;
}
if (WavHeader.fmt_ != dataView.getUint32(12, false)) {
return;
}
var fmtLen = dataView.getUint32(16, true);
var pos = 16 + 4;
switch (fmtLen) {
case 16:
case 18:
w.channels = dataView.getUint16(pos + 2, true);
w.sampleRate = dataView.getUint32(pos + 4, true);
break;
default:
throw "extended fmt chunk not implemented";
}
pos += fmtLen;
var data = WavHeader.data;
var len = 0;
while (data != header) {
header = dataView.getUint32(pos, false);
len = dataView.getUint32(pos + 4, true);
if (data == header) {
break;
}
pos += len + 8;
}
w.dataLen = len;
w.dataOffset = pos + 8;
return w;
};
var Mp3Encoder_1 = Mp3Encoder;
var classCallCheck = function(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var createClass = function() {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor)
descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var Encoder = function() {
function Encoder2(config) {
classCallCheck(this, Encoder2);
this.config = {
sampleRate: 44100,
bitRate: 128
};
Object.assign(this.config, config);
this.mp3Encoder = new Mp3Encoder_1(1, this.config.sampleRate, this.config.bitRate);
this.maxSamples = 1152;
this.samplesMono = null;
this.clearBuffer();
}
createClass(Encoder2, [{
key: "clearBuffer",
value: function clearBuffer() {
this.dataBuffer = [];
}
/**
* Append new audio buffer to current active buffer
* @param {Buffer} buffer
*/
}, {
key: "appendToBuffer",
value: function appendToBuffer(buffer) {
this.dataBuffer.push(new Int8Array(buffer));
}
/**
* Float current data to 16 bits PCM
* @param {Float32Array} input
* @param {Int16Array} output
*/
}, {
key: "floatTo16BitPCM",
value: function floatTo16BitPCM(input, output) {
for (var i = 0; i < input.length; i++) {
var s = Math.max(-1, Math.min(1, input[i]));
output[i] = s < 0 ? s * 32768 : s * 32767;
}
}
/**
* Convert buffer to proper format
* @param {Array} arrayBuffer
*/
}, {
key: "convertBuffer",
value: function convertBuffer(arrayBuffer) {
var data = new Float32Array(arrayBuffer);
var out = new Int16Array(arrayBuffer.length);
this.floatTo16BitPCM(data, out);
return out;
}
/**
* Encode and append current buffer to dataBuffer
* @param {Array} arrayBuffer
*/
}, {
key: "encode",
value: function encode(arrayBuffer) {
this.samplesMono = this.convertBuffer(arrayBuffer);
var remaining = this.samplesMono.length;
for (var i = 0; remaining >= 0; i += this.maxSamples) {
var left = this.samplesMono.subarray(i, i + this.maxSamples);
var mp3buffer = this.mp3Encoder.encodeBuffer(left);
this.appendToBuffer(mp3buffer);
remaining -= this.maxSamples;
}
}
/**
* Return full dataBuffer
*/
}, {
key: "finish",
value: function finish() {
this.appendToBuffer(this.mp3Encoder.flush());
return this.dataBuffer;
}
}]);
return Encoder2;
}();
var MicRecorder = function() {
function MicRecorder2(config) {
classCallCheck(this, MicRecorder2);
this.config = {
// 128 or 160 kbit/s – mid-range bitrate quality
bitRate: 128,
// There is a known issue with some macOS machines, where the recording
// will sometimes have a loud 'pop' or 'pop-click' sound. This flag
// prevents getting audio from the microphone a few milliseconds after
// the begining of the recording. It also helps to remove the mouse
// "click" sound from the output mp3 file.
startRecordingAt: 300,
deviceId: null
};
this.activeStream = null;
this.context = null;
this.microphone = null;
this.processor = null;
this.startTime = 0;
Object.assign(this.config, config);
}
createClass(MicRecorder2, [{
key: "addMicrophoneListener",
value: function addMicrophoneListener(stream) {
var _this = this;
this.activeStream = stream;
this.timerToStart = setTimeout(function() {
delete _this.timerToStart;
}, this.config.startRecordingAt);
this.microphone = this.context.createMediaStreamSource(stream);
this.processor = this.context.createScriptProcessor(0, 1, 1);
this.processor.onaudioprocess = function(event) {
if (_this.timerToStart) {
return;
}
_this.lameEncoder.encode(event.inputBuffer.getChannelData(0));
};
this.microphone.connect(this.processor);
this.processor.connect(this.context.destination);
}
}, {
key: "stop",
/**
* Disconnect microphone, processor and remove activeStream
*/
value: function stop() {
if (this.processor && this.microphone) {
this.microphone.disconnect();
this.processor.disconnect();
if (this.context && this.context.state !== "closed") {
this.context.close();
}
this.processor.onaudioprocess = null;
this.activeStream.getAudioTracks().forEach(function(track) {
return track.stop();
});
}
return this;
}
}, {
key: "start",
/**
* Requests access to the microphone and start recording
* @return Promise
*/
value: function start() {
var _this2 = this;
var AudioContext = window.AudioContext || window.webkitAudioContext;
this.context = new AudioContext();
this.config.sampleRate = this.context.sampleRate;
this.lameEncoder = new Encoder(this.config);
var audio = this.config.deviceId ? { deviceId: { exact: this.config.deviceId } } : true;
return new Promise(function(resolve, reject) {
navigator.mediaDevices.getUserMedia({ audio }).then(function(stream) {
_this2.addMicrophoneListener(stream);
resolve(stream);
}).catch(function(err) {
reject(err);
});
});
}
}, {
key: "getMp3",
/**
* Return Mp3 Buffer and Blob with type mp3
* @return {Promise}
*/
value: function getMp3() {
var _this3 = this;
var finalBuffer = this.lameEncoder.finish();
return new Promise(function(resolve, reject) {
if (finalBuffer.length === 0) {
reject(new Error("No buffer to send"));
} else {
resolve([finalBuffer, new Blob(finalBuffer, { type: "audio/mp3" })]);
_this3.lameEncoder.clearBuffer();
}
});
}
}]);
return MicRecorder2;
}();
return MicRecorder;
});
}
});
export default require_dist();
//# sourceMappingURL=mic-recorder-to-mp3.js.map