// ==UserScript==
// @name QQ音乐歌单一键下载到本地
// @namespace npm/vite-plugin-monkey
// @version 1.0.0
// @author lsq_li
// @description QQ音乐歌单一键式本地下载、音乐下载。(注意:使用前请登录qq音乐账号,再下载音乐,若遇到下载失败,请刷新后重试,或者检查网络流畅)使用流程: 进入qq音乐官网https://y.qq.com/n/ryqq。再选择需要下载的歌单播放歌单全部音乐。进入播放界面提示是否下载。点击确认获取本地音乐(歌曲多可能需要一段时间)。等待一段时间后,即可下载歌单内全部音乐。(适用于u盘音响设备,或者车内音响设备音乐下载本地)*****请勿运用到商业用途。若用于商业用途与本人无关。
// @license GPL License
// @icon https://vitejs.dev/logo.svg
// @match https://y.qq.com/n/ryqq/player
// @require https://cdn.jsdelivr.net/npm/[email protected]/umd/react.production.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/umd/react-dom.production.min.js
// ==/UserScript==
(function (require$$0, require$$0$1) {
'use strict';
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
function getDefaultExportFromCjs(x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
}
var jsxRuntime = { exports: {} };
var reactJsxRuntime_production_min = {};
/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var f = require$$0, k = Symbol.for("react.element"), l = Symbol.for("react.fragment"), m$1 = Object.prototype.hasOwnProperty, n = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p = { key: true, ref: true, __self: true, __source: true };
function q(c, a, g) {
var b, d = {}, e = null, h = null;
void 0 !== g && (e = "" + g);
void 0 !== a.key && (e = "" + a.key);
void 0 !== a.ref && (h = a.ref);
for (b in a) m$1.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]);
if (c && c.defaultProps) for (b in a = c.defaultProps, a) void 0 === d[b] && (d[b] = a[b]);
return { $$typeof: k, type: c, key: e, ref: h, props: d, _owner: n.current };
}
reactJsxRuntime_production_min.Fragment = l;
reactJsxRuntime_production_min.jsx = q;
reactJsxRuntime_production_min.jsxs = q;
{
jsxRuntime.exports = reactJsxRuntime_production_min;
}
var jsxRuntimeExports = jsxRuntime.exports;
var client = {};
var m = require$$0$1;
{
client.createRoot = m.createRoot;
client.hydrateRoot = m.hydrateRoot;
}
function new_byte$2(count) {
return new Int8Array(count);
}
function new_short(count) {
return new Int16Array(count);
}
function new_int$8(count) {
return new Int32Array(count);
}
function new_float$8(count) {
return new Float32Array(count);
}
function new_double$1(count) {
return new Float64Array(count);
}
function new_float_n$3(args) {
if (args.length == 1) {
return new_float$8(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_float_n$3(args));
}
return A;
}
function new_int_n$1(args) {
if (args.length == 1) {
return new_int$8(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(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(args));
}
return A;
}
var Arrays$3 = {};
Arrays$3.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$3 = {};
System$3.arraycopy = function(src, srcPos, dest, destPos, length) {
var srcEnd = srcPos + length;
while (srcPos < srcEnd)
dest[destPos++] = src[srcPos++];
};
System$3.out = {};
System$3.out.println = function(message) {
console.log(message);
};
System$3.out.printf = function() {
console.log.apply(console, arguments);
};
var Util$2 = {};
Util$2.SQRT2 = 1.4142135623730951;
Util$2.FAST_LOG10 = function(x) {
return Math.log10(x);
};
Util$2.FAST_LOG10_X = function(x, y) {
return Math.log10(x) * y;
};
function ShortBlock$2(ordinal) {
this.ordinal = ordinal;
}
ShortBlock$2.short_block_allowed = new ShortBlock$2(0);
ShortBlock$2.short_block_coupled = new ShortBlock$2(1);
ShortBlock$2.short_block_dispensed = new ShortBlock$2(2);
ShortBlock$2.short_block_forced = new ShortBlock$2(3);
var Float$1 = {};
Float$1.MAX_VALUE = 34028235e31;
function VbrMode$2(ordinal) {
this.ordinal = ordinal;
}
VbrMode$2.vbr_off = new VbrMode$2(0);
VbrMode$2.vbr_mt = new VbrMode$2(1);
VbrMode$2.vbr_rh = new VbrMode$2(2);
VbrMode$2.vbr_abr = new VbrMode$2(3);
VbrMode$2.vbr_mtrh = new VbrMode$2(4);
VbrMode$2.vbr_default = VbrMode$2.vbr_mtrh;
var assert$3 = function(x) {
};
var common$h = {
"System": System$3,
"VbrMode": VbrMode$2,
"Float": Float$1,
"ShortBlock": ShortBlock$2,
"Util": Util$2,
"Arrays": Arrays$3,
"new_array_n": new_array_n,
"new_byte": new_byte$2,
"new_double": new_double$1,
"new_float": new_float$8,
"new_float_n": new_float_n$3,
"new_int": new_int$8,
"new_int_n": new_int_n$1,
"new_short": new_short,
"new_short_n": new_short_n,
"assert": assert$3
};
function MPEGMode$2(ordinal) {
var _ordinal = ordinal;
this.ordinal = function() {
return _ordinal;
};
}
MPEGMode$2.STEREO = new MPEGMode$2(0);
MPEGMode$2.JOINT_STEREO = new MPEGMode$2(1);
MPEGMode$2.DUAL_CHANNEL = new MPEGMode$2(2);
MPEGMode$2.MONO = new MPEGMode$2(3);
MPEGMode$2.NOT_SET = new MPEGMode$2(4);
var MPEGMode_1 = MPEGMode$2;
var NewMDCT_1;
var hasRequiredNewMDCT;
function requireNewMDCT() {
if (hasRequiredNewMDCT) return NewMDCT_1;
hasRequiredNewMDCT = 1;
var common2 = common$h;
var System2 = common2.System;
var Util2 = common2.Util;
var Arrays2 = common2.Arrays;
var new_float2 = common2.new_float;
var Encoder2 = requireEncoder();
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 * Util2.SQRT2 * 0.5 / 2384e-9,
0.017876148 * Util2.SQRT2 * 0.5 / 2384e-9,
3134727e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
2457142e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
971317e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
218868e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
101566e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
13828e-9 * Util2.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[Encoder2.SHORT_TYPE];
var cx = win[Encoder2.SHORT_TYPE];
var ca = win[Encoder2.SHORT_TYPE];
var cs = win[Encoder2.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 * Util2.SQRT2;
xr = a[23] - a[7];
a[7] += a[23];
a[23] = xr * Util2.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 = Util2.SQRT2 * (a[2] - a[10]);
a[2] += a[10];
a[10] = xr;
xr = Util2.SQRT2 * (a[3] - a[11]);
a[3] += a[11];
a[11] = xr;
xr = Util2.SQRT2 * (-a[18] + a[26]);
a[18] += a[26];
a[26] = xr - a[18];
xr = Util2.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 = Util2.SQRT2 * (a[0] - a[4]);
a[0] += a[4];
a[4] = xr;
xr = Util2.SQRT2 * (a[1] - a[5]);
a[1] += a[5];
a[5] = xr;
xr = Util2.SQRT2 * (a[16] - a[20]);
a[16] += a[20];
a[20] = xr;
xr = Util2.SQRT2 * (a[17] - a[21]);
a[17] += a[21];
a[21] = xr;
xr = -Util2.SQRT2 * (a[8] - a[12]);
a[8] += a[12];
a[12] = xr - a[8];
xr = -Util2.SQRT2 * (a[9] - a[13]);
a[9] += a[13];
a[13] = xr - a[9];
xr = -Util2.SQRT2 * (a[25] - a[29]);
a[25] += a[29];
a[29] = xr - a[25];
xr = -Util2.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 l2 = 0; l2 < 3; l2++) {
var tc0, tc1, tc2, ts0, ts1, ts2;
ts0 = inout[inoutPos + 2 * 3] * win[Encoder2.SHORT_TYPE][0] - inout[inoutPos + 5 * 3];
tc0 = inout[inoutPos + 0 * 3] * win[Encoder2.SHORT_TYPE][2] - inout[inoutPos + 3 * 3];
tc1 = ts0 + tc0;
tc2 = ts0 - tc0;
ts0 = inout[inoutPos + 5 * 3] * win[Encoder2.SHORT_TYPE][0] + inout[inoutPos + 2 * 3];
tc0 = inout[inoutPos + 3 * 3] * win[Encoder2.SHORT_TYPE][2] + inout[inoutPos + 0 * 3];
ts1 = ts0 + tc0;
ts2 = -ts0 + tc0;
tc0 = (inout[inoutPos + 1 * 3] * win[Encoder2.SHORT_TYPE][1] - inout[inoutPos + 4 * 3]) * 2069978111953089e-26;
ts0 = (inout[inoutPos + 4 * 3] * win[Encoder2.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 k2 = 0; k2 < 18 / 2; k2++) {
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) {
Arrays2.fill(
mdct_enc,
mdct_encPos + 0,
mdct_encPos + 18,
0
);
} else {
if (gfc.amp_filter[band] < 1) {
for (var k2 = 0; k2 < 18; k2++)
band1[k2][order[band]] *= gfc.amp_filter[band];
}
if (type == Encoder2.SHORT_TYPE) {
for (var k2 = -NS / 4; k2 < 0; k2++) {
var w = win[Encoder2.SHORT_TYPE][k2 + 3];
mdct_enc[mdct_encPos + k2 * 3 + 9] = band0[9 + k2][order[band]] * w - band0[8 - k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 18] = band0[14 - k2][order[band]] * w + band0[15 + k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 10] = band0[15 + k2][order[band]] * w - band0[14 - k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 19] = band1[2 - k2][order[band]] * w + band1[3 + k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 11] = band1[3 + k2][order[band]] * w - band1[2 - k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 20] = band1[8 - k2][order[band]] * w + band1[9 + k2][order[band]];
}
mdct_short(mdct_enc, mdct_encPos);
} else {
var work = new_float2(18);
for (var k2 = -NL / 4; k2 < 0; k2++) {
var a, b;
a = win[type][k2 + 27] * band1[k2 + 9][order[band]] + win[type][k2 + 36] * band1[8 - k2][order[band]];
b = win[type][k2 + 9] * band0[k2 + 9][order[band]] - win[type][k2 + 18] * band0[8 - k2][order[band]];
work[k2 + 9] = a - b * tantab_l[3 + k2 + 9];
work[k2 + 18] = a * tantab_l[3 + k2 + 9] + b;
}
mdct_long(mdct_enc, mdct_encPos, work);
}
}
if (type != Encoder2.SHORT_TYPE && band != 0) {
for (var k2 = 7; k2 >= 0; --k2) {
var bu, bd;
bu = mdct_enc[mdct_encPos + k2] * ca[20 + k2] + mdct_enc[mdct_encPos + -1 - k2] * cs[28 + k2];
bd = mdct_enc[mdct_encPos + k2] * cs[28 + k2] - mdct_enc[mdct_encPos + -1 - k2] * ca[20 + k2];
mdct_enc[mdct_encPos + -1 - k2] = bu;
mdct_enc[mdct_encPos + k2] = bd;
}
}
}
}
wk = w1;
wkPos = 286;
if (gfc.mode_gr == 1) {
for (var i = 0; i < 18; i++) {
System2.arraycopy(
gfc.sb_sample[ch][1][i],
0,
gfc.sb_sample[ch][0][i],
0,
32
);
}
}
}
};
}
NewMDCT_1 = NewMDCT;
return NewMDCT_1;
}
var III_psy_xmin_1;
var hasRequiredIII_psy_xmin;
function requireIII_psy_xmin() {
if (hasRequiredIII_psy_xmin) return III_psy_xmin_1;
hasRequiredIII_psy_xmin = 1;
var Encoder2 = requireEncoder();
var common2 = common$h;
var System2 = common2.System;
var new_float2 = common2.new_float;
var new_float_n2 = common2.new_float_n;
function III_psy_xmin2() {
this.l = new_float2(Encoder2.SBMAX_l);
this.s = new_float_n2([Encoder2.SBMAX_s, 3]);
var self2 = this;
this.assign = function(iii_psy_xmin) {
System2.arraycopy(iii_psy_xmin.l, 0, self2.l, 0, Encoder2.SBMAX_l);
for (var i = 0; i < Encoder2.SBMAX_s; i++) {
for (var j = 0; j < 3; j++) {
self2.s[i][j] = iii_psy_xmin.s[i][j];
}
}
};
}
III_psy_xmin_1 = III_psy_xmin2;
return III_psy_xmin_1;
}
var III_psy_ratio_1;
var hasRequiredIII_psy_ratio;
function requireIII_psy_ratio() {
if (hasRequiredIII_psy_ratio) return III_psy_ratio_1;
hasRequiredIII_psy_ratio = 1;
var III_psy_xmin2 = requireIII_psy_xmin();
function III_psy_ratio() {
this.thm = new III_psy_xmin2();
this.en = new III_psy_xmin2();
}
III_psy_ratio_1 = III_psy_ratio;
return III_psy_ratio_1;
}
var Encoder_1;
var hasRequiredEncoder;
function requireEncoder() {
if (hasRequiredEncoder) return Encoder_1;
hasRequiredEncoder = 1;
var common2 = common$h;
var System2 = common2.System;
var VbrMode2 = common2.VbrMode;
var new_array_n2 = common2.new_array_n;
var new_float2 = common2.new_float;
var new_float_n2 = common2.new_float_n;
var new_int2 = common2.new_int;
var assert2 = common2.assert;
var MPEGMode2 = MPEGMode_1;
Encoder2.ENCDELAY = 576;
Encoder2.POSTDELAY = 1152;
Encoder2.MDCTDELAY = 48;
Encoder2.FFTOFFSET = 224 + Encoder2.MDCTDELAY;
Encoder2.DECDELAY = 528;
Encoder2.SBLIMIT = 32;
Encoder2.CBANDS = 64;
Encoder2.SBPSY_l = 21;
Encoder2.SBPSY_s = 12;
Encoder2.SBMAX_l = 22;
Encoder2.SBMAX_s = 13;
Encoder2.PSFB21 = 6;
Encoder2.PSFB12 = 6;
Encoder2.BLKSIZE = 1024;
Encoder2.HBLKSIZE = Encoder2.BLKSIZE / 2 + 1;
Encoder2.BLKSIZE_s = 256;
Encoder2.HBLKSIZE_s = Encoder2.BLKSIZE_s / 2 + 1;
Encoder2.NORM_TYPE = 0;
Encoder2.START_TYPE = 1;
Encoder2.SHORT_TYPE = 2;
Encoder2.STOP_TYPE = 3;
Encoder2.MPG_MD_LR_LR = 0;
Encoder2.MPG_MD_LR_I = 1;
Encoder2.MPG_MD_MS_LR = 2;
Encoder2.MPG_MD_MS_I = 3;
Encoder2.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 Encoder2() {
var NewMDCT = requireNewMDCT();
var III_psy_ratio = requireIII_psy_ratio();
var FFTOFFSET = Encoder2.FFTOFFSET;
var MPG_MD_MS_LR = Encoder2.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 NewMDCT();
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;
assert2(0 <= gfc.bitrate_index && gfc.bitrate_index < 16);
assert2(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_float2(286 + 1152 + 576);
var primebuff1 = new_float2(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 = Encoder2.SHORT_TYPE;
}
}
newMDCT.mdct_sub48(gfc, primebuff0, primebuff1);
assert2(576 >= Encoder2.FFTOFFSET);
assert2(gfc.mf_size >= Encoder2.BLKSIZE + gfp.framesize - Encoder2.FFTOFFSET);
assert2(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_n2([2, 2]);
masking_LR[0][0] = new III_psy_ratio();
masking_LR[0][1] = new III_psy_ratio();
masking_LR[1][0] = new III_psy_ratio();
masking_LR[1][1] = new III_psy_ratio();
var masking_MS = new_array_n2([2, 2]);
masking_MS[0][0] = new III_psy_ratio();
masking_MS[0][1] = new III_psy_ratio();
masking_MS[1][0] = new III_psy_ratio();
masking_MS[1][1] = new III_psy_ratio();
var masking;
var inbuf = [null, null];
var gfc = gfp.internal_flags;
var tot_ener = new_float_n2([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_int2(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 - Encoder2.FFTOFFSET;
}
if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.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 == MPEGMode2.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 = Encoder2.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 = Encoder2.MPG_MD_LR_LR;
if (gfp.force_ms) {
gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
} else if (gfp.mode == MPEGMode2.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 = Encoder2.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];
System2.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];
System2.arraycopy(
gfc.pinfo.energy[gr][ch + 2],
0,
gfc.pinfo.energy[gr][ch],
0,
gfc.pinfo.energy[gr][ch].length
);
}
}
}
}
if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_abr) {
var i;
var f2;
for (i = 0; i < 18; i++)
gfc.nsPsy.pefirbuf[i] = gfc.nsPsy.pefirbuf[i + 1];
f2 = 0;
for (gr = 0; gr < gfc.mode_gr; gr++)
for (ch = 0; ch < gfc.channels_out; ch++)
f2 += pe_use[gr][ch];
gfc.nsPsy.pefirbuf[18] = f2;
f2 = gfc.nsPsy.pefirbuf[9];
for (i = 0; i < 9; i++)
f2 += (gfc.nsPsy.pefirbuf[i] + gfc.nsPsy.pefirbuf[18 - i]) * Encoder2.fircoef[i];
f2 = 670 * 5 * gfc.mode_gr * gfc.channels_out / f2;
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
pe_use[gr][ch] *= f2;
}
}
}
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;
};
}
Encoder_1 = Encoder2;
return Encoder_1;
}
var common$g = common$h;
var Util$1 = common$g.Util;
var new_float$7 = common$g.new_float;
var Encoder$7 = requireEncoder();
function FFT$1() {
var window2 = new_float$7(Encoder$7.BLKSIZE);
var window_s = new_float$7(Encoder$7.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, n2) {
var tri = 0;
var k4;
var fi;
var gi;
n2 <<= 1;
var fn = fzPos + n2;
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$1.SQRT2 * fz[gi + k3];
f2 = Util$1.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 < n2);
}
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$7.BLKSIZE_s / 2;
var k2 = 65535 & 576 / 3 * (b + 1);
var j = Encoder$7.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 + k2];
w = window_s[127 - i] * buffer[chn][bufPos + i + k2 + 128];
f1 = f0 - w;
f0 = f0 + w;
f2 = window_s[i + 64] * buffer[chn][bufPos + i + k2 + 64];
w = window_s[63 - i] * buffer[chn][bufPos + i + k2 + 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 + k2 + 1];
w = window_s[126 - i] * buffer[chn][bufPos + i + k2 + 129];
f1 = f0 - w;
f0 = f0 + w;
f2 = window_s[i + 65] * buffer[chn][bufPos + i + k2 + 65];
w = window_s[62 - i] * buffer[chn][bufPos + i + k2 + 193];
f3 = f2 - w;
f2 = f2 + w;
x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 0] = f0 + f2;
x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 2] = f0 - f2;
x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 1] = f1 + f3;
x_real[b][x + Encoder$7.BLKSIZE_s / 2 + 3] = f1 - f3;
} while (--j >= 0);
fht(x_real[b], x, Encoder$7.BLKSIZE_s / 2);
}
};
this.fft_long = function(gfc, y, chn, buffer, bufPos) {
var jj = Encoder$7.BLKSIZE / 8 - 1;
var x = Encoder$7.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$7.BLKSIZE / 2 + 0] = f0 + f2;
y[x + Encoder$7.BLKSIZE / 2 + 2] = f0 - f2;
y[x + Encoder$7.BLKSIZE / 2 + 1] = f1 + f3;
y[x + Encoder$7.BLKSIZE / 2 + 3] = f1 - f3;
} while (--jj >= 0);
fht(y, x, Encoder$7.BLKSIZE / 2);
};
this.init_fft = function(gfc) {
for (var i = 0; i < Encoder$7.BLKSIZE; i++)
window2[i] = 0.42 - 0.5 * Math.cos(2 * Math.PI * (i + 0.5) / Encoder$7.BLKSIZE) + 0.08 * Math.cos(4 * Math.PI * (i + 0.5) / Encoder$7.BLKSIZE);
for (var i = 0; i < Encoder$7.BLKSIZE_s / 2; i++)
window_s[i] = 0.5 * (1 - Math.cos(2 * Math.PI * (i + 0.5) / Encoder$7.BLKSIZE_s));
};
}
var FFT_1 = FFT$1;
var common$f = common$h;
var VbrMode$1 = common$f.VbrMode;
var Float = common$f.Float;
var ShortBlock$1 = common$f.ShortBlock;
var Util = common$f.Util;
var Arrays$2 = common$f.Arrays;
var new_float$6 = common$f.new_float;
var new_float_n$2 = common$f.new_float_n;
var new_int$7 = common$f.new_int;
var assert$2 = common$f.assert;
var FFT = FFT_1;
var Encoder$6 = requireEncoder();
var MPEGMode$1 = MPEGMode_1;
function PsyModel() {
var fft = new FFT();
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$6.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 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$6.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$6.BLKSIZE - 1; j >= 0; --j) {
var l2 = wsamp_l[wsamp_lPos + 0][j];
var r = wsamp_l[wsamp_lPos + 1][j];
wsamp_l[wsamp_lPos + 0][j] = (l2 + r) * Util.SQRT2 * 0.5;
wsamp_l[wsamp_lPos + 1][j] = (l2 - r) * Util.SQRT2 * 0.5;
}
for (var b = 2; b >= 0; --b) {
for (var j = Encoder$6.BLKSIZE_s - 1; j >= 0; --j) {
var l2 = wsamp_s[wsamp_sPos + 0][b][j];
var r = wsamp_s[wsamp_sPos + 1][b][j];
wsamp_s[wsamp_sPos + 0][b][j] = (l2 + r) * Util.SQRT2 * 0.5;
wsamp_s[wsamp_sPos + 1][b][j] = (l2 - r) * Util.SQRT2 * 0.5;
}
}
}
fftenergy[0] = NON_LINEAR_SCALE_ENERGY(wsamp_l[wsamp_lPos + 0][0]);
fftenergy[0] *= fftenergy[0];
for (var j = Encoder$6.BLKSIZE / 2 - 1; j >= 0; --j) {
var re = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 - j];
var im = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 + j];
fftenergy[Encoder$6.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$6.BLKSIZE_s / 2 - 1; j >= 0; --j) {
var re = wsamp_s[wsamp_sPos + 0][b][Encoder$6.BLKSIZE_s / 2 - j];
var im = wsamp_s[wsamp_sPos + 0][b][Encoder$6.BLKSIZE_s / 2 + j];
fftenergy_s[b][Encoder$6.BLKSIZE_s / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
}
}
{
var totalenergy = 0;
for (var j = 11; j < Encoder$6.HBLKSIZE; j++)
totalenergy += fftenergy[j];
gfc.tot_ener[chn] = totalenergy;
}
if (gfp.analysis) {
for (var j = 0; j < Encoder$6.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;
}
m1 += m2;
if (b + 3 <= 3 + 3) {
if (ratio >= ma_max_i1) {
return m1;
}
var i = 0 | Util.FAST_LOG10_X(ratio, 16);
return m1 * table2[i];
}
var i = 0 | Util.FAST_LOG10_X(ratio, 16);
{
m2 = gfc.ATH.cb_l[kk] * gfc.ATH.adjust;
}
if (m1 < ma_max_m * m2) {
if (m1 > m2) {
var f2, r;
f2 = 1;
if (i <= 13)
f2 = table3[i];
r = Util.FAST_LOG10_X(m1 / m2, 10 / 15);
return m1 * ((table1[i] - f2) * r + f2);
}
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.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$6.SBMAX_l; sb++) {
var l2 = gfc.thm[0].l[sb];
var r = gfc.thm[1].l[sb];
gfc.thm[0].l[sb] += r * ratio;
gfc.thm[1].l[sb] += l2 * ratio;
}
for (var sb = 0; sb < Encoder$6.SBMAX_s; sb++) {
for (var sblock = 0; sblock < 3; sblock++) {
var l2 = 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] += l2 * ratio;
}
}
}
}
function msfix1(gfc) {
for (var sb = 0; sb < Encoder$6.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$6.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$6.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 f2 = thmLR * msfix2 / (thmM + thmS);
thmM *= f2;
thmS *= f2;
}
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$6.BLKSIZE_s / Encoder$6.BLKSIZE;
for (var sb = 0; sb < Encoder$6.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 f2 = thmLR * msfix / (thmM + thmS);
thmM *= f2;
thmS *= f2;
}
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$6.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$2(eb[b] >= 0);
assert$2(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$2(eb[b] >= 0);
assert$2(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$6.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$6.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$2(eb[b] >= 0);
assert$2(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$2(eb[b] >= 0);
assert$2(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$6.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;
var n2 = gfc.numlines_s[b];
for (var i = 0; i < n2; ++i, ++j) {
var el = fftenergy_s[sblock][j];
ebb += el;
}
eb[b] = ebb;
}
assert$2(b == gfc.npart_s);
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$6.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$2(thr[b] >= 0);
}
for (; b <= Encoder$6.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$1.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$6.NORM_TYPE;
if (gfp.short_blocks == ShortBlock$1.short_block_dispensed)
uselongblock[chn] = 1;
if (gfp.short_blocks == ShortBlock$1.short_block_forced)
uselongblock[chn] = 0;
if (uselongblock[chn] != 0) {
assert$2(gfc.blocktype_old[chn] != Encoder$6.START_TYPE);
if (gfc.blocktype_old[chn] == Encoder$6.SHORT_TYPE)
blocktype[chn] = Encoder$6.STOP_TYPE;
} else {
blocktype[chn] = Encoder$6.SHORT_TYPE;
if (gfc.blocktype_old[chn] == Encoder$6.NORM_TYPE) {
gfc.blocktype_old[chn] = Encoder$6.START_TYPE;
}
if (gfc.blocktype_old[chn] == Encoder$6.STOP_TYPE)
gfc.blocktype_old[chn] = Encoder$6.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$6.SBMAX_s - 1; sb++) {
for (var sblock = 0; sblock < 3; sblock++) {
var thm = mr.thm.s[sb][sblock];
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 {
pe_s += regcoef_s[sb] * Util.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$6.SBMAX_l - 1; sb++) {
var thm = mr.thm.l[sb];
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 {
pe_l += regcoef_l[sb] * Util.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, m2 = 0;
var i;
for (i = 0; i < gfc.numlines_l[b]; ++i, ++j) {
var el = fftenergy[j];
ebb += el;
if (m2 < el)
m2 = el;
}
eb[b] = ebb;
max[b] = m2;
avg[b] = ebb * gfc.rnumlines_l[b];
assert$2(gfc.rnumlines_l[b] >= 0);
assert$2(eb[b] >= 0);
assert$2(max[b] >= 0);
assert$2(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];
if (a > 0) {
var m2 = max[b];
if (m2 < max[b + 1])
m2 = max[b + 1];
assert$2(gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1 > 0);
a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
for (b = 1; b < gfc.npart_l - 1; b++) {
a = avg[b - 1] + avg[b] + avg[b + 1];
if (a > 0) {
var m2 = max[b - 1];
if (m2 < max[b])
m2 = max[b];
if (m2 < max[b + 1])
m2 = max[b + 1];
assert$2(gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1 > 0);
a = 20 * (m2 * 3 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
}
assert$2(b == gfc.npart_l - 1);
a = avg[b - 1] + avg[b];
if (a > 0) {
var m2 = max[b - 1];
if (m2 < max[b])
m2 = max[b];
assert$2(gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1 > 0);
a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
assert$2(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$2([2, Encoder$6.BLKSIZE]);
var wsamp_S = new_float_n$2([2, 3, Encoder$6.BLKSIZE_s]);
var eb_l = new_float$6(Encoder$6.CBANDS + 1);
var eb_s = new_float$6(Encoder$6.CBANDS + 1);
var thr = new_float$6(Encoder$6.CBANDS + 2);
var blocktype = new_int$7(2), uselongblock = new_int$7(2);
var numchn, chn;
var b, i, j, k2;
var sb, sblock;
var ns_hpfsmpl = new_float_n$2([2, 576]);
var pcfact;
var mask_idx_l = new_int$7(Encoder$6.CBANDS + 2), mask_idx_s = new_int$7(Encoder$6.CBANDS + 2);
Arrays$2.fill(mask_idx_s, 0);
numchn = gfc.channels_out;
if (gfp.mode == MPEGMode$1.JOINT_STEREO)
numchn = 4;
if (gfp.VBR == VbrMode$1.vbr_off)
pcfact = gfc.ResvMax == 0 ? 0 : gfc.ResvSize / gfc.ResvMax * 0.5;
else if (gfp.VBR == VbrMode$1.vbr_rh || gfp.VBR == VbrMode$1.vbr_mtrh || gfp.VBR == VbrMode$1.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;
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$6(12);
var en_short = [0, 0, 0, 0];
var attack_intensity = new_float$6(12);
var ns_uselongblock = 1;
var attackThreshold;
var max = new_float$6(Encoder$6.CBANDS), avg = new_float$6(Encoder$6.CBANDS);
var ns_attacks = [0, 0, 0, 0];
var fftenergy = new_float$6(Encoder$6.HBLKSIZE);
var fftenergy_s = new_float_n$2([3, Encoder$6.HBLKSIZE_s]);
assert$2(gfc.npart_s <= Encoder$6.CBANDS);
assert$2(gfc.npart_l <= Encoder$6.CBANDS);
for (i = 0; i < 3; i++) {
en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
assert$2(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 l2, r;
l2 = ns_hpfsmpl[0][i];
r = ns_hpfsmpl[1][i];
ns_hpfsmpl[0][i] = l2 + r;
ns_hpfsmpl[1][i] = l2 - r;
}
}
{
var pf = ns_hpfsmpl[chn & 1];
var pfPos = 0;
for (i = 0; i < 9; i++) {
var pfe = pfPos + 576 / 9;
var p2 = 1;
for (; pfPos < pfe; pfPos++)
if (p2 < Math.abs(pf[pfPos]))
p2 = Math.abs(pf[pfPos]);
gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p2;
en_short[1 + i / 3] += p2;
if (p2 > en_subshort[i + 3 - 2]) {
assert$2(en_subshort[i + 3 - 2] > 0);
p2 = p2 / en_subshort[i + 3 - 2];
} else if (en_subshort[i + 3 - 2] > p2 * 10) {
p2 = en_subshort[i + 3 - 2] / (p2 * 10);
} else
p2 = 0;
attack_intensity[i + 3] = p2;
}
}
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$2(en_short[i] > 0);
ratio = en_short[i - 1] / en_short[i];
} else {
assert$2(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$6.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 p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT1 * pcfact
);
thmm = Math.min(thmm, p2);
}
if (ns_attacks[sblock] == 1) {
var idx = sblock != 0 ? sblock - 1 : 2;
var p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p2);
} else if (sblock != 0 && ns_attacks[sblock - 1] == 3 || sblock == 0 && gfc.nsPsy.lastAttacks[chn] == 3) {
var idx = sblock != 2 ? sblock + 1 : 0;
var p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p2);
}
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];
k2 = 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[k2++] * eb2;
while (++kk <= gfc.s3ind[b][1]) {
eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
ecb = mask_add(
ecb,
gfc.s3_ll[k2++] * eb2,
kk,
kk - b,
gfc
);
}
ecb *= 0.158489319246111;
if (gfc.blocktype_old[chn & 1] == Encoder$6.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$6.CBANDS; ++b) {
eb_l[b] = 0;
thr[b] = 0;
}
convert_partition2scalefac_l(gfc, eb_l, thr, chn);
}
if (gfp.mode == MPEGMode$1.STEREO || gfp.mode == MPEGMode$1.JOINT_STEREO) {
if (gfp.interChRatio > 0) {
calc_interchannel_masking(gfp, gfp.interChRatio);
}
}
if (gfp.mode == MPEGMode$1.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$6.NORM_TYPE;
if (blocktype_d[0] == Encoder$6.SHORT_TYPE || blocktype_d[1] == Encoder$6.SHORT_TYPE)
type = Encoder$6.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$6.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$6.BLKSIZE - 1; j >= 0; --j) {
var l2 = wsamp_l[wsamp_lPos + 0][j];
var r = wsamp_l[wsamp_lPos + 1][j];
wsamp_l[wsamp_lPos + 0][j] = (l2 + r) * Util.SQRT2 * 0.5;
wsamp_l[wsamp_lPos + 1][j] = (l2 - r) * Util.SQRT2 * 0.5;
}
}
fftenergy[0] = NON_LINEAR_SCALE_ENERGY(wsamp_l[wsamp_lPos + 0][0]);
fftenergy[0] *= fftenergy[0];
for (var j = Encoder$6.BLKSIZE / 2 - 1; j >= 0; --j) {
var re = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 - j];
var im = wsamp_l[wsamp_lPos + 0][Encoder$6.BLKSIZE / 2 + j];
fftenergy[Encoder$6.BLKSIZE / 2 - j] = NON_LINEAR_SCALE_ENERGY((re * re + im * im) * 0.5);
}
{
var totalenergy = 0;
for (var j = 11; j < Encoder$6.HBLKSIZE; j++)
totalenergy += fftenergy[j];
gfc.tot_ener[chn] = totalenergy;
}
if (gfp.analysis) {
for (var j = 0; j < Encoder$6.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$6.BLKSIZE_s - 1; j >= 0; --j) {
var l2 = wsamp_s[wsamp_sPos + 0][sblock][j];
var r = wsamp_s[wsamp_sPos + 1][sblock][j];
wsamp_s[wsamp_sPos + 0][sblock][j] = (l2 + r) * Util.SQRT2 * 0.5;
wsamp_s[wsamp_sPos + 1][sblock][j] = (l2 - r) * Util.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$6.BLKSIZE_s / 2 - 1; j >= 0; --j) {
var re = wsamp_s[wsamp_sPos + 0][sblock][Encoder$6.BLKSIZE_s / 2 - j];
var im = wsamp_s[wsamp_sPos + 0][sblock][Encoder$6.BLKSIZE_s / 2 + j];
fftenergy_s[sblock][Encoder$6.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$2([2, 576]);
var gfc = gfp.internal_flags;
var n_chn_out = gfc.channels_out;
var n_chn_psy = gfp.mode == MPEGMode$1.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;
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$6(12);
var en_subshort = new_float$6(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 l2 = ns_hpfsmpl[0][i];
var r = ns_hpfsmpl[1][i];
ns_hpfsmpl[0][i] = l2 + r;
ns_hpfsmpl[1][i] = l2 - r;
}
}
for (var i = 0; i < 3; i++) {
en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
assert$2(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 p2 = 1;
for (; pfPos < pfe; pfPos++)
if (p2 < Math.abs(pf[pfPos]))
p2 = Math.abs(pf[pfPos]);
gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p2;
en_short[1 + i / 3] += p2;
if (p2 > en_subshort[i + 3 - 2]) {
assert$2(en_subshort[i + 3 - 2] > 0);
p2 = p2 / en_subshort[i + 3 - 2];
} else if (en_subshort[i + 3 - 2] > p2 * 10) {
p2 = en_subshort[i + 3 - 2] / (p2 * 10);
} else {
p2 = 0;
}
attack_intensity[i + 3] = p2;
}
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 m2 = Math.max(u, v);
if (m2 < 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];
if (a > 0) {
var m2 = max[b];
if (m2 < max[b + 1])
m2 = max[b + 1];
assert$2(gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1 > 0);
a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
for (b = 1; b < gfc.npart_s - 1; b++) {
a = avg[b - 1] + avg[b] + avg[b + 1];
assert$2(b + 1 < gfc.npart_s);
if (a > 0) {
var m2 = max[b - 1];
if (m2 < max[b])
m2 = max[b];
if (m2 < max[b + 1])
m2 = max[b + 1];
assert$2(gfc.numlines_s[b - 1] + gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1 > 0);
a = 20 * (m2 * 3 - a) / (a * (gfc.numlines_s[b - 1] + gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
}
assert$2(b == gfc.npart_s - 1);
a = avg[b - 1] + avg[b];
if (a > 0) {
var m2 = max[b - 1];
if (m2 < max[b])
m2 = max[b];
assert$2(gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1 > 0);
a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
assert$2(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$6.CBANDS](), avg = new_float$6(Encoder$6.CBANDS);
var i, j, b;
var mask_idx_s = new int[Encoder$6.CBANDS]();
for (b = j = 0; b < gfc.npart_s; ++b) {
var ebb = 0, m2 = 0;
var n2 = gfc.numlines_s[b];
for (i = 0; i < n2; ++i, ++j) {
var el = fftenergy_s[sblock][j];
ebb += el;
if (m2 < el)
m2 = el;
}
eb[b] = ebb;
max[b] = m2;
avg[b] = ebb / n2;
assert$2(avg[b] >= 0);
}
assert$2(b == gfc.npart_s);
for (; b < Encoder$6.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$2(thr[b] >= 0);
}
for (; b < Encoder$6.CBANDS; ++b) {
eb[b] = 0;
thr[b] = 0;
}
}
function vbrpsy_compute_masking_l(gfc, fftenergy, eb_l, thr, chn) {
var max = new_float$6(Encoder$6.CBANDS), avg = new_float$6(Encoder$6.CBANDS);
var mask_idx_l = new_int$7(Encoder$6.CBANDS + 2);
var b;
calc_energy(gfc, fftenergy, eb_l, max, avg);
calc_mask_index_l(gfc, max, avg, mask_idx_l);
var k2 = 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[k2] * eb_l[kk] * tab[mask_idx_l[kk]];
++k2;
++kk;
while (kk <= last) {
dd += mask_idx_l[kk];
dd_n += 1;
x = gfc.s3_ll[k2] * eb_l[kk] * tab[mask_idx_l[kk]];
t = vbrpsy_mask_add(ecb, x, kk - b);
ecb = t;
++k2;
++kk;
}
dd = (1 + 2 * dd) / (2 * dd_n);
avg_mask = tab[dd] * 0.5;
ecb *= avg_mask;
if (gfc.blocktype_old[chn & 1] == Encoder$6.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$6.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$2(thr[b] >= 0);
}
for (; b < Encoder$6.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$1.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$1.short_block_dispensed) {
uselongblock[chn] = 1;
}
if (gfp.short_blocks == ShortBlock$1.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$6.NORM_TYPE;
if (uselongblock[chn] != 0) {
assert$2(gfc.blocktype_old[chn] != Encoder$6.START_TYPE);
if (gfc.blocktype_old[chn] == Encoder$6.SHORT_TYPE)
blocktype = Encoder$6.STOP_TYPE;
} else {
blocktype = Encoder$6.SHORT_TYPE;
if (gfc.blocktype_old[chn] == Encoder$6.NORM_TYPE) {
gfc.blocktype_old[chn] = Encoder$6.START_TYPE;
}
if (gfc.blocktype_old[chn] == Encoder$6.STOP_TYPE)
gfc.blocktype_old[chn] = Encoder$6.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, n2) {
var msfix2 = msfix * 2;
var athlower = msfix > 0 ? Math.pow(10, athadjust) : 1;
var rside, rmid;
for (var b = 0; b < n2; ++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 f2 = thmLR * msfix2 / thmMS;
thmM *= f2;
thmS *= f2;
}
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$6(Encoder$6.HBLKSIZE);
var fftenergy_s = new_float_n$2([3, Encoder$6.HBLKSIZE_s]);
var wsamp_L = new_float_n$2([2, Encoder$6.BLKSIZE]);
var wsamp_S = new_float_n$2([2, 3, Encoder$6.BLKSIZE_s]);
var eb = new_float_n$2([4, Encoder$6.CBANDS]), thr = new_float_n$2([4, Encoder$6.CBANDS]);
var sub_short_factor = new_float_n$2([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$7(2);
var n_chn_psy = gfp.mode == MPEGMode$1.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$1.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$1.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$6.SBMAX_s; sb++) {
var new_thmm = new_float$6(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 p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT1 * pcfact
);
thmm = Math.min(thmm, p2);
} else if (ns_attacks[chn][sblock] == 1) {
var idx = sblock != 0 ? sblock - 1 : 2;
var p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p2);
} 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 p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p2);
}
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$6.NORM_TYPE;
if (blocktype_d[0] == Encoder$6.SHORT_TYPE || blocktype_d[1] == Encoder$6.SHORT_TYPE)
type = Encoder$6.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$6.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, l2, h;
for (x = 0; s3_func_x(x, hf_slope) > 1e-20; x -= 1)
;
l2 = x;
h = 0;
while (Math.abs(h - l2) > 1e-12) {
x = (h + l2) / 2;
if (s3_func_x(x, hf_slope) > 0) {
h = x;
} else {
l2 = x;
}
}
lim_a = l2;
}
{
var x = 0, l2, h;
for (x = 0; s3_func_x(x, hf_slope) > 1e-20; x += 1)
;
l2 = 0;
h = x;
while (Math.abs(h - l2) > 1e-12) {
x = (h + l2) / 2;
if (s3_func_x(x, hf_slope) > 0) {
l2 = x;
} else {
h = x;
}
}
lim_b = h;
}
{
var sum = 0;
var m2 = 1e3;
var i;
for (i = 0; i <= m2; ++i) {
var x = lim_a + i * (lim_b - lim_a) / m2;
var y = s3_func_x(x, hf_slope);
sum += y;
}
{
var norm = (m2 + 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$6(Encoder$6.CBANDS + 1);
var sample_freq_frac = sfreq / (sbmax > 15 ? 2 * 576 : 2 * 192);
var partition = new_int$7(Encoder$6.HBLKSIZE);
var i;
sfreq /= blksize;
var j = 0;
var ni = 0;
for (i = 0; i < Encoder$6.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$2(j < Encoder$6.HBLKSIZE);
partition[j++] = i;
}
if (j > blksize / 2) {
j = blksize / 2;
++i;
break;
}
}
assert$2(i < Encoder$6.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 k2 = 0; k2 < ni; k2++) {
var w = numlines[k2];
var bark1, bark2;
bark1 = freq2bark(sfreq * j);
bark2 = freq2bark(sfreq * (j + w - 1));
bval[k2] = 0.5 * (bark1 + bark2);
bark1 = freq2bark(sfreq * (j - 0.5));
bark2 = freq2bark(sfreq * (j + w - 0.5));
bval_width[k2] = bark2 - bark1;
j += w;
}
return ni;
}
function init_s3_values(s3ind, npart, bval, bval_width, norm, use_old_s3) {
var s3 = new_float_n$2([Encoder$6.CBANDS, Encoder$6.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 p2 = new_float$6(numberOfNoneZero);
var k2 = 0;
for (var i = 0; i < npart; i++)
for (j = s3ind[i][0]; j <= s3ind[i][1]; j++)
p2[k2++] = s3[i][j];
return p2;
}
function stereo_demask(f2) {
var arg = freq2bark(f2);
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$6(Encoder$6.CBANDS);
var bval_width = new_float$6(Encoder$6.CBANDS);
var norm = new_float$6(Encoder$6.CBANDS);
var sfreq = gfp.out_samplerate;
switch (gfp.experimentalZ) {
default:
case 0:
useOldS3 = true;
break;
case 1:
useOldS3 = gfp.VBR == VbrMode$1.vbr_mtrh || gfp.VBR == VbrMode$1.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$6.NORM_TYPE;
for (i = 0; i < 4; ++i) {
for (var j = 0; j < Encoder$6.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$6.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$6.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$6.BLKSIZE,
gfc.scalefac_band.l,
Encoder$6.BLKSIZE / (2 * 576),
Encoder$6.SBMAX_l
);
assert$2(gfc.npart_l < Encoder$6.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.MAX_VALUE;
for (var k2 = 0; k2 < gfc.numlines_l[i]; k2++, j++) {
var freq = sfreq * j / (1e3 * Encoder$6.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$6.BLKSIZE_s,
gfc.scalefac_band.s,
Encoder$6.BLKSIZE_s / (2 * 192),
Encoder$6.SBMAX_s
);
assert$2(gfc.npart_s < Encoder$6.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.MAX_VALUE;
for (var k2 = 0; k2 < gfc.numlines_s[i]; k2++, j++) {
var freq = sfreq * j / (1e3 * Encoder$6.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$2(gfc.bo_l[Encoder$6.SBMAX_l - 1] <= gfc.npart_l);
assert$2(gfc.bo_s[Encoder$6.SBMAX_s - 1] <= gfc.npart_s);
if (gfp.ATHtype != -1) {
var freq;
var freq_inc = gfp.out_samplerate / Encoder$6.BLKSIZE;
var eql_balance = 0;
freq = 0;
for (i = 0; i < Encoder$6.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$6.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;
}
}
for (var b = j = 0; b < gfc.npart_l; ++b) {
for (i = 0; i < gfc.numlines_l[b]; ++i) {
++j;
}
}
}
j = 0;
for (i = 0; i < gfc.npart_l; i++) {
var freq = sfreq * (j + gfc.numlines_l[i] / 2) / (1 * Encoder$6.BLKSIZE);
gfc.mld_cb_l[i] = stereo_demask(freq);
j += gfc.numlines_l[i];
}
for (; i < Encoder$6.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$6.BLKSIZE_s);
gfc.mld_cb_s[i] = stereo_demask(freq);
j += gfc.numlines_s[i];
}
for (; i < Encoder$6.CBANDS; ++i) {
gfc.mld_cb_s[i] = 1;
}
return 0;
};
function ATHformula_GB(f2, value) {
if (f2 < -0.3)
f2 = 3410;
f2 /= 1e3;
f2 = Math.max(0.1, f2);
var ath = 3.64 * Math.pow(f2, -0.8) - 6.8 * Math.exp(-0.6 * Math.pow(f2 - 3.4, 2)) + 6 * Math.exp(-0.15 * Math.pow(f2 - 8.7, 2)) + (0.6 + 0.04 * value) * 1e-3 * Math.pow(f2, 4);
return ath;
}
this.ATHformula = function(f2, gfp) {
var ath;
switch (gfp.ATHtype) {
case 0:
ath = ATHformula_GB(f2, 9);
break;
case 1:
ath = ATHformula_GB(f2, -1);
break;
case 2:
ath = ATHformula_GB(f2, 0);
break;
case 3:
ath = ATHformula_GB(f2, 1) + 6;
break;
case 4:
ath = ATHformula_GB(f2, gfp.ATHcurve);
break;
default:
ath = ATHformula_GB(f2, 0);
break;
}
return ath;
};
}
var PsyModel_1 = PsyModel;
var MPEGMode = 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.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 Encoder$5 = requireEncoder();
var L3Side$4 = {};
L3Side$4.SFBMAX = Encoder$5.SBMAX_s * 3;
var L3Side_1 = L3Side$4;
var common$e = common$h;
var new_float$5 = common$e.new_float;
var new_int$6 = common$e.new_int;
var L3Side$3 = L3Side_1;
function GrInfo$1() {
this.xr = new_float$5(576);
this.l3_enc = new_int$6(576);
this.scalefac = new_int$6(L3Side$3.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$6(3);
this.subblock_gain = new_int$6(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$6(L3Side$3.SFBMAX);
this.window = new_int$6(L3Side$3.SFBMAX);
this.count1bits = 0;
this.sfb_partition_table = null;
this.slen = new_int$6(4);
this.max_nonzero_coeff = 0;
var self2 = this;
function clone_int(array) {
return new Int32Array(array);
}
function clone_float(array) {
return new Float32Array(array);
}
this.assign = function(other) {
self2.xr = clone_float(other.xr);
self2.l3_enc = clone_int(other.l3_enc);
self2.scalefac = clone_int(other.scalefac);
self2.xrpow_max = other.xrpow_max;
self2.part2_3_length = other.part2_3_length;
self2.big_values = other.big_values;
self2.count1 = other.count1;
self2.global_gain = other.global_gain;
self2.scalefac_compress = other.scalefac_compress;
self2.block_type = other.block_type;
self2.mixed_block_flag = other.mixed_block_flag;
self2.table_select = clone_int(other.table_select);
self2.subblock_gain = clone_int(other.subblock_gain);
self2.region0_count = other.region0_count;
self2.region1_count = other.region1_count;
self2.preflag = other.preflag;
self2.scalefac_scale = other.scalefac_scale;
self2.count1table_select = other.count1table_select;
self2.part2_length = other.part2_length;
self2.sfb_lmax = other.sfb_lmax;
self2.sfb_smin = other.sfb_smin;
self2.psy_lmax = other.psy_lmax;
self2.sfbmax = other.sfbmax;
self2.psymax = other.psymax;
self2.sfbdivide = other.sfbdivide;
self2.width = clone_int(other.width);
self2.window = clone_int(other.window);
self2.count1bits = other.count1bits;
self2.sfb_partition_table = other.sfb_partition_table.slice(0);
self2.slen = clone_int(other.slen);
self2.max_nonzero_coeff = other.max_nonzero_coeff;
};
}
var GrInfo_1 = GrInfo$1;
var common$d = common$h;
var new_int$5 = common$d.new_int;
var GrInfo = GrInfo_1;
function IIISideInfo$1() {
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$5(4), new_int$5(4)];
for (var gr = 0; gr < 2; gr++) {
for (var ch = 0; ch < 2; ch++) {
this.tt[gr][ch] = new GrInfo();
}
}
}
var IIISideInfo_1 = IIISideInfo$1;
var common$c = common$h;
var System$2 = common$c.System;
var new_int$4 = common$c.new_int;
var Encoder$4 = requireEncoder();
function ScaleFac$1(arrL, arrS, arr21, arr12) {
this.l = new_int$4(1 + Encoder$4.SBMAX_l);
this.s = new_int$4(1 + Encoder$4.SBMAX_s);
this.psfb21 = new_int$4(1 + Encoder$4.PSFB21);
this.psfb12 = new_int$4(1 + Encoder$4.PSFB12);
var l2 = 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$2.arraycopy(this.arrL, 0, l2, 0, Math.min(this.arrL.length, this.l.length));
System$2.arraycopy(this.arrS, 0, s, 0, Math.min(this.arrS.length, this.s.length));
System$2.arraycopy(this.arr21, 0, this.psfb21, 0, Math.min(this.arr21.length, this.psfb21.length));
System$2.arraycopy(this.arr12, 0, this.psfb12, 0, Math.min(this.arr12.length, this.psfb12.length));
}
}
var ScaleFac_1 = ScaleFac$1;
var common$b = common$h;
var new_float$4 = common$b.new_float;
var new_float_n$1 = common$b.new_float_n;
var new_int$3 = common$b.new_int;
var Encoder$3 = requireEncoder();
function NsPsy$1() {
this.last_en_subshort = new_float_n$1([4, 9]);
this.lastAttacks = new_int$3(4);
this.pefirbuf = new_float$4(19);
this.longfact = new_float$4(Encoder$3.SBMAX_l);
this.shortfact = new_float$4(Encoder$3.SBMAX_s);
this.attackthre = 0;
this.attackthre_s = 0;
}
var NsPsy_1 = NsPsy$1;
function VBRSeekInfo$1() {
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$1;
var common$a = common$h;
var new_byte$1 = common$a.new_byte;
var new_double = common$a.new_double;
var new_float$3 = common$a.new_float;
var new_float_n = common$a.new_float_n;
var new_int$2 = common$a.new_int;
var new_int_n = common$a.new_int_n;
var IIISideInfo = IIISideInfo_1;
var ScaleFac = ScaleFac_1;
var NsPsy = NsPsy_1;
var VBRSeekInfo = VBRSeekInfo_1;
var III_psy_xmin = requireIII_psy_xmin();
var Encoder$2 = requireEncoder();
var L3Side$2 = L3Side_1;
LameInternalFlags$1.MFSIZE = 3 * 1152 + Encoder$2.ENCDELAY - Encoder$2.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([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();
this.ms_ratio = new_float$3(2);
this.padding = 0;
this.frac_SpF = 0;
this.slot_lag = 0;
this.tag_spec = null;
this.nMusicCRC = 0;
this.OldValue = new_int$2(2);
this.CurrentStep = new_int$2(2);
this.masking_lower = 0;
this.bv_scf = new_int$2(576);
this.pseudohalf = new_int$2(L3Side$2.SFBMAX);
this.sfb21_extra = false;
this.inbuf_old = new Array(2);
this.blackfilt = new Array(2 * LameInternalFlags$1.BPC + 1);
this.itime = new_double(2);
this.sideinfo_len = 0;
this.sb_sample = new_float_n([2, 2, 18, Encoder$2.SBLIMIT]);
this.amp_filter = new_float$3(32);
function Header() {
this.write_timing = 0;
this.ptr = 0;
this.buf = new_byte$1(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();
this.minval_l = new_float$3(Encoder$2.CBANDS);
this.minval_s = new_float$3(Encoder$2.CBANDS);
this.nb_1 = new_float_n([4, Encoder$2.CBANDS]);
this.nb_2 = new_float_n([4, Encoder$2.CBANDS]);
this.nb_s1 = new_float_n([4, Encoder$2.CBANDS]);
this.nb_s2 = new_float_n([4, Encoder$2.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$3(4);
this.loudness_sq = new_float_n([2, 2]);
this.loudness_sq_save = new_float$3(2);
this.mld_l = new_float$3(Encoder$2.SBMAX_l);
this.mld_s = new_float$3(Encoder$2.SBMAX_s);
this.bm_l = new_int$2(Encoder$2.SBMAX_l);
this.bo_l = new_int$2(Encoder$2.SBMAX_l);
this.bm_s = new_int$2(Encoder$2.SBMAX_s);
this.bo_s = new_int$2(Encoder$2.SBMAX_s);
this.npart_l = 0;
this.npart_s = 0;
this.s3ind = new_int_n([Encoder$2.CBANDS, 2]);
this.s3ind_s = new_int_n([Encoder$2.CBANDS, 2]);
this.numlines_s = new_int$2(Encoder$2.CBANDS);
this.numlines_l = new_int$2(Encoder$2.CBANDS);
this.rnumlines_l = new_float$3(Encoder$2.CBANDS);
this.mld_cb_l = new_float$3(Encoder$2.CBANDS);
this.mld_cb_s = new_float$3(Encoder$2.CBANDS);
this.numlines_s_num1 = 0;
this.numlines_l_num1 = 0;
this.pe = new_float$3(4);
this.ms_ratio_s_old = 0;
this.ms_ratio_l_old = 0;
this.ms_ener_ratio_old = 0;
this.blocktype_old = new_int$2(2);
this.nsPsy = new NsPsy();
this.VBR_seek_table = new VBRSeekInfo();
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([16, 4 + 1]);
this.bitrate_blockType_Hist = new_int_n([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();
}
for (var i = 0; i < this.thm.length; i++) {
this.thm[i] = new III_psy_xmin();
}
for (var i = 0; i < this.header.length; i++) {
this.header[i] = new Header();
}
}
var LameInternalFlags_1 = LameInternalFlags$1;
var common$9 = common$h;
var new_float$2 = common$9.new_float;
var Encoder$1 = requireEncoder();
function ATH() {
this.useAdjust = 0;
this.aaSensitivityP = 0;
this.adjust = 0;
this.adjustLimit = 0;
this.decay = 0;
this.floor = 0;
this.l = new_float$2(Encoder$1.SBMAX_l);
this.s = new_float$2(Encoder$1.SBMAX_s);
this.psfb21 = new_float$2(Encoder$1.PSFB21);
this.psfb12 = new_float$2(Encoder$1.PSFB12);
this.cb_l = new_float$2(Encoder$1.CBANDS);
this.cb_s = new_float$2(Encoder$1.CBANDS);
this.eql_w = new_float$2(Encoder$1.BLKSIZE / 2);
}
var ATH_1 = ATH;
var common$8 = common$h;
var System$1 = common$8.System;
var Arrays$1 = common$8.Arrays;
GainAnalysis$2.STEPS_per_dB = 100;
GainAnalysis$2.MAX_dB = 120;
GainAnalysis$2.GAIN_NOT_ENOUGH_SAMPLES = -24601;
GainAnalysis$2.GAIN_ANALYSIS_ERROR = 0;
GainAnalysis$2.GAIN_ANALYSIS_OK = 1;
GainAnalysis$2.INIT_GAIN_ANALYSIS_ERROR = 0;
GainAnalysis$2.INIT_GAIN_ANALYSIS_OK = 1;
GainAnalysis$2.YULE_ORDER = 10;
GainAnalysis$2.MAX_ORDER = GainAnalysis$2.YULE_ORDER;
GainAnalysis$2.MAX_SAMP_FREQ = 48e3;
GainAnalysis$2.RMS_WINDOW_TIME_NUMERATOR = 1;
GainAnalysis$2.RMS_WINDOW_TIME_DENOMINATOR = 20;
GainAnalysis$2.MAX_SAMPLES_PER_WINDOW = GainAnalysis$2.MAX_SAMP_FREQ * GainAnalysis$2.RMS_WINDOW_TIME_NUMERATOR / GainAnalysis$2.RMS_WINDOW_TIME_DENOMINATOR + 1;
function GainAnalysis$2() {
var PINK_REF = 64.82;
var RMS_PERCENTILE = 0.95;
var RMS_WINDOW_TIME_NUMERATOR = GainAnalysis$2.RMS_WINDOW_TIME_NUMERATOR;
var RMS_WINDOW_TIME_DENOMINATOR = GainAnalysis$2.RMS_WINDOW_TIME_DENOMINATOR;
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$1.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$1.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$1.arraycopy(
left_samples,
left_samplesPos,
rgData.linprebuf,
MAX_ORDER,
num_samples
);
System$1.arraycopy(
right_samples,
right_samplesPos,
rgData.rinprebuf,
MAX_ORDER,
num_samples
);
} else {
System$1.arraycopy(
left_samples,
left_samplesPos,
rgData.linprebuf,
MAX_ORDER,
MAX_ORDER
);
System$1.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$2.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$1.arraycopy(
rgData.loutbuf,
rgData.totsamp,
rgData.loutbuf,
0,
MAX_ORDER
);
System$1.arraycopy(
rgData.routbuf,
rgData.totsamp,
rgData.routbuf,
0,
MAX_ORDER
);
System$1.arraycopy(
rgData.lstepbuf,
rgData.totsamp,
rgData.lstepbuf,
0,
MAX_ORDER
);
System$1.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$1.arraycopy(
rgData.linprebuf,
num_samples,
rgData.linprebuf,
0,
MAX_ORDER - num_samples
);
System$1.arraycopy(
rgData.rinprebuf,
num_samples,
rgData.rinprebuf,
0,
MAX_ORDER - num_samples
);
System$1.arraycopy(
left_samples,
left_samplesPos,
rgData.linprebuf,
MAX_ORDER - num_samples,
num_samples
);
System$1.arraycopy(
right_samples,
right_samplesPos,
rgData.rinprebuf,
MAX_ORDER - num_samples,
num_samples
);
} else {
System$1.arraycopy(left_samples, left_samplesPos + num_samples - MAX_ORDER, rgData.linprebuf, 0, MAX_ORDER);
System$1.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$2.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$2;
var common$7 = common$h;
var new_float$1 = common$7.new_float;
var new_int$1 = common$7.new_int;
var GainAnalysis$1 = GainAnalysis_1;
function ReplayGain() {
this.linprebuf = new_float$1(GainAnalysis$1.MAX_ORDER * 2);
this.linpre = 0;
this.lstepbuf = new_float$1(GainAnalysis$1.MAX_SAMPLES_PER_WINDOW + GainAnalysis$1.MAX_ORDER);
this.lstep = 0;
this.loutbuf = new_float$1(GainAnalysis$1.MAX_SAMPLES_PER_WINDOW + GainAnalysis$1.MAX_ORDER);
this.lout = 0;
this.rinprebuf = new_float$1(GainAnalysis$1.MAX_ORDER * 2);
this.rinpre = 0;
this.rstepbuf = new_float$1(GainAnalysis$1.MAX_SAMPLES_PER_WINDOW + GainAnalysis$1.MAX_ORDER);
this.rstep = 0;
this.routbuf = new_float$1(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$1(0 | GainAnalysis$1.STEPS_per_dB * GainAnalysis$1.MAX_dB);
this.B = new_int$1(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 common$6 = common$h;
var new_float = common$6.new_float;
var new_int = common$6.new_int;
var assert$1 = common$6.assert;
var MeanBits = MeanBits_1;
var Encoder = requireEncoder();
var L3Side$1 = L3Side_1;
var LameInternalFlags = LameInternalFlags_1;
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(L3Side$1.SFBMAX);
var xrpow = new_float(576);
var targ_bits = new_int(2);
var mean_bits = 0, max_bits;
var l3_side = gfc.l3_side;
var mb = new MeanBits(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.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.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$1(cod_info.part2_3_length <= LameInternalFlags.MAX_BITS_PER_CHANNEL);
assert$1(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 QuantizePVT_1;
var hasRequiredQuantizePVT;
function requireQuantizePVT() {
if (hasRequiredQuantizePVT) return QuantizePVT_1;
hasRequiredQuantizePVT = 1;
var ScaleFac2 = ScaleFac_1;
var common2 = common$h;
var VbrMode2 = common2.VbrMode;
var Float2 = common2.Float;
var Util2 = common2.Util;
var new_float2 = common2.new_float;
var new_int2 = common2.new_int;
var assert2 = common2.assert;
var Encoder2 = requireEncoder();
var MeanBits2 = MeanBits_1;
var LameInternalFlags2 = LameInternalFlags_1;
QuantizePVT.Q_MAX = 256 + 1;
QuantizePVT.Q_MAX2 = 116;
QuantizePVT.LARGE_BITS = 1e5;
QuantizePVT.IXMAX_VAL = 8206;
function QuantizePVT() {
var BitStream = requireBitStream();
var tak = null;
var rv = null;
var psy = null;
this.setModules = function(_tk, _rv, _psy) {
tak = _tk;
rv = _rv;
psy = _psy;
};
function POW20(x) {
assert2(0 <= x + QuantizePVT.Q_MAX2 && x < QuantizePVT.Q_MAX);
return pow20[x + QuantizePVT.Q_MAX2];
}
this.IPOW20 = function(x) {
assert2(0 <= x && x < QuantizePVT.Q_MAX);
return ipow20[x];
};
var DBL_EPSILON = 2220446049250313e-31;
var IXMAX_VAL = QuantizePVT.IXMAX_VAL;
var PRECALC_SIZE = IXMAX_VAL + 2;
var Q_MAX = QuantizePVT.Q_MAX;
var Q_MAX2 = QuantizePVT.Q_MAX2;
QuantizePVT.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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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_float2(Q_MAX + Q_MAX2 + 1);
var ipow20 = new_float2(Q_MAX);
var pow43 = new_float2(PRECALC_SIZE);
var adj43 = new_float2(PRECALC_SIZE);
this.adj43 = adj43;
function ATHmdct(gfp, f2) {
var ath = psy.ATHformula(f2, 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 < Encoder2.SBMAX_l; sfb++) {
var start = gfc.scalefac_band.l[sfb];
var end = gfc.scalefac_band.l[sfb + 1];
ATH_l[sfb] = Float2.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 < Encoder2.PSFB21; sfb++) {
var start = gfc.scalefac_band.psfb21[sfb];
var end = gfc.scalefac_band.psfb21[sfb + 1];
ATH_psfb21[sfb] = Float2.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 < Encoder2.SBMAX_s; sfb++) {
var start = gfc.scalefac_band.s[sfb];
var end = gfc.scalefac_band.s[sfb + 1];
ATH_s[sfb] = Float2.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 < Encoder2.PSFB12; sfb++) {
var start = gfc.scalefac_band.psfb12[sfb];
var end = gfc.scalefac_band.psfb12[sfb + 1];
ATH_psfb12[sfb] = Float2.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 < Encoder2.SBMAX_l; sfb++) {
ATH_l[sfb] = 1e-20;
}
for (var sfb = 0; sfb < Encoder2.PSFB21; sfb++) {
ATH_psfb21[sfb] = 1e-20;
}
for (var sfb = 0; sfb < Encoder2.SBMAX_s; sfb++) {
ATH_s[sfb] = 1e-20;
}
for (var sfb = 0; sfb < Encoder2.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 < Encoder2.SBMAX_l; i++) {
var f2;
if (i <= 6)
f2 = bass;
else if (i <= 13)
f2 = alto;
else if (i <= 20)
f2 = treble;
else
f2 = sfb21;
gfc.nsPsy.longfact[i] = f2;
}
for (i = 0; i < Encoder2.SBMAX_s; i++) {
var f2;
if (i <= 5)
f2 = bass;
else if (i <= 10)
f2 = alto;
else if (i <= 11)
f2 = treble;
else
f2 = sfb21;
gfc.nsPsy.shortfact[i] = f2;
}
}
}
};
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_int2(2);
var ch;
var mb = new MeanBits2(tbits);
var extra_bits = rv.ResvMaxBits(gfp, mean_bits, mb, cbr);
tbits = mb.bits;
var max_bits = tbits + extra_bits;
if (max_bits > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
max_bits = LameInternalFlags2.MAX_BITS_PER_GRANULE;
}
for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
targ_bits[ch] = Math.min(
LameInternalFlags2.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] > LameInternalFlags2.MAX_BITS_PER_CHANNEL)
add_bits[ch] = Math.max(
0,
LameInternalFlags2.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 > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
var sum = 0;
for (ch = 0; ch < gfc.channels_out; ++ch) {
targ_bits[ch] *= LameInternalFlags2.MAX_BITS_PER_GRANULE;
targ_bits[ch] /= bits;
sum += targ_bits[ch];
}
}
return max_bits;
};
this.reduce_side = function(targ_bits, ms_ener_ratio, mean_bits, max_bits) {
assert2(targ_bits[0] + targ_bits[1] <= LameInternalFlags2.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 > LameInternalFlags2.MAX_BITS_PER_CHANNEL - targ_bits[0]) {
move_bits = LameInternalFlags2.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;
}
assert2(targ_bits[0] <= LameInternalFlags2.MAX_BITS_PER_CHANNEL);
assert2(targ_bits[1] <= LameInternalFlags2.MAX_BITS_PER_CHANNEL);
assert2(targ_bits[0] + targ_bits[1] <= LameInternalFlags2.MAX_BITS_PER_GRANULE);
};
this.athAdjust = function(a, x, athFloor) {
var o = 90.30873362;
var p2 = 94.82444863;
var u = Util2.FAST_LOG10_X(x, 10);
var v = a * a;
var w = 0;
u -= athFloor;
if (v > 1e-20)
w = 1 + Util2.FAST_LOG10_X(v, 10 / o);
if (w < 0)
w = 0;
u *= w;
u += athFloor + o - p2;
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 == VbrMode2.vbr_mtrh ? 1 : 0;
var masking_lower = gfc.masking_lower;
if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
masking_lower = 1;
}
for (gsfb = 0; gsfb < cod_info.psy_lmax; gsfb++) {
var en0, xmin;
var rh1, rh2;
var width, l2;
if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.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;
l2 = 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 (--l2 > 0);
if (en0 > xmin)
ath_over++;
if (gsfb == Encoder2.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 != Encoder2.SHORT_TYPE) {
var k2 = 576;
while (k2-- != 0 && BitStream.EQ(xr[k2], 0)) {
max_nonzero = k2;
}
}
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 == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.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 l2 = 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 (--l2 > 0);
if (en0 > tmpATH)
ath_over++;
if (sfb == Encoder2.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, l2, step) {
var noise = 0;
var j = startline.s;
var ix = cod_info.l3_enc;
if (j > cod_info.count1) {
while (l2-- != 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_float2(2);
ix01[0] = 0;
ix01[1] = step;
while (l2-- != 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 (l2-- != 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, l2, 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);
l2 = 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)
l2 = usefullsize >> 1;
else
l2 = 0;
}
var sl = new StartLine(j);
noise = this.calc_noise_core(cod_info, sl, l2, 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 = Util2.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 l2;
var en0, en1;
var ifqstep = cod_info.scalefac_scale == 0 ? 0.5 : 1;
var scalefac = cod_info.scalefac;
var l3_xmin = new_float2(L3Side.SFBMAX);
var xfsf = new_float2(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 != Encoder2.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 < Encoder2.SBPSY_l) {
assert2(scalefac[sfb] >= 0);
gfc.pinfo.LAMEsfb[gr][ch][sfb] -= ifqstep * scalefac[sfb];
}
}
if (cod_info.block_type == Encoder2.SHORT_TYPE) {
sfb2 = sfb;
for (sfb = cod_info.sfb_smin; sfb < Encoder2.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, l2 = start; l2 < end; l2++) {
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 < Encoder2.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;
};
}
QuantizePVT_1 = QuantizePVT;
return QuantizePVT_1;
}
var Takehiro_1;
var hasRequiredTakehiro;
function requireTakehiro() {
if (hasRequiredTakehiro) return Takehiro_1;
hasRequiredTakehiro = 1;
var common2 = common$h;
var System2 = common2.System;
var Arrays2 = common2.Arrays;
var new_int2 = common2.new_int;
var assert2 = common2.assert;
var Encoder2 = requireEncoder();
var Tables2 = Tables_1;
var GrInfo2 = GrInfo_1;
var QuantizePVT = requireQuantizePVT();
function Takehiro() {
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(l2, istep, xr, xrPos, ix, ixPos) {
var compareval0 = (1 - 0.4054) / istep;
l2 = l2 >> 1;
while (l2-- != 0) {
ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
}
}
function quantize_lines_xrpow(l2, istep, xr, xrPos, ix, ixPos) {
l2 = l2 >> 1;
var remaining = l2 % 2;
l2 = l2 >> 1;
while (l2-- != 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 == Encoder2.SHORT_TYPE)
sfbmax = 38;
else
sfbmax = 21;
for (sfb = 0; sfb <= sfbmax; sfb++) {
var step = -1;
if (prev_data_use || codInfo.block_type == Encoder2.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;
}
assert2(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 l2 = codInfo.width[sfb];
if (j + codInfo.width[sfb] > codInfo.max_nonzero_coeff) {
var usefullsize;
usefullsize = codInfo.max_nonzero_coeff - j + 1;
Arrays2.fill(pi, codInfo.max_nonzero_coeff, 576, 0);
l2 = usefullsize;
if (l2 < 0) {
l2 = 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 += l2;
} 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 += l2;
}
if (l2 <= 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 = Tables2.ht[t1].xlen * 65536 + Tables2.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 += Tables2.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 = Tables2.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 = Tables2.ht[t1].xlen;
var hlen;
if (t1 == 2)
hlen = Tables2.table23;
else
hlen = Tables2.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 = Tables2.ht[t1].xlen;
var hlen1 = Tables2.ht[t1].hlen;
var hlen2 = Tables2.ht[t1 + 1].hlen;
var hlen3 = Tables2.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.IXMAX_VAL) {
s.bits = QuantizePVT.LARGE_BITS;
return -1;
}
max -= 15;
var choice2;
for (choice2 = 24; choice2 < 32; choice2++) {
if (Tables2.ht[choice2].linmax >= max) {
break;
}
}
var choice;
for (choice = choice2 - 8; choice < 24; choice++) {
if (Tables2.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 p2;
if (((ix[i - 1] | ix[i - 2] | ix[i - 3] | ix[i - 4]) & 2147483647) > 1) {
break;
}
p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
a1 += Tables2.t32l[p2];
a2 += Tables2.t33l[p2];
}
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 == Encoder2.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 == Encoder2.NORM_TYPE) {
a1 = gi.region0_count = gfc.bv_scf[i - 2];
a2 = gi.region1_count = gfc.bv_scf[i - 1];
assert2(a1 + a2 + 2 < Encoder2.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 = Encoder2.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);
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 == Encoder2.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.IXMAX_VAL / qupvt.IPOW20(gi.global_gain);
if (gi.xrpow_max > w)
return QuantizePVT.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];
if (0 == gfc.pseudohalf[sfb]) {
j += width;
} else {
var k2;
for (k2 = j, j += width; k2 < j; ++k2) {
ix[k2] = xr[k2] >= roundfac ? ix[k2] : 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.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 < Encoder2.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 GrInfo2();
var ix = gi.l3_enc;
var r01_bits = new_int2(7 + 15 + 1);
var r01_div = new_int2(7 + 15 + 1);
var r0_tbl = new_int2(7 + 15 + 1);
var r1_tbl = new_int2(7 + 15 + 1);
if (gi.block_type == Encoder2.SHORT_TYPE && gfc.mode_gr == 1)
return;
cod_info2.assign(gi);
if (gi.block_type == Encoder2.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;
for (; i > cod_info2.big_values; i -= 4) {
var p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
a1 += Tables2.t32l[p2];
a2 += Tables2.t33l[p2];
}
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 == Encoder2.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.slen1_tab = slen1_tab;
Takehiro.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 < Tables2.scfsi_band.length - 1; i++) {
for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.scfsi_band[i + 1]; sfb++) {
if (g0.scalefac[sfb] != gi.scalefac[sfb] && gi.scalefac[sfb] >= 0)
break;
}
if (sfb == Tables2.scfsi_band[i + 1]) {
for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.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 < Encoder2.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, l2;
var recalc = 0;
j = 0;
for (sfb = 0; sfb < gi.sfbmax; sfb++) {
var width = gi.width[sfb];
j += width;
for (l2 = -width; l2 < 0; l2++) {
if (gi.l3_enc[l2 + j] != 0)
break;
}
if (l2 == 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 != Encoder2.SHORT_TYPE && gfc.mode_gr == 2) {
for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
if (gi.scalefac[sfb] < qupvt.pretab[sfb] && gi.scalefac[sfb] != -2)
break;
if (sfb == Encoder2.SBPSY_l) {
for (sfb = 11; sfb < Encoder2.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 != Encoder2.SHORT_TYPE && l3_side.tt[1][ch].block_type != Encoder2.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, n2) {
for (var i = 0; i < n2; ++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 k2, sfb, max_slen1 = 0, max_slen2 = 0;
var tab;
var scalefac = cod_info.scalefac;
assert2(all_scalefactors_not_negative(scalefac, cod_info.sfbmax));
if (cod_info.block_type == Encoder2.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 < Encoder2.SBPSY_l; sfb++)
if (scalefac[sfb] < qupvt.pretab[sfb])
break;
if (sfb == Encoder2.SBPSY_l) {
cod_info.preflag = 1;
for (sfb = 11; sfb < Encoder2.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.LARGE_BITS;
for (k2 = 0; k2 < 16; k2++) {
if (max_slen1 < slen1_n[k2] && max_slen2 < slen2_n[k2] && cod_info.part2_length > tab[k2]) {
cod_info.part2_length = tab[k2];
cod_info.scalefac_compress = k2;
}
}
return cod_info.part2_length == QuantizePVT.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_int2(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 == Encoder2.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:
System2.err.printf("intensity stereo not implemented yet\n");
break;
}
}
if (!over) {
assert2(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;
}
};
}
Takehiro_1 = Takehiro;
return Takehiro_1;
}
var BitStream_1;
var hasRequiredBitStream;
function requireBitStream() {
if (hasRequiredBitStream) return BitStream_1;
hasRequiredBitStream = 1;
var common2 = common$h;
var System2 = common2.System;
var Arrays2 = common2.Arrays;
var new_byte2 = common2.new_byte;
var new_float_n2 = common2.new_float_n;
var new_int2 = common2.new_int;
var assert2 = common2.assert;
var Takehiro = requireTakehiro();
var Tables2 = Tables_1;
var Encoder2 = requireEncoder();
var LameInternalFlags2 = LameInternalFlags_1;
var Lame2 = requireLame();
BitStream.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.NEQ = function(a, b) {
return !BitStream.EQ(a, b);
};
function BitStream() {
var self2 = this;
var CRC16_POLYNOMIAL = 32773;
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 = Tables2.bitrate_table[gfp.version][gfc.bitrate_index];
else
bit_rate = gfp.brate;
var bytes = 0 | (gfp.version + 1) * 72e3 * bit_rate / gfp.out_samplerate + gfc.padding;
return 8 * bytes;
};
function putheader_bits(gfc) {
System2.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 & LameInternalFlags2.MAX_HEADER_BUF - 1;
}
function putbits2(gfc, val, j) {
while (j > 0) {
var k2;
if (bufBitIdx == 0) {
bufBitIdx = 8;
bufByteIdx++;
assert2(bufByteIdx < Lame2.LAME_MAXMP3BUFFER);
assert2(gfc.header[gfc.w_ptr].write_timing >= totbit);
if (gfc.header[gfc.w_ptr].write_timing == totbit) {
putheader_bits(gfc);
}
buf[bufByteIdx] = 0;
}
k2 = Math.min(j, bufBitIdx);
j -= k2;
bufBitIdx -= k2;
buf[bufByteIdx] |= val >> j << bufBitIdx;
totbit += k2;
}
}
function putbits_noheaders(gfc, val, j) {
while (j > 0) {
var k2;
if (bufBitIdx == 0) {
bufBitIdx = 8;
bufByteIdx++;
assert2(bufByteIdx < Lame2.LAME_MAXMP3BUFFER);
buf[bufByteIdx] = 0;
}
k2 = Math.min(j, bufBitIdx);
j -= k2;
bufBitIdx -= k2;
buf[bufByteIdx] |= val >> j << bufBitIdx;
totbit += k2;
}
}
function drain_into_ancillary(gfp, remainingBits) {
var gfc = gfp.internal_flags;
var i;
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;
}
}
function writeheader(gfc, val, j) {
var ptr = gfc.header[gfc.h_ptr].ptr;
while (j > 0) {
var k2 = Math.min(j, 8 - (ptr & 7));
j -= k2;
gfc.header[gfc.h_ptr].buf[ptr >> 3] |= val >> j << 8 - (ptr & 7) - k2;
ptr += k2;
}
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;
Arrays2.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) {
assert2(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 != Encoder2.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);
assert2(0 <= gi.region0_count && gi.region0_count < 16);
assert2(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 {
assert2(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 != Encoder2.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);
assert2(0 <= gi.region0_count && gi.region0_count < 16);
assert2(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;
assert2(gfc.header[old].ptr == gfc.sideinfo_len * 8);
gfc.h_ptr = old + 1 & LameInternalFlags2.MAX_HEADER_BUF - 1;
gfc.header[gfc.h_ptr].write_timing = gfc.header[old].write_timing + bitsPerFrame;
if (gfc.h_ptr == gfc.w_ptr) {
System2.err.println("Error: MAX_HEADER_BUF too small in bitstream.c \n");
}
}
}
function huffman_coder_count1(gfc, gi) {
var h = Tables2.ht[gi.count1table_select + 32];
var i, bits = 0;
var ix = gi.big_values;
var xr = gi.big_values;
assert2(gi.count1table_select < 2);
for (i = (gi.count1 - gi.big_values) / 4; i > 0; --i) {
var huffbits = 0;
var p2 = 0, v;
v = gi.l3_enc[ix + 0];
if (v != 0) {
p2 += 8;
if (gi.xr[xr + 0] < 0)
huffbits++;
}
v = gi.l3_enc[ix + 1];
if (v != 0) {
p2 += 4;
huffbits *= 2;
if (gi.xr[xr + 1] < 0)
huffbits++;
}
v = gi.l3_enc[ix + 2];
if (v != 0) {
p2 += 2;
huffbits *= 2;
if (gi.xr[xr + 2] < 0)
huffbits++;
}
v = gi.l3_enc[ix + 3];
if (v != 0) {
p2++;
huffbits *= 2;
if (gi.xr[xr + 3] < 0)
huffbits++;
}
ix += 4;
xr += 4;
putbits2(gfc, huffbits + h.table[p2], h.hlen[p2]);
bits += h.hlen[p2];
}
return bits;
}
function Huffmancode(gfc, tableindex, start, end, gi) {
var h = Tables2.ht[tableindex];
var bits = 0;
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;
assert2(linbits_x1 <= h.linmax);
ext |= linbits_x1 << 1;
xbits = linbits;
x1 = 15;
}
if (x2 > 14) {
var linbits_x2 = x2 - 15;
assert2(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--;
}
x1 = x1 * xlen + x2;
xbits -= cbits;
cbits += h.hlen[x1];
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;
var i = gi.region0_count + 1;
assert2(i < gfc.scalefac_band.l.length);
region1Start = gfc.scalefac_band.l[i];
i += gi.region1_count + 1;
assert2(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.slen1_tab[gi.scalefac_compress];
var slen2 = Takehiro.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;
}
assert2(data_bits == gi.part2_length);
if (gi.block_type == Encoder2.SHORT_TYPE) {
data_bits += ShortHuffmancodebits(gfc, gi);
} else {
data_bits += LongHuffmancodebits(gfc, gi);
}
data_bits += huffman_coder_count1(gfc, gi);
assert2(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;
assert2(gi.sfb_partition_table != null);
data_bits = 0;
sfb = 0;
sfb_partition = 0;
if (gi.block_type == Encoder2.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);
assert2(data_bits == gi.part2_3_length);
assert2(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 = LameInternalFlags2.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 + LameInternalFlags2.MAX_HEADER_BUF;
flushbits -= remaining_headers * 8 * gfc.sideinfo_len;
}
bitsPerFrame = self2.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) {
System2.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 = LameInternalFlags2.MAX_HEADER_BUF - 1;
l3_side = gfc.l3_side;
if ((flushbits = compute_flushbits(gfp, new TotalBytes())) < 0)
return;
drain_into_ancillary(gfp, flushbits);
assert2(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);
assert2(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, n2) {
var gfc = gfp.internal_flags;
var i;
while (n2-- > 0) {
putbits_noheaders(gfc, val, 8);
for (i = 0; i < LameInternalFlags2.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) {
System2.err.println("Internal buffer inconsistency. flushbits <> ResvSize");
}
if (l3_side.main_data_begin * 8 != gfc.ResvSize) {
System2.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
);
System2.err.println("This is a fatal error. It has several possible causes:");
System2.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations");
System2.err.println(" 9%% Your system is overclocked");
System2.err.println(" 1%% bug in LAME encoding library");
gfc.ResvSize = l3_side.main_data_begin * 8;
}
if (totbit > 1e9) {
var i;
for (i = 0; i < LameInternalFlags2.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;
}
System2.arraycopy(buf, 0, buffer, bufferPos, minimum);
bufByteIdx = -1;
bufBitIdx = 0;
if (mp3data != 0) {
var crc = new_int2(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_n2([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) {
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_byte2(Lame2.LAME_MAXMP3BUFFER);
gfc.h_ptr = gfc.w_ptr = 0;
gfc.header[gfc.h_ptr].write_timing = 0;
bufByteIdx = -1;
bufBitIdx = 0;
totbit = 0;
};
}
BitStream_1 = BitStream;
return BitStream_1;
}
var Lame_1;
var hasRequiredLame;
function requireLame() {
if (hasRequiredLame) return Lame_1;
hasRequiredLame = 1;
var common2 = common$h;
var System2 = common2.System;
var VbrMode2 = common2.VbrMode;
var ShortBlock2 = common2.ShortBlock;
var new_float2 = common2.new_float;
var new_int_n2 = common2.new_int_n;
var new_short_n2 = common2.new_short_n;
var assert2 = common2.assert;
var PsyModel2 = PsyModel_1;
var LameGlobalFlags2 = LameGlobalFlags_1;
var LameInternalFlags2 = LameInternalFlags_1;
var ATH2 = ATH_1;
var ReplayGain2 = ReplayGain_1;
var CBRNewIterationLoop2 = CBRNewIterationLoop_1;
var BitStream = requireBitStream();
var Tables2 = Tables_1;
var Encoder2 = requireEncoder();
var MPEGMode2 = MPEGMode_1;
function Lame2() {
var self2 = this;
var LAME_MAXALBUMART = 128 * 1024;
Lame2.V9 = 410;
Lame2.V8 = 420;
Lame2.V7 = 430;
Lame2.V6 = 440;
Lame2.V5 = 450;
Lame2.V4 = 460;
Lame2.V3 = 470;
Lame2.V2 = 480;
Lame2.V1 = 490;
Lame2.V0 = 500;
Lame2.R3MIX = 1e3;
Lame2.STANDARD = 1001;
Lame2.EXTREME = 1002;
Lame2.INSANE = 1003;
Lame2.STANDARD_FAST = 1004;
Lame2.EXTREME_FAST = 1005;
Lame2.MEDIUM = 1006;
Lame2.MEDIUM_FAST = 1007;
var LAME_MAXMP3BUFFER = 16384 + LAME_MAXALBUMART;
Lame2.LAME_MAXMP3BUFFER = LAME_MAXMP3BUFFER;
var ga;
var bs;
var p2;
var qupvt;
var qu;
var psy = new PsyModel2();
var vbr;
var id3;
var mpglib;
this.enc = new Encoder2();
this.setModules = function(_ga, _bs, _p, _qupvt, _qu, _vbr, _ver, _id3, _mpglib) {
ga = _ga;
bs = _bs;
p2 = _p;
qupvt = _qupvt;
qu = _qu;
vbr = _vbr;
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_float2(Encoder2.SBMAX_l);
this.bo_s_weight = new_float2(Encoder2.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 LameInternalFlags2();
gfp.mode = MPEGMode2.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 = VbrMode2.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 = Encoder2.ENCDELAY + Encoder2.POSTDELAY;
gfp.encoder_padding = 0;
gfc.mf_size = Encoder2.ENCDELAY - Encoder2.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 LameGlobalFlags2();
lame_init_old(gfp);
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 = Tables2.bitrate_table[version][1];
for (var i = 2; i <= 14; i++) {
if (Tables2.bitrate_table[version][i] > 0) {
if (Math.abs(Tables2.bitrate_table[version][i] - bRate) < Math.abs(bitrate - bRate))
bitrate = Tables2.bitrate_table[version][i];
}
}
return bitrate;
}
function BitrateIndex(bRate, version, samplerate) {
if (samplerate < 16e3)
version = 2;
for (var i = 0; i <= 14; i++) {
if (Tables2.bitrate_table[version][i] > 0) {
if (Tables2.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 = self2.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;
System2.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_n2([16, 4 + 1]);
gfc.bitrate_blockType_Hist = new_int_n2([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 ATH2();
if (gfc.PSY == null)
gfc.PSY = new PSY();
if (gfc.rgdata == null)
gfc.rgdata = new ReplayGain2();
gfc.channels_in = gfp.num_channels;
if (gfc.channels_in == 1)
gfp.mode = MPEGMode2.MONO;
gfc.channels_out = gfp.mode == MPEGMode2.MONO ? 1 : 2;
gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
if (gfp.mode == MPEGMode2.MONO)
gfp.force_ms = false;
if (gfp.VBR == VbrMode2.vbr_off && gfp.VBR_mean_bitrate_kbps != 128 && gfp.brate == 0)
gfp.brate = gfp.VBR_mean_bitrate_kbps;
if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) ;
else {
gfp.free_format = false;
}
if (gfp.VBR == VbrMode2.vbr_off && gfp.brate == 0) {
if (BitStream.EQ(gfp.compression_ratio, 0))
gfp.compression_ratio = 11.025;
}
if (gfp.VBR == VbrMode2.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 VbrMode2.vbr_off: {
var lh = new LowPassHighPass();
optimum_bandwidth(lh, gfp.brate);
lowpass = lh.lowerlimit;
break;
}
case VbrMode2.vbr_abr: {
var lh = new LowPassHighPass();
optimum_bandwidth(lh, gfp.VBR_mean_bitrate_kbps);
lowpass = lh.lowerlimit;
break;
}
case VbrMode2.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], m2 = gfp.VBR_q_frac;
lowpass = linear_int(a, b, m2);
} 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], m2 = gfp.VBR_q_frac;
lowpass = linear_int(a, b, m2);
} else {
lowpass = 19500;
}
}
}
if (gfp.mode == MPEGMode2.MONO && (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.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 == VbrMode2.vbr_off) {
gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
}
if (gfp.VBR == VbrMode2.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 = Encoder2.ENCDELAY;
gfc.resample_ratio = gfp.in_samplerate / gfp.out_samplerate;
switch (gfp.VBR) {
case VbrMode2.vbr_mt:
case VbrMode2.vbr_rh:
case VbrMode2.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 VbrMode2.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 == MPEGMode2.NOT_SET) {
gfp.mode = MPEGMode2.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 == VbrMode2.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 < Encoder2.SBMAX_l + 1; i++)
gfc.scalefac_band.l[i] = qupvt.sfBandIndex[j].l[i];
for (var i = 0; i < Encoder2.PSFB21 + 1; i++) {
var size = (gfc.scalefac_band.l[22] - gfc.scalefac_band.l[21]) / Encoder2.PSFB21;
var start = gfc.scalefac_band.l[21] + i * size;
gfc.scalefac_band.psfb21[i] = start;
}
gfc.scalefac_band.psfb21[Encoder2.PSFB21] = 576;
for (var i = 0; i < Encoder2.SBMAX_s + 1; i++)
gfc.scalefac_band.s[i] = qupvt.sfBandIndex[j].s[i];
for (var i = 0; i < Encoder2.PSFB12 + 1; i++) {
var size = (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) / Encoder2.PSFB12;
var start = gfc.scalefac_band.s[12] + i * size;
gfc.scalefac_band.psfb12[i] = start;
}
gfc.scalefac_band.psfb12[Encoder2.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 k2;
for (k2 = 0; k2 < 19; k2++)
gfc.nsPsy.pefirbuf[k2] = 700 * gfc.mode_gr * gfc.channels_out;
if (gfp.ATHtype == -1)
gfp.ATHtype = 4;
}
assert2(gfp.VBR_q <= 9);
assert2(gfp.VBR_q >= 0);
switch (gfp.VBR) {
case VbrMode2.vbr_mt:
gfp.VBR = VbrMode2.vbr_mtrh;
case VbrMode2.vbr_mtrh: {
if (gfp.useTemporal == null) {
gfp.useTemporal = false;
}
p2.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 VbrMode2.vbr_rh: {
p2.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 == VbrMode2.vbr_off)
gfp.VBR_mean_bitrate_kbps = gfp.brate;
p2.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 == VbrMode2.vbr_off) {
gfc.iteration_loop = new CBRNewIterationLoop2(qu);
} else {
gfc.iteration_loop = new ABRIterationLoop(qu);
}
break;
}
}
assert2(gfp.scale >= 0);
if (gfp.VBR != VbrMode2.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 = Tables2.bitrate_table[gfp.version][gfc.VBR_min_bitrate];
gfp.VBR_max_bitrate_kbps = Tables2.bitrate_table[gfp.version][gfc.VBR_max_bitrate];
gfp.VBR_mean_bitrate_kbps = Math.min(
Tables2.bitrate_table[gfp.version][gfc.VBR_max_bitrate],
gfp.VBR_mean_bitrate_kbps
);
gfp.VBR_mean_bitrate_kbps = Math.max(
Tables2.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);
assert2(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 = ShortBlock2.short_block_allowed;
}
if (gfp.short_blocks == ShortBlock2.short_block_allowed && (gfp.mode == MPEGMode2.JOINT_STEREO || gfp.mode == MPEGMode2.STEREO)) {
gfp.short_blocks = ShortBlock2.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 = PsyModel2.NSATTACKTHRE;
if (gfp.internal_flags.nsPsy.attackthre_s < 0)
gfp.internal_flags.nsPsy.attackthre_s = PsyModel2.NSATTACKTHRE_S;
assert2(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 == VbrMode2.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);
assert2(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_float2(nsamples);
gfc.in_buffer_1 = new_float2(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_n2([2, 1152]);
var imp3 = 0, mp3count, mp3buffer_size_remaining;
var end_padding;
var frames_left;
var samples_to_encode = gfc.mf_samples_to_encode - Encoder2.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 = Encoder2.BLKSIZE + gfp.framesize - Encoder2.FFTOFFSET;
mf_needed = Math.max(mf_needed, 512 + gfp.framesize - 32);
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.NEQ(gfp.scale, 0) && BitStream.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.NEQ(gfp.scale_left, 0) && BitStream.NEQ(gfp.scale_left, 1)) {
for (i = 0; i < nsamples; ++i) {
in_buffer[0][i] *= gfp.scale_left;
}
}
if (BitStream.NEQ(gfp.scale_right, 0) && BitStream.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;
assert2(gfc.mf_size <= LameInternalFlags2.MFSIZE);
if (gfc.mf_samples_to_encode < 1) {
gfc.mf_samples_to_encode = Encoder2.ENCDELAY + Encoder2.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];
}
}
return mp3size;
}
function lame_encode_frame(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
var ret = self2.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, l2) {
var wcn = Math.PI * fcn;
x /= l2;
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(l2 * wcn * x2) / (Math.PI * l2 * 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, k2;
var bpc = gfp.out_samplerate / gcd(gfp.out_samplerate, gfp.in_samplerate);
if (bpc > LameInternalFlags2.BPC)
bpc = LameInternalFlags2.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_float2(BLACKSIZE);
gfc.inbuf_old[1] = new_float2(BLACKSIZE);
for (i = 0; i <= 2 * bpc; ++i)
gfc.blackfilt[i] = new_float2(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 (k2 = 0; k2 < desired_len; k2++) {
var time0;
var joff;
time0 = k2 * 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));
joff = 0 | Math.floor(offset * 2 * bpc + bpc + 0.5);
var xvalue = 0;
for (i = 0; i <= filter_l; ++i) {
var j2 = 0 | i + j - filter_l / 2;
var y;
y = j2 < 0 ? inbuf_old[BLACKSIZE + j2] : inbuf[in_bufferPos + j2];
xvalue += y * gfc.blackfilt[joff][i];
}
outbuf[outbufPos + k2] = xvalue;
}
num_used.num_used = Math.min(len, filter_l + j - filter_l / 2);
gfc.itime[ch] += num_used.num_used - k2 * 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];
assert2(j == num_used.num_used);
}
return k2;
}
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];
}
}
}
}
Lame_1 = Lame2;
return Lame_1;
}
requireLame();
requireEncoder();
requireLame();
requireQuantizePVT();
requireTakehiro();
requireBitStream();
requireEncoder();
function fourccToInt(fourcc) {
return fourcc.charCodeAt(0) << 24 | fourcc.charCodeAt(1) << 16 | fourcc.charCodeAt(2) << 8 | fourcc.charCodeAt(3);
}
fourccToInt("RIFF");
fourccToInt("WAVE");
fourccToInt("fmt ");
fourccToInt("data");
var recorderCore = { exports: {} };
(function(module) {
(function(factory) {
var browser = typeof window == "object" && !!window.document;
var win = browser ? window : Object;
factory(win, browser);
if (module.exports) {
module.exports = win.Recorder;
}
})(function(Export, isBrowser) {
var NOOP = function() {
};
var IsNum = function(v) {
return typeof v == "number";
};
var Recorder2 = function(set) {
return new initFn(set);
};
var LM = Recorder2.LM = "2024-04-09 19:15";
var GitUrl = "https://github.com/xiangyuecn/Recorder";
var RecTxt = "Recorder";
var getUserMediaTxt = "getUserMedia";
var srcSampleRateTxt = "srcSampleRate";
var sampleRateTxt = "sampleRate";
var bitRateTxt = "bitRate";
var CatchTxt = "catch";
var WRec2 = Export[RecTxt];
if (WRec2 && WRec2.LM == LM) {
WRec2.CLog(WRec2.i18n.$T("K8zP::重复导入{1}", 0, RecTxt), 3);
return;
}
Recorder2.IsOpen = function() {
var stream = Recorder2.Stream;
if (stream) {
var tracks = stream.getTracks && stream.getTracks() || stream.audioTracks || [];
var track = tracks[0];
if (track) {
var state = track.readyState;
return state == "live" || state == track.LIVE;
}
}
return false;
};
Recorder2.BufferSize = 4096;
Recorder2.Destroy = function() {
CLog(RecTxt + " Destroy");
Disconnect();
for (var k2 in DestroyList) {
DestroyList[k2]();
}
};
var DestroyList = {};
Recorder2.BindDestroy = function(key, call) {
DestroyList[key] = call;
};
Recorder2.Support = function() {
if (!isBrowser) return false;
var scope = navigator.mediaDevices || {};
if (!scope[getUserMediaTxt]) {
scope = navigator;
scope[getUserMediaTxt] || (scope[getUserMediaTxt] = scope.webkitGetUserMedia || scope.mozGetUserMedia || scope.msGetUserMedia);
}
if (!scope[getUserMediaTxt]) {
return false;
}
Recorder2.Scope = scope;
if (!Recorder2.GetContext()) {
return false;
}
return true;
};
Recorder2.GetContext = function(tryNew) {
if (!isBrowser) return null;
var AC = window.AudioContext;
if (!AC) {
AC = window.webkitAudioContext;
}
if (!AC) {
return null;
}
var ctx = Recorder2.Ctx;
if (!ctx || ctx.state == "closed") {
ctx = Recorder2.Ctx = new AC();
Recorder2.NewCtxs = Recorder2.NewCtxs || [];
Recorder2.BindDestroy("Ctx", function() {
var ctx2 = Recorder2.Ctx;
if (ctx2 && ctx2.close) {
CloseCtx(ctx2);
Recorder2.Ctx = 0;
}
var arr = Recorder2.NewCtxs;
Recorder2.NewCtxs = [];
for (var i = 0; i < arr.length; i++) CloseCtx(arr[i]);
});
}
if (tryNew && ctx.close) {
try {
ctx = new AC();
Recorder2.NewCtxs.push(ctx);
} catch (e) {
CLog("GetContext tryNew Error", 1, e);
}
}
return ctx;
};
Recorder2.CloseNewCtx = function(ctx) {
if (ctx && ctx != Recorder2.Ctx) {
CloseCtx(ctx);
var arr = Recorder2.NewCtxs || [], L = arr.length;
for (var i = 0; i < arr.length; i++) {
if (arr[i] == ctx) {
arr.splice(i, 1);
break;
}
}
CLog($T("mSxV::剩{1}个GetContext未close", 0, L + "-1=" + arr.length), arr.length ? 3 : 0);
}
};
var CloseCtx = function(ctx) {
if (ctx && ctx.close) {
ctx._isC = 1;
try {
ctx.close();
} catch (e) {
CLog("ctx close err", 1, e);
}
}
};
var ResumeCtx = Recorder2.ResumeCtx = function(ctx, check, True, False) {
var isEnd = 0, isBind = 0, isLsSC = 0, runC = 0, EL = "EventListener", Tag = "ResumeCtx ";
var end = function(err, ok) {
if (isBind) {
bind();
}
if (!isEnd) {
isEnd = 1;
err && False(err, runC);
ok && True(runC);
}
if (ok) {
if (!ctx._LsSC && ctx["add" + EL]) ctx["add" + EL]("statechange", run);
ctx._LsSC = 1;
isLsSC = 1;
}
};
var bind = function(add) {
if (add && isBind) return;
isBind = add ? 1 : 0;
var types = ["focus", "mousedown", "mouseup", "touchstart", "touchend"];
for (var i = 0; i < types.length; i++)
window[(add ? "add" : "remove") + EL](types[i], run, true);
};
var run = function() {
var sVal = ctx.state, spEnd = CtxSpEnd(sVal);
if (!isEnd && !check(spEnd ? ++runC : runC)) return end();
if (spEnd) {
if (isLsSC) CLog(Tag + "sc " + sVal, 3);
bind(1);
ctx.resume().then(function() {
if (isLsSC) CLog(Tag + "sc " + ctx.state);
end(0, 1);
})[CatchTxt](function(e) {
CLog(Tag + "error", 1, e);
if (!CtxSpEnd(ctx.state)) {
end(e.message || "error");
}
});
} else if (sVal == "closed") {
if (isLsSC && !ctx._isC) CLog(Tag + "sc " + sVal, 1);
end("ctx closed");
} else {
end(0, 1);
}
};
run();
};
var CtxSpEnd = Recorder2.CtxSpEnd = function(v) {
return v == "suspended" || v == "interrupted";
};
var CtxState = function(ctx) {
var v = ctx.state, msg = "ctx.state=" + v;
if (CtxSpEnd(v)) msg += $T("nMIy::(注意:ctx不是running状态,rec.open和start至少要有一个在用户操作(触摸、点击等)时进行调用,否则将在rec.start时尝试进行ctx.resume,可能会产生兼容性问题(仅iOS),请参阅文档中runningContext配置)");
return msg;
};
var ConnectEnableWebM = "ConnectEnableWebM";
Recorder2[ConnectEnableWebM] = true;
var ConnectEnableWorklet = "ConnectEnableWorklet";
Recorder2[ConnectEnableWorklet] = false;
var Connect = function(streamStore, isUserMedia) {
var bufferSize = streamStore.BufferSize || Recorder2.BufferSize;
var stream = streamStore.Stream;
var ctx = stream._RC || stream._c || Recorder2.GetContext(true);
stream._c = ctx;
var mediaConn = function(node) {
var media = stream._m = ctx.createMediaStreamSource(stream);
var ctxDest = ctx.destination, cmsdTxt = "createMediaStreamDestination";
if (ctx[cmsdTxt]) {
ctxDest = stream._d = ctx[cmsdTxt]();
}
media.connect(node);
node.connect(ctxDest);
};
var isWebM, isWorklet, badInt, webMTips = "";
var calls = stream._call;
var onReceive = function(float32Arr) {
for (var k0 in calls) {
var size = float32Arr.length;
var pcm = new Int16Array(size);
var sum = 0;
for (var j = 0; j < size; j++) {
var s = Math.max(-1, Math.min(1, float32Arr[j]));
s = s < 0 ? s * 32768 : s * 32767;
pcm[j] = s;
sum += Math.abs(s);
}
for (var k2 in calls) {
calls[k2](pcm, sum);
}
return;
}
};
var scriptProcessor = "ScriptProcessor";
var audioWorklet = "audioWorklet";
var recAudioWorklet = RecTxt + " " + audioWorklet;
var RecProc = "RecProc";
var MediaRecorderTxt = "MediaRecorder";
var MRWebMPCM = MediaRecorderTxt + ".WebM.PCM";
var oldFn = ctx.createScriptProcessor || ctx.createJavaScriptNode;
var oldIsBest = $T("ZGlf::。由于{1}内部1秒375次回调,在移动端可能会有性能问题导致回调丢失录音变短,PC端无影响,暂不建议开启{1}。", 0, audioWorklet);
var oldScript = function() {
isWorklet = stream.isWorklet = false;
_Disconn_n(stream);
CLog($T("7TU0::Connect采用老的{1},", 0, scriptProcessor) + i18n.get(
Recorder2[ConnectEnableWorklet] ? $T("JwCL::但已设置{1}尝试启用{2}", 2) : $T("VGjB::可设置{1}尝试启用{2}", 2),
[RecTxt + "." + ConnectEnableWorklet + "=true", audioWorklet]
) + webMTips + oldIsBest, 3);
var process = stream._p = oldFn.call(ctx, bufferSize, 1, 1);
mediaConn(process);
process.onaudioprocess = function(e) {
var arr = e.inputBuffer.getChannelData(0);
onReceive(arr);
};
};
var connWorklet = function() {
isWebM = stream.isWebM = false;
_Disconn_r(stream);
isWorklet = stream.isWorklet = !oldFn || Recorder2[ConnectEnableWorklet];
var AwNode = window.AudioWorkletNode;
if (!(isWorklet && ctx[audioWorklet] && AwNode)) {
oldScript();
return;
}
var clazzUrl = function() {
var xf = function(f2) {
return f2.toString().replace(/^function|DEL_/g, "").replace(/\$RA/g, recAudioWorklet);
};
var clazz = "class " + RecProc + " extends AudioWorkletProcessor{";
clazz += "constructor " + xf(function(option) {
DEL_super(option);
var This = this, bufferSize2 = option.processorOptions.bufferSize;
This.bufferSize = bufferSize2;
This.buffer = new Float32Array(bufferSize2 * 2);
This.pos = 0;
This.port.onmessage = function(e) {
if (e.data.kill) {
This.kill = true;
$C.log("$RA kill call");
}
};
$C.log("$RA .ctor call", option);
});
clazz += "process " + xf(function(input, b, c) {
var This = this, bufferSize2 = This.bufferSize;
var buffer = This.buffer, pos = This.pos;
input = (input[0] || [])[0] || [];
if (input.length) {
buffer.set(input, pos);
pos += input.length;
var len = ~~(pos / bufferSize2) * bufferSize2;
if (len) {
this.port.postMessage({ val: buffer.slice(0, len) });
var more = buffer.subarray(len, pos);
buffer = new Float32Array(bufferSize2 * 2);
buffer.set(more);
pos = more.length;
This.buffer = buffer;
}
This.pos = pos;
}
return !This.kill;
});
clazz += '}try{registerProcessor("' + RecProc + '", ' + RecProc + ')}catch(e){$C.error("' + recAudioWorklet + ' Reg Error",e)}';
clazz = clazz.replace(/\$C\./g, "console.");
return "data:text/javascript;base64," + btoa(unescape(encodeURIComponent(clazz)));
};
var awNext = function() {
return isWorklet && stream._na;
};
var nodeAlive = stream._na = function() {
if (badInt !== "") {
clearTimeout(badInt);
badInt = setTimeout(function() {
badInt = 0;
if (awNext()) {
CLog($T("MxX1::{1}未返回任何音频,恢复使用{2}", 0, audioWorklet, scriptProcessor), 3);
oldFn && oldScript();
}
}, 500);
}
};
var createNode = function() {
if (!awNext()) return;
var node = stream._n = new AwNode(ctx, RecProc, {
processorOptions: { bufferSize }
});
mediaConn(node);
node.port.onmessage = function(e) {
if (badInt) {
clearTimeout(badInt);
badInt = "";
}
if (awNext()) {
onReceive(e.data.val);
} else if (!isWorklet) {
CLog($T("XUap::{1}多余回调", 0, audioWorklet), 3);
}
};
CLog($T("yOta::Connect采用{1},设置{2}可恢复老式{3}", 0, audioWorklet, RecTxt + "." + ConnectEnableWorklet + "=false", scriptProcessor) + webMTips + oldIsBest, 3);
};
var ctxOK = function() {
if (!awNext()) return;
if (ctx[RecProc]) {
createNode();
return;
}
var url = clazzUrl();
ctx[audioWorklet].addModule(url).then(function(e) {
if (!awNext()) return;
ctx[RecProc] = 1;
createNode();
if (badInt) {
nodeAlive();
}
})[CatchTxt](function(e) {
CLog(audioWorklet + ".addModule Error", 1, e);
awNext() && oldScript();
});
};
ResumeCtx(ctx, function() {
return awNext();
}, ctxOK, ctxOK);
};
var connWebM = function() {
var MR = window[MediaRecorderTxt];
var onData = "ondataavailable";
var webmType = "audio/webm; codecs=pcm";
isWebM = stream.isWebM = Recorder2[ConnectEnableWebM];
var supportMR = MR && onData in MR.prototype && MR.isTypeSupported(webmType);
webMTips = supportMR ? "" : $T("VwPd::(此浏览器不支持{1})", 0, MRWebMPCM);
if (!isUserMedia || !isWebM || !supportMR) {
connWorklet();
return;
}
var mrNext = function() {
return isWebM && stream._ra;
};
stream._ra = function() {
if (badInt !== "") {
clearTimeout(badInt);
badInt = setTimeout(function() {
if (mrNext()) {
CLog($T("vHnb::{1}未返回任何音频,降级使用{2}", 0, MediaRecorderTxt, audioWorklet), 3);
connWorklet();
}
}, 500);
}
};
var mrSet = Object.assign({ mimeType: webmType }, Recorder2.ConnectWebMOptions);
var mr = stream._r = new MR(stream, mrSet);
var webmData = stream._rd = { sampleRate: ctx[sampleRateTxt] };
mr[onData] = function(e) {
var reader = new FileReader();
reader.onloadend = function() {
if (mrNext()) {
var f32arr = WebM_Extract(new Uint8Array(reader.result), webmData);
if (!f32arr) return;
if (f32arr == -1) {
connWorklet();
return;
}
if (badInt) {
clearTimeout(badInt);
badInt = "";
}
onReceive(f32arr);
} else if (!isWebM) {
CLog($T("O9P7::{1}多余回调", 0, MediaRecorderTxt), 3);
}
};
reader.readAsArrayBuffer(e.data);
};
mr.start(~~(bufferSize / 48));
CLog($T("LMEm::Connect采用{1},设置{2}可恢复使用{3}或老式{4}", 0, MRWebMPCM, RecTxt + "." + ConnectEnableWebM + "=false", audioWorklet, scriptProcessor));
};
connWebM();
};
var ConnAlive = function(stream) {
if (stream._na) stream._na();
if (stream._ra) stream._ra();
};
var _Disconn_n = function(stream) {
stream._na = null;
if (stream._n) {
stream._n.port.postMessage({ kill: true });
stream._n.disconnect();
stream._n = null;
}
};
var _Disconn_r = function(stream) {
stream._ra = null;
if (stream._r) {
try {
stream._r.stop();
} catch (e) {
CLog("mr stop err", 1, e);
}
stream._r = null;
}
};
var Disconnect = function(streamStore) {
streamStore = streamStore || Recorder2;
var isGlobal = streamStore == Recorder2;
var stream = streamStore.Stream;
if (stream) {
if (stream._m) {
stream._m.disconnect();
stream._m = null;
}
if (!stream._RC && stream._c) {
Recorder2.CloseNewCtx(stream._c);
}
stream._RC = null;
stream._c = null;
if (stream._d) {
StopS_(stream._d.stream);
stream._d = null;
}
if (stream._p) {
stream._p.disconnect();
stream._p.onaudioprocess = stream._p = null;
}
_Disconn_n(stream);
_Disconn_r(stream);
if (isGlobal) {
StopS_(stream);
}
}
streamStore.Stream = 0;
};
var StopS_ = Recorder2.StopS_ = function(stream) {
var tracks = stream.getTracks && stream.getTracks() || stream.audioTracks || [];
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
track.stop && track.stop();
}
stream.stop && stream.stop();
};
Recorder2.SampleData = function(pcmDatas, pcmSampleRate, newSampleRate, prevChunkInfo, option) {
var Txt = "SampleData";
prevChunkInfo || (prevChunkInfo = {});
var index = prevChunkInfo.index || 0;
var offset = prevChunkInfo.offset || 0;
var filter = prevChunkInfo.filter;
if (filter && filter.fn && filter.sr != pcmSampleRate) {
filter = null;
CLog($T("d48C::{1}的filter采样率变了,重设滤波", 0, Txt), 3);
}
if (!filter) {
var freq = newSampleRate > pcmSampleRate * 3 / 4 ? 0 : newSampleRate / 2 * 3 / 4;
filter = { fn: freq ? Recorder2.IIRFilter(true, pcmSampleRate, freq) : 0 };
}
filter.sr = pcmSampleRate;
var filterFn = filter.fn;
var frameNext = prevChunkInfo.frameNext || [];
option || (option = {});
var frameSize = option.frameSize || 1;
if (option.frameType) {
frameSize = option.frameType == "mp3" ? 1152 : 1;
}
var nLen = pcmDatas.length;
if (index > nLen + 1) {
CLog($T("tlbC::{1}似乎传入了未重置chunk {2}", 0, Txt, index + ">" + nLen), 3);
}
var size = 0;
for (var i = index; i < nLen; i++) {
size += pcmDatas[i].length;
}
size = Math.max(0, size - Math.floor(offset));
var step = pcmSampleRate / newSampleRate;
if (step > 1) {
size = Math.floor(size / step);
} else {
step = 1;
newSampleRate = pcmSampleRate;
}
size += frameNext.length;
var res = new Int16Array(size);
var idx = 0;
for (var i = 0; i < frameNext.length; i++) {
res[idx] = frameNext[i];
idx++;
}
for (; index < nLen; index++) {
var o = pcmDatas[index];
var i = offset, il = o.length;
var F = filterFn && filterFn.Embed, F1 = 0, F2 = 0, Fx = 0, Fy = 0;
for (var i0 = 0, i2 = 0; i0 < il; i0++, i2++) {
if (i2 < il) {
if (F) {
Fx = o[i2];
Fy = F.b0 * Fx + F.b1 * F.x1 + F.b0 * F.x2 - F.a1 * F.y1 - F.a2 * F.y2;
F.x2 = F.x1;
F.x1 = Fx;
F.y2 = F.y1;
F.y1 = Fy;
} else {
Fy = filterFn ? filterFn(o[i2]) : o[i2];
}
}
F1 = F2;
F2 = Fy;
if (i2 == 0) {
i0--;
continue;
}
var before = Math.floor(i);
if (i0 != before) continue;
var after = Math.ceil(i);
var atPoint = i - before;
var beforeVal = F1;
var afterVal = after < il ? F2 : beforeVal;
var val = beforeVal + (afterVal - beforeVal) * atPoint;
if (val > 32767) val = 32767;
else if (val < -32768) val = -32768;
res[idx] = val;
idx++;
i += step;
}
offset = Math.max(0, i - il);
}
frameNext = null;
var frameNextSize = res.length % frameSize;
if (frameNextSize > 0) {
var u8Pos = (res.length - frameNextSize) * 2;
frameNext = new Int16Array(res.buffer.slice(u8Pos));
res = new Int16Array(res.buffer.slice(0, u8Pos));
}
return {
index,
offset,
filter,
frameNext,
sampleRate: newSampleRate,
data: res
};
};
Recorder2.IIRFilter = function(useLowPass, sampleRate, freq) {
var ov = 2 * Math.PI * freq / sampleRate;
var sn = Math.sin(ov);
var cs = Math.cos(ov);
var alpha = sn / 2;
var a0 = 1 + alpha;
var a1 = -2 * cs / a0;
var a2 = (1 - alpha) / a0;
if (useLowPass) {
var b0 = (1 - cs) / 2 / a0;
var b1 = (1 - cs) / a0;
} else {
var b0 = (1 + cs) / 2 / a0;
var b1 = -(1 + cs) / a0;
}
var x1 = 0, x2 = 0, y = 0, y1 = 0, y2 = 0;
var fn = function(x) {
y = b0 * x + b1 * x1 + b0 * x2 - a1 * y1 - a2 * y2;
x2 = x1;
x1 = x;
y2 = y1;
y1 = y;
return y;
};
fn.Embed = { x1: 0, x2: 0, y1: 0, y2: 0, b0, b1, a1, a2 };
return fn;
};
Recorder2.PowerLevel = function(pcmAbsSum, pcmLength) {
var power = pcmAbsSum / pcmLength || 0;
var level;
if (power < 1251) {
level = Math.round(power / 1250 * 10);
} else {
level = Math.round(Math.min(100, Math.max(0, (1 + Math.log(power / 1e4) / Math.log(10)) * 100)));
}
return level;
};
Recorder2.PowerDBFS = function(maxSample) {
var val = Math.max(0.1, maxSample || 0), Pref = 32767;
val = Math.min(val, Pref);
val = 20 * Math.log(val / Pref) / Math.log(10);
return Math.max(-100, Math.round(val));
};
Recorder2.CLog = function(msg, err) {
if (typeof console != "object") return;
var now = /* @__PURE__ */ new Date();
var t = ("0" + now.getMinutes()).substr(-2) + ":" + ("0" + now.getSeconds()).substr(-2) + "." + ("00" + now.getMilliseconds()).substr(-3);
var recID = this && this.envIn && this.envCheck && this.id;
var arr = ["[" + t + " " + RecTxt + (recID ? ":" + recID : "") + "]" + msg];
var a = arguments, cwe = Recorder2.CLog;
var i = 2, fn = cwe.log || console.log;
if (IsNum(err)) {
fn = err == 1 ? cwe.error || console.error : err == 3 ? cwe.warn || console.warn : fn;
} else {
i = 1;
}
for (; i < a.length; i++) {
arr.push(a[i]);
}
if (IsLoser) {
fn && fn("[IsLoser]" + arr[0], arr.length > 1 ? arr : "");
} else {
fn.apply(console, arr);
}
};
var CLog = function() {
Recorder2.CLog.apply(this, arguments);
};
var IsLoser = true;
try {
IsLoser = !console.log.apply;
} catch (e) {
}
var ID = 0;
function initFn(set) {
var This = this;
This.id = ++ID;
Traffic();
var o = {
type: "mp3",
onProcess: NOOP
//fn(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd) buffers=[[Int16,...],...]:缓冲的PCM数据,为从开始录音到现在的所有pcm片段;powerLevel:当前缓冲的音量级别0-100,bufferDuration:已缓冲时长,bufferSampleRate:缓冲使用的采样率(当type支持边录边转码(Worker)时,此采样率和设置的采样率相同,否则不一定相同);newBufferIdx:本次回调新增的buffer起始索引;asyncEnd:fn() 如果onProcess是异步的(返回值为true时),处理完成时需要调用此回调,如果不是异步的请忽略此参数,此方法回调时必须是真异步(不能真异步时需用setTimeout包裹)。onProcess返回值:如果返回true代表开启异步模式,在某些大量运算的场合异步是必须的,必须在异步处理完成时调用asyncEnd(不能真异步时需用setTimeout包裹),在onProcess执行后新增的buffer会全部替换成空数组,因此本回调开头应立即将newBufferIdx到本次回调结尾位置的buffer全部保存到另外一个数组内,处理完成后写回buffers中本次回调的结尾位置。
//*******高级设置******
//,sourceStream:MediaStream Object
//可选直接提供一个媒体流,从这个流中录制、实时处理音频数据(当前Recorder实例独享此流);不提供时为普通的麦克风录音,由getUserMedia提供音频流(所有Recorder实例共享同一个流)
//比如:audio、video标签dom节点的captureStream方法(实验特性,不同浏览器支持程度不高)返回的流;WebRTC中的remote流;自己创建的流等
//注意:流内必须至少存在一条音轨(Audio Track),比如audio标签必须等待到可以开始播放后才会有音轨,否则open会失败
//,runningContext:AudioContext
//可选提供一个state为running状态的AudioContext对象(ctx);默认会在rec.open时自动创建一个新的ctx,无用户操作(触摸、点击等)时调用rec.open的ctx.state可能为suspended,会在rec.start时尝试进行ctx.resume,如果也无用户操作ctx.resume可能不会恢复成running状态(目前仅iOS上有此兼容性问题),导致无法去读取媒体流,这时请提前在用户操作时调用Recorder.GetContext(true)来得到一个running状态AudioContext(用完需调用CloseNewCtx(ctx)关闭)
//,audioTrackSet:{ deviceId:"",groupId:"", autoGainControl:true, echoCancellation:true, noiseSuppression:true }
//普通麦克风录音时getUserMedia方法的audio配置参数,比如指定设备id,回声消除、降噪开关;注意:提供的任何配置值都不一定会生效
//由于麦克风是全局共享的,所以新配置后需要close掉以前的再重新open
//更多参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
//,disableEnvInFix:false 内部参数,禁用设备卡顿时音频输入丢失补偿功能
//,takeoffEncodeChunk:NOOP //fn(chunkBytes) chunkBytes=[Uint8,...]:实时编码环境下接管编码器输出,当编码器实时编码出一块有效的二进制音频数据时实时回调此方法;参数为二进制的Uint8Array,就是编码出来的音频数据片段,所有的chunkBytes拼接在一起即为完整音频。本实现的想法最初由QQ2543775048提出
//当提供此回调方法时,将接管编码器的数据输出,编码器内部将放弃存储生成的音频数据;如果当前编码器或环境不支持实时编码处理,将在open时直接走fail逻辑
//因此提供此回调后调用stop方法将无法获得有效的音频数据,因为编码器内没有音频数据,因此stop时返回的blob将是一个字节长度为0的blob
//大部分录音格式编码器都支持实时编码(边录边转码),比如mp3格式:会实时的将编码出来的mp3片段通过此方法回调,所有的chunkBytes拼接到一起即为完整的mp3,此种拼接的结果比mock方法实时生成的音质更加,因为天然避免了首尾的静默
//不支持实时编码的录音格式不可以提供此回调(wav格式不支持,因为wav文件头中需要提供文件最终长度),提供了将在open时直接走fail逻辑
};
for (var k2 in set) {
o[k2] = set[k2];
}
This.set = o;
var vB = o[bitRateTxt], vS = o[sampleRateTxt];
if (vB && !IsNum(vB) || vS && !IsNum(vS)) {
This.CLog($T.G("IllegalArgs-1", [$T("VtS4::{1}和{2}必须是数值", 0, sampleRateTxt, bitRateTxt)]), 1, set);
}
o[bitRateTxt] = +vB || 16;
o[sampleRateTxt] = +vS || 16e3;
This.state = 0;
This._S = 9;
This.Sync = { O: 9, C: 9 };
}
Recorder2.Sync = {
/*open*/
O: 9,
/*close*/
C: 9
};
Recorder2.prototype = initFn.prototype = {
CLog,
_streamStore: function() {
if (this.set.sourceStream) {
return this;
} else {
return Recorder2;
}
},
_streamCtx: function() {
var m2 = this._streamStore().Stream;
return m2 && m2._c;
},
open: function(True, False) {
var This = this, set = This.set, streamStore = This._streamStore(), newCtx = 0;
True = True || NOOP;
var failCall = function(errMsg, isUserNotAllow) {
isUserNotAllow = !!isUserNotAllow;
This.CLog($T("5tWi::录音open失败:") + errMsg + ",isUserNotAllow:" + isUserNotAllow, 1);
if (newCtx) Recorder2.CloseNewCtx(newCtx);
False && False(errMsg, isUserNotAllow);
};
This._streamTag = getUserMediaTxt;
var ok = function() {
This.CLog("open ok, id:" + This.id + " stream:" + This._streamTag);
True();
This._SO = 0;
};
var Lock = streamStore.Sync;
var lockOpen = ++Lock.O, lockClose = Lock.C;
This._O = This._O_ = lockOpen;
This._SO = This._S;
var lockFail = function() {
if (lockClose != Lock.C || !This._O) {
var err = $T("dFm8::open被取消");
if (lockOpen == Lock.O) {
This.close();
} else {
err = $T("VtJO::open被中断");
}
failCall(err);
return true;
}
};
if (!isBrowser) {
failCall($T.G("NonBrowser-1", ["open"]) + $T("EMJq::,可尝试使用RecordApp解决方案") + "(" + GitUrl + "/tree/master/app-support-sample)");
return;
}
var checkMsg = This.envCheck({ envName: "H5", canProcess: true });
if (checkMsg) {
failCall($T("A5bm::不能录音:") + checkMsg);
return;
}
if (set.sourceStream) {
This._streamTag = "set.sourceStream";
if (!Recorder2.GetContext()) {
failCall($T("1iU7::不支持此浏览器从流中获取录音"));
return;
}
Disconnect(streamStore);
var stream = This.Stream = set.sourceStream;
stream._RC = set.runningContext;
stream._call = {};
try {
Connect(streamStore);
} catch (e) {
Disconnect(streamStore);
failCall($T("BTW2::从流中打开录音失败:") + e.message);
return;
}
ok();
return;
}
var codeFail = function(code, msg) {
try {
window.top.a;
} catch (e) {
failCall($T("Nclz::无权录音(跨域,请尝试给iframe添加麦克风访问策略,如{1})", 0, 'allow="camera;microphone"'));
return;
}
if (/Permission|Allow/i.test(code)) {
failCall($T("gyO5::用户拒绝了录音权限"), true);
} else if (window.isSecureContext === false) {
failCall($T("oWNo::浏览器禁止不安全页面录音,可开启https解决"));
} else if (/Found/i.test(code)) {
failCall(msg + $T("jBa9::,无可用麦克风"));
} else {
failCall(msg);
}
};
if (Recorder2.IsOpen()) {
ok();
return;
}
if (!Recorder2.Support()) {
codeFail("", $T("COxc::此浏览器不支持录音"));
return;
}
var ctx = set.runningContext;
if (!ctx) ctx = newCtx = Recorder2.GetContext(true);
var f1 = function(stream2) {
setTimeout(function() {
stream2._call = {};
var oldStream = Recorder2.Stream;
if (oldStream) {
Disconnect();
stream2._call = oldStream._call;
}
Recorder2.Stream = stream2;
stream2._c = ctx;
stream2._RC = set.runningContext;
if (lockFail()) return;
if (Recorder2.IsOpen()) {
if (oldStream) This.CLog($T("upb8::发现同时多次调用open"), 1);
Connect(streamStore, 1);
ok();
} else {
failCall($T("Q1GA::录音功能无效:无音频流"));
}
}, 100);
};
var f2 = function(e) {
var code = e.name || e.message || e.code + ":" + e;
This.CLog($T("xEQR::请求录音权限错误"), 1, e);
codeFail(code, $T("bDOG::无法录音:") + code);
};
var trackSet = set.audioTrackSet || {};
trackSet[sampleRateTxt] = ctx[sampleRateTxt];
var mSet = { audio: trackSet };
try {
var pro = Recorder2.Scope[getUserMediaTxt](mSet, f1, f2);
} catch (e) {
This.CLog(getUserMediaTxt, 3, e);
mSet = { audio: true };
pro = Recorder2.Scope[getUserMediaTxt](mSet, f1, f2);
}
This.CLog(getUserMediaTxt + "(" + JSON.stringify(mSet) + ") " + CtxState(ctx) + $T("RiWe::,未配置noiseSuppression和echoCancellation时浏览器可能会自动打开降噪和回声消除,移动端可能会降低系统播放音量(关闭录音后可恢复),请参阅文档中audioTrackSet配置") + "(" + GitUrl + ") LM:" + LM + " UA:" + navigator.userAgent);
if (pro && pro.then) {
pro.then(f1)[CatchTxt](f2);
}
},
close: function(call) {
call = call || NOOP;
var This = this, streamStore = This._streamStore();
This._stop();
var sTag = " stream:" + This._streamTag;
var Lock = streamStore.Sync;
This._O = 0;
if (This._O_ != Lock.O) {
This.CLog($T("hWVz::close被忽略(因为同时open了多个rec,只有最后一个会真正close)") + sTag, 3);
call();
return;
}
Lock.C++;
Disconnect(streamStore);
This.CLog("close," + sTag);
call();
},
mock: function(pcmData, pcmSampleRate) {
var This = this;
This._stop();
This.isMock = 1;
This.mockEnvInfo = null;
This.buffers = [pcmData];
This.recSize = pcmData.length;
This._setSrcSR(pcmSampleRate);
This._streamTag = "mock";
return This;
},
_setSrcSR: function(sampleRate) {
var This = this, set = This.set;
var setSr = set[sampleRateTxt];
if (setSr > sampleRate) {
set[sampleRateTxt] = sampleRate;
} else {
setSr = 0;
}
This[srcSampleRateTxt] = sampleRate;
This.CLog(srcSampleRateTxt + ": " + sampleRate + " set." + sampleRateTxt + ": " + set[sampleRateTxt] + (setSr ? " " + $T("UHvm::忽略") + ": " + setSr : ""), setSr ? 3 : 0);
},
envCheck: function(envInfo) {
var errMsg, This = this, set = This.set;
var tag = "CPU_BE";
if (!errMsg && !Recorder2[tag] && typeof Int8Array == "function" && !new Int8Array(new Int32Array([1]).buffer)[0]) {
Traffic(tag);
errMsg = $T("Essp::不支持{1}架构", 0, tag);
}
if (!errMsg) {
var type = set.type, hasFn = This[type + "_envCheck"];
if (set.takeoffEncodeChunk) {
if (!hasFn) {
errMsg = $T("2XBl::{1}类型不支持设置takeoffEncodeChunk", 0, type) + (This[type] ? "" : $T("LG7e::(未加载编码器)"));
} else if (!envInfo.canProcess) {
errMsg = $T("7uMV::{1}环境不支持实时处理", 0, envInfo.envName);
}
}
if (!errMsg && hasFn) {
errMsg = This[type + "_envCheck"](envInfo, set);
}
}
return errMsg || "";
},
envStart: function(mockEnvInfo, sampleRate) {
var This = this, set = This.set;
This.isMock = mockEnvInfo ? 1 : 0;
This.mockEnvInfo = mockEnvInfo;
This.buffers = [];
This.recSize = 0;
if (mockEnvInfo) {
This._streamTag = "env$" + mockEnvInfo.envName;
}
This.state = 1;
This.envInLast = 0;
This.envInFirst = 0;
This.envInFix = 0;
This.envInFixTs = [];
This._setSrcSR(sampleRate);
This.engineCtx = 0;
if (This[set.type + "_start"]) {
var engineCtx = This.engineCtx = This[set.type + "_start"](set);
if (engineCtx) {
engineCtx.pcmDatas = [];
engineCtx.pcmSize = 0;
}
}
},
envResume: function() {
this.envInFixTs = [];
},
envIn: function(pcm, sum) {
var This = this, set = This.set, engineCtx = This.engineCtx;
if (This.state != 1) {
if (!This.state) This.CLog("envIn at state=0", 3);
return;
}
var bufferSampleRate = This[srcSampleRateTxt];
var size = pcm.length;
var powerLevel = Recorder2.PowerLevel(sum, size);
var buffers = This.buffers;
var bufferFirstIdx = buffers.length;
buffers.push(pcm);
var buffersThis = buffers;
var bufferFirstIdxThis = bufferFirstIdx;
var now = Date.now();
var pcmTime = Math.round(size / bufferSampleRate * 1e3);
This.envInLast = now;
if (This.buffers.length == 1) {
This.envInFirst = now - pcmTime;
}
var envInFixTs = This.envInFixTs;
envInFixTs.splice(0, 0, { t: now, d: pcmTime });
var tsInStart = now, tsPcm = 0;
for (var i = 0; i < envInFixTs.length; i++) {
var o = envInFixTs[i];
if (now - o.t > 3e3) {
envInFixTs.length = i;
break;
}
tsInStart = o.t;
tsPcm += o.d;
}
var tsInPrev = envInFixTs[1];
var tsIn = now - tsInStart;
var lost = tsIn - tsPcm;
if (lost > tsIn / 3 && (tsInPrev && tsIn > 1e3 || envInFixTs.length >= 6)) {
var addTime = now - tsInPrev.t - pcmTime;
if (addTime > pcmTime / 5) {
var fixOpen = !set.disableEnvInFix;
This.CLog("[" + now + "]" + i18n.get(fixOpen ? $T("4Kfd::补偿{1}ms", 1) : $T("bM5i::未补偿{1}ms", 1), [addTime]), 3);
This.envInFix += addTime;
if (fixOpen) {
var addPcm = new Int16Array(addTime * bufferSampleRate / 1e3);
size += addPcm.length;
buffers.push(addPcm);
}
}
}
var sizeOld = This.recSize, addSize = size;
var bufferSize = sizeOld + addSize;
This.recSize = bufferSize;
if (engineCtx) {
var chunkInfo = Recorder2.SampleData(buffers, bufferSampleRate, set[sampleRateTxt], engineCtx.chunkInfo);
engineCtx.chunkInfo = chunkInfo;
sizeOld = engineCtx.pcmSize;
addSize = chunkInfo.data.length;
bufferSize = sizeOld + addSize;
engineCtx.pcmSize = bufferSize;
buffers = engineCtx.pcmDatas;
bufferFirstIdx = buffers.length;
buffers.push(chunkInfo.data);
bufferSampleRate = chunkInfo[sampleRateTxt];
}
var duration = Math.round(bufferSize / bufferSampleRate * 1e3);
var bufferNextIdx = buffers.length;
var bufferNextIdxThis = buffersThis.length;
var asyncEnd = function() {
var num = asyncBegin ? 0 : -addSize;
var hasClear2 = buffers[0] == null;
for (var i2 = bufferFirstIdx; i2 < bufferNextIdx; i2++) {
var buffer = buffers[i2];
if (buffer == null) {
hasClear2 = 1;
} else {
num += buffer.length;
if (engineCtx && buffer.length) {
This[set.type + "_encode"](engineCtx, buffer);
}
}
}
if (hasClear2 && engineCtx) {
var i2 = bufferFirstIdxThis;
if (buffersThis[0]) {
i2 = 0;
}
for (; i2 < bufferNextIdxThis; i2++) {
buffersThis[i2] = null;
}
}
if (hasClear2) {
num = asyncBegin ? addSize : 0;
buffers[0] = null;
}
if (engineCtx) {
engineCtx.pcmSize += num;
} else {
This.recSize += num;
}
};
var asyncBegin = 0, procTxt = "rec.set.onProcess";
try {
asyncBegin = set.onProcess(buffers, powerLevel, duration, bufferSampleRate, bufferFirstIdx, asyncEnd);
} catch (e) {
console.error(procTxt + $T("gFUF::回调出错是不允许的,需保证不会抛异常"), e);
}
var slowT = Date.now() - now;
if (slowT > 10 && This.envInFirst - now > 1e3) {
This.CLog(procTxt + $T("2ghS::低性能,耗时{1}ms", 0, slowT), 3);
}
if (asyncBegin === true) {
var hasClear = 0;
for (var i = bufferFirstIdx; i < bufferNextIdx; i++) {
if (buffers[i] == null) {
hasClear = 1;
} else {
buffers[i] = new Int16Array(0);
}
}
if (hasClear) {
This.CLog($T("ufqH::未进入异步前不能清除buffers"), 3);
} else {
if (engineCtx) {
engineCtx.pcmSize -= addSize;
} else {
This.recSize -= addSize;
}
}
} else {
asyncEnd();
}
},
start: function() {
var This = this;
var isOpen = 1;
if (This.set.sourceStream) {
if (!This.Stream) {
isOpen = 0;
}
} else if (!Recorder2.IsOpen()) {
isOpen = 0;
}
if (!isOpen) {
This.CLog($T("6WmN::start失败:未open"), 1);
return;
}
var ctx = This._streamCtx();
This.CLog($T("kLDN::start 开始录音,") + CtxState(ctx) + " stream:" + This._streamTag);
This._stop();
This.envStart(null, ctx[sampleRateTxt]);
This.state = 3;
if (This._SO && This._SO + 1 != This._S) {
This.CLog($T("Bp2y::start被中断"), 3);
return;
}
This._SO = 0;
var end = function() {
if (This.state == 3) {
This.state = 1;
This.resume();
}
};
var tag = "AudioContext resume: ";
ResumeCtx(ctx, function(runC) {
runC && This.CLog(tag + "wait...");
return This.state == 3;
}, function(runC) {
runC && This.CLog(tag + ctx.state);
end();
}, function(err) {
This.CLog(tag + ctx.state + $T("upkE::,可能无法录音:") + err, 1);
end();
});
},
pause: function() {
var This = this, stream = This._streamStore().Stream;
if (This.state) {
This.state = 2;
This.CLog("pause");
if (stream) delete stream._call[This.id];
}
},
resume: function() {
var This = this, stream = This._streamStore().Stream;
var tag = "resume", tag3 = tag + "(wait ctx)";
if (This.state == 3) {
This.CLog(tag3);
} else if (This.state) {
This.state = 1;
This.CLog(tag);
This.envResume();
if (stream) {
stream._call[This.id] = function(pcm, sum) {
if (This.state == 1) {
This.envIn(pcm, sum);
}
};
ConnAlive(stream);
}
var ctx = This._streamCtx();
if (ctx) {
ResumeCtx(ctx, function(runC) {
runC && This.CLog(tag3 + "...");
return This.state == 1;
}, function(runC) {
runC && This.CLog(tag3 + ctx.state);
ConnAlive(stream);
}, function(err) {
This.CLog(tag3 + ctx.state + "[err]" + err, 1);
});
}
}
},
_stop: function(keepEngine) {
var This = this, set = This.set;
if (!This.isMock) {
This._S++;
}
if (This.state) {
This.pause();
This.state = 0;
}
if (!keepEngine && This[set.type + "_stop"]) {
This[set.type + "_stop"](This.engineCtx);
This.engineCtx = 0;
}
},
stop: function(True, False, autoClose) {
var This = this, set = This.set, t1;
var envInMS = This.envInLast - This.envInFirst, envInLen = envInMS && This.buffers.length;
This.CLog($T("Xq4s::stop 和start时差:") + (envInMS ? envInMS + "ms " + $T("3CQP::补偿:") + This.envInFix + "ms envIn:" + envInLen + " fps:" + (envInLen / envInMS * 1e3).toFixed(1) : "-") + " stream:" + This._streamTag + " (" + GitUrl + ") LM:" + LM);
var end = function() {
This._stop();
if (autoClose) {
This.close();
}
};
var err = function(msg) {
This.CLog($T("u8JG::结束录音失败:") + msg, 1);
False && False(msg);
end();
};
var ok = function(blob, mime, duration2) {
var tBlob = "blob", tABuf = "arraybuffer", tDT = "dataType", tDDT = "DefaultDataType";
var dType = This[tDT] || Recorder2[tDDT] || tBlob, dTag = tDT + "=" + dType;
var isAB = blob instanceof ArrayBuffer, dErr = 0;
var dLen = isAB ? blob.byteLength : blob.size;
if (dType == tABuf) {
if (!isAB) dErr = 1;
} else if (dType == tBlob) {
if (typeof Blob != "function") {
dErr = $T.G("NonBrowser-1", [dTag]) + $T("1skY::,请设置{1}", 0, RecTxt + "." + tDDT + '="' + tABuf + '"');
} else {
if (isAB) blob = new Blob([blob], { type: mime });
if (!(blob instanceof Blob)) dErr = 1;
mime = blob.type || mime;
}
} else {
dErr = $T.G("NotSupport-1", [dTag]);
}
This.CLog($T("Wv7l::结束录音 编码花{1}ms 音频时长{2}ms 文件大小{3}b", 0, Date.now() - t1, duration2, dLen) + " " + dTag + "," + mime);
if (dErr) {
err(dErr != 1 ? dErr : $T("Vkbd::{1}编码器返回的不是{2}", 0, set.type, dType) + ", " + dTag);
return;
}
if (set.takeoffEncodeChunk) {
This.CLog($T("QWnr::启用takeoffEncodeChunk后stop返回的blob长度为0不提供音频数据"), 3);
} else if (dLen < Math.max(50, duration2 / 5)) {
err($T("Sz2H::生成的{1}无效", 0, set.type));
return;
}
True && True(blob, duration2, mime);
end();
};
if (!This.isMock) {
var isCtxWait = This.state == 3;
if (!This.state || isCtxWait) {
err($T("wf9t::未开始录音") + (isCtxWait ? $T("Dl2c::,开始录音前无用户交互导致AudioContext未运行") : ""));
return;
}
}
This._stop(true);
var size = This.recSize;
if (!size) {
err($T("Ltz3::未采集到录音"));
return;
}
if (!This[set.type]) {
err($T("xGuI::未加载{1}编码器,请尝试到{2}的src/engine内找到{1}的编码器并加载", 0, set.type, RecTxt));
return;
}
if (This.isMock) {
var checkMsg = This.envCheck(This.mockEnvInfo || { envName: "mock", canProcess: false });
if (checkMsg) {
err($T("AxOH::录音错误:") + checkMsg);
return;
}
}
var engineCtx = This.engineCtx;
if (This[set.type + "_complete"] && engineCtx) {
var duration = Math.round(engineCtx.pcmSize / set[sampleRateTxt] * 1e3);
t1 = Date.now();
This[set.type + "_complete"](engineCtx, function(blob, mime) {
ok(blob, mime, duration);
}, err);
return;
}
t1 = Date.now();
if (!This.buffers[0]) {
err($T("xkKd::音频buffers被释放"));
return;
}
var chunk = Recorder2.SampleData(This.buffers, This[srcSampleRateTxt], set[sampleRateTxt]);
set[sampleRateTxt] = chunk[sampleRateTxt];
var res = chunk.data;
var duration = Math.round(res.length / set[sampleRateTxt] * 1e3);
This.CLog($T("CxeT::采样:{1} 花:{2}ms", 0, size + "->" + res.length, Date.now() - t1));
setTimeout(function() {
t1 = Date.now();
This[set.type](res, function(blob, mime) {
ok(blob, mime, duration);
}, function(msg) {
err(msg);
});
});
}
};
var WebM_Extract = function(inBytes, scope) {
if (!scope.pos) {
scope.pos = [0];
scope.tracks = {};
scope.bytes = [];
}
var tracks = scope.tracks, position = [scope.pos[0]];
var endPos = function() {
scope.pos[0] = position[0];
};
var sBL = scope.bytes.length;
var bytes = new Uint8Array(sBL + inBytes.length);
bytes.set(scope.bytes);
bytes.set(inBytes, sBL);
scope.bytes = bytes;
if (!scope._ht) {
readMatroskaVInt(bytes, position);
readMatroskaBlock(bytes, position);
if (!BytesEq(readMatroskaVInt(bytes, position), [24, 83, 128, 103])) {
return;
}
readMatroskaVInt(bytes, position);
while (position[0] < bytes.length) {
var eid0 = readMatroskaVInt(bytes, position);
var bytes0 = readMatroskaBlock(bytes, position);
var pos0 = [0], audioIdx = 0;
if (!bytes0) return;
if (BytesEq(eid0, [22, 84, 174, 107])) {
while (pos0[0] < bytes0.length) {
var eid1 = readMatroskaVInt(bytes0, pos0);
var bytes1 = readMatroskaBlock(bytes0, pos0);
var pos1 = [0], track = { channels: 0, sampleRate: 0 };
if (BytesEq(eid1, [174])) {
while (pos1[0] < bytes1.length) {
var eid2 = readMatroskaVInt(bytes1, pos1);
var bytes2 = readMatroskaBlock(bytes1, pos1);
var pos2 = [0];
if (BytesEq(eid2, [215])) {
var val = BytesInt(bytes2);
track.number = val;
tracks[val] = track;
} else if (BytesEq(eid2, [131])) {
var val = BytesInt(bytes2);
if (val == 1) track.type = "video";
else if (val == 2) {
track.type = "audio";
if (!audioIdx) scope.track0 = track;
track.idx = audioIdx++;
} else track.type = "Type-" + val;
} else if (BytesEq(eid2, [134])) {
var str = "";
for (var i = 0; i < bytes2.length; i++) {
str += String.fromCharCode(bytes2[i]);
}
track.codec = str;
} else if (BytesEq(eid2, [225])) {
while (pos2[0] < bytes2.length) {
var eid3 = readMatroskaVInt(bytes2, pos2);
var bytes3 = readMatroskaBlock(bytes2, pos2);
if (BytesEq(eid3, [181])) {
var val = 0, arr = new Uint8Array(bytes3.reverse()).buffer;
if (bytes3.length == 4) val = new Float32Array(arr)[0];
else if (bytes3.length == 8) val = new Float64Array(arr)[0];
else CLog("WebM Track !Float", 1, bytes3);
track[sampleRateTxt] = Math.round(val);
} else if (BytesEq(eid3, [98, 100])) track.bitDepth = BytesInt(bytes3);
else if (BytesEq(eid3, [159])) track.channels = BytesInt(bytes3);
}
}
}
}
}
scope._ht = 1;
CLog("WebM Tracks", tracks);
endPos();
break;
}
}
}
var track0 = scope.track0;
if (!track0) return;
if (track0.bitDepth == 16 && /FLOAT/i.test(track0.codec)) {
track0.bitDepth = 32;
CLog("WebM 16->32 bit", 3);
}
if (track0[sampleRateTxt] != scope[sampleRateTxt] || track0.bitDepth != 32 || track0.channels < 1 || !/(\b|_)PCM\b/i.test(track0.codec)) {
scope.bytes = [];
if (!scope.bad) CLog("WebM Track Unexpected", 3, scope);
scope.bad = 1;
return -1;
}
var datas = [], dataLen = 0;
while (position[0] < bytes.length) {
var eid1 = readMatroskaVInt(bytes, position);
var bytes1 = readMatroskaBlock(bytes, position);
if (!bytes1) break;
if (BytesEq(eid1, [163])) {
var trackNo = bytes1[0] & 15;
var track = tracks[trackNo];
if (!track) {
CLog("WebM !Track" + trackNo, 1, tracks);
} else if (track.idx === 0) {
var u8arr = new Uint8Array(bytes1.length - 4);
for (var i = 4; i < bytes1.length; i++) {
u8arr[i - 4] = bytes1[i];
}
datas.push(u8arr);
dataLen += u8arr.length;
}
}
endPos();
}
if (dataLen) {
var more = new Uint8Array(bytes.length - scope.pos[0]);
more.set(bytes.subarray(scope.pos[0]));
scope.bytes = more;
scope.pos[0] = 0;
var u8arr = new Uint8Array(dataLen);
for (var i = 0, i2 = 0; i < datas.length; i++) {
u8arr.set(datas[i], i2);
i2 += datas[i].length;
}
var arr = new Float32Array(u8arr.buffer);
if (track0.channels > 1) {
var arr2 = [];
for (var i = 0; i < arr.length; ) {
arr2.push(arr[i]);
i += track0.channels;
}
arr = new Float32Array(arr2);
}
return arr;
}
};
var BytesEq = function(bytes1, bytes2) {
if (!bytes1 || bytes1.length != bytes2.length) return false;
if (bytes1.length == 1) return bytes1[0] == bytes2[0];
for (var i = 0; i < bytes1.length; i++) {
if (bytes1[i] != bytes2[i]) return false;
}
return true;
};
var BytesInt = function(bytes) {
var s = "";
for (var i = 0; i < bytes.length; i++) {
var n2 = bytes[i];
s += (n2 < 16 ? "0" : "") + n2.toString(16);
}
return parseInt(s, 16) || 0;
};
var readMatroskaVInt = function(arr, pos, trim) {
var i = pos[0];
if (i >= arr.length) return;
var b0 = arr[i], b2 = ("0000000" + b0.toString(2)).substr(-8);
var m2 = /^(0*1)(\d*)$/.exec(b2);
if (!m2) return;
var len = m2[1].length, val = [];
if (i + len > arr.length) return;
for (var i2 = 0; i2 < len; i2++) {
val[i2] = arr[i];
i++;
}
if (trim) val[0] = parseInt(m2[2] || "0", 2);
pos[0] = i;
return val;
};
var readMatroskaBlock = function(arr, pos) {
var lenVal = readMatroskaVInt(arr, pos, 1);
if (!lenVal) return;
var len = BytesInt(lenVal);
var i = pos[0], val = [];
if (len < 2147483647) {
if (i + len > arr.length) return;
for (var i2 = 0; i2 < len; i2++) {
val[i2] = arr[i];
i++;
}
}
pos[0] = i;
return val;
};
var i18n = Recorder2.i18n = {
lang: "zh-CN",
alias: { "zh-CN": "zh", "en-US": "en" },
locales: {},
data: {},
put: function(set, texts) {
var tag = RecTxt + ".i18n.put: ";
var overwrite = set.overwrite;
overwrite = overwrite == null || overwrite;
var lang = set.lang;
lang = i18n.alias[lang] || lang;
if (!lang) throw new Error(tag + "set.lang?");
var locale = i18n.locales[lang];
if (!locale) {
locale = {};
i18n.locales[lang] = locale;
}
var exp = /^([\w\-]+):/, m2;
for (var i = 0; i < texts.length; i++) {
var v = texts[i];
m2 = exp.exec(v);
if (!m2) {
CLog(tag + "'key:'? " + v, 3, set);
continue;
}
var key = m2[1], v = v.substr(key.length + 1);
if (!overwrite && locale[key]) continue;
locale[key] = v;
}
},
get: function() {
return i18n.v_G.apply(null, arguments);
},
v_G: function(key, args, lang) {
args = args || [];
lang = lang || i18n.lang;
lang = i18n.alias[lang] || lang;
var locale = i18n.locales[lang];
var val = locale && locale[key] || "";
if (!val && lang != "zh") {
if (lang == "en") return i18n.v_G(key, args, "zh");
return i18n.v_G(key, args, "en");
}
i18n.lastLang = lang;
if (val == "=Empty") return "";
return val.replace(/\{(\d+)(\!?)\}/g, function(v, a, b) {
a = +a || 0;
v = args[a - 1];
if (a < 1 || a > args.length) {
v = "{?}";
CLog("i18n[" + key + "] no {" + a + "}: " + val, 3);
}
return b ? "" : v;
});
},
$T: function() {
return i18n.v_T.apply(null, arguments);
},
v_T: function() {
var a = arguments, key = "", args = [], isArgs = 0, tag = RecTxt + ".i18n.$T:";
var exp = /^([\w\-]*):/, m2;
for (var i = 0; i < a.length; i++) {
var v = a[i];
if (i == 0) {
m2 = exp.exec(v);
key = m2 && m2[1];
if (!key) throw new Error(tag + "0 'key:'?");
v = v.substr(key.length + 1);
}
if (isArgs === -1) args.push(v);
else if (isArgs) throw new Error(tag + " bad args");
else if (v === 0) isArgs = -1;
else if (IsNum(v)) {
if (v < 1) throw new Error(tag + " bad args");
isArgs = v;
} else {
var lang = i == 1 ? "en" : i ? "" : "zh";
m2 = exp.exec(v);
if (m2) {
lang = m2[1] || lang;
v = v.substr(m2[1].length + 1);
}
if (!m2 || !lang) throw new Error(tag + i + " 'lang:'?");
i18n.put({ lang, overwrite: false }, [key + ":" + v]);
}
}
if (!key) return "";
if (isArgs > 0) return key;
return i18n.v_G(key, args);
}
};
var $T = i18n.$T;
$T.G = i18n.get;
$T("NonBrowser-1::非浏览器环境,不支持{1}", 1);
$T("IllegalArgs-1::参数错误:{1}", 1);
$T("NeedImport-2::调用{1}需要先导入{2}", 2);
$T("NotSupport-1::不支持:{1}", 1);
Recorder2.TrafficImgUrl = "//ia.51.la/go1?id=20469973&pvFlag=1";
var Traffic = Recorder2.Traffic = function(report) {
if (!isBrowser) return;
report = report ? "/" + RecTxt + "/Report/" + report : "";
var imgUrl = Recorder2.TrafficImgUrl;
if (imgUrl) {
var data = Recorder2.Traffic;
var m2 = /^(https?:..[^\/#]*\/?)[^#]*/i.exec(location.href) || [];
var host = m2[1] || "http://file/";
var idf = (m2[0] || host) + report;
if (imgUrl.indexOf("//") == 0) {
if (/^https:/i.test(idf)) {
imgUrl = "https:" + imgUrl;
} else {
imgUrl = "http:" + imgUrl;
}
}
if (report) {
imgUrl = imgUrl + "&cu=" + encodeURIComponent(host + report);
}
if (!data[idf]) {
data[idf] = 1;
var img = new Image();
img.src = imgUrl;
CLog("Traffic Analysis Image: " + (report || RecTxt + ".TrafficImgUrl=" + Recorder2.TrafficImgUrl));
}
}
};
if (WRec2) {
CLog($T("8HO5::覆盖导入{1}", 0, RecTxt), 1);
WRec2.Destroy();
}
Export[RecTxt] = Recorder2;
});
})(recorderCore);
var recorderCoreExports = recorderCore.exports;
const Recorder = /* @__PURE__ */ getDefaultExportFromCjs(recorderCoreExports);
(function(factory) {
var browser = typeof window == "object" && !!window.document;
var win = browser ? window : Object;
var rec = win.Recorder, ni = rec.i18n;
factory(rec, ni, ni.$T, browser);
})(function(Recorder2, i18n, $T, isBrowser) {
var SampleS = "48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000";
var BitS = "8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 192, 224, 256, 320";
Recorder2.prototype.enc_mp3 = {
stable: true,
takeEC: "full",
getTestMsg: function() {
return $T("Zm7L::采样率范围:{1};比特率范围:{2}(不同比特率支持的采样率范围不同,小于32kbps时采样率需小于32000)", 0, SampleS, BitS);
}
};
var NormalizeSet = function(set) {
var bS = set.bitRate, sS = set.sampleRate, s = sS;
if ((" " + BitS + ",").indexOf(" " + bS + ",") == -1) {
Recorder2.CLog($T("eGB9::{1}不在mp3支持的取值范围:{2}", 0, "bitRate=" + bS, BitS), 3);
}
if ((" " + SampleS + ",").indexOf(" " + sS + ",") == -1) {
var arr = SampleS.split(", "), vs = [];
for (var i = 0; i < arr.length; i++) vs.push({ v: +arr[i], s: Math.abs(arr[i] - sS) });
vs.sort(function(a, b) {
return a.s - b.s;
});
s = vs[0].v;
set.sampleRate = s;
Recorder2.CLog($T("zLTa::sampleRate已更新为{1},因为{2}不在mp3支持的取值范围:{3}", 0, s, sS, SampleS), 3);
}
};
var ImportEngineErr = function() {
return $T.G("NeedImport-2", ["mp3.js", "src/engine/mp3-engine.js"]);
};
var HasWebWorker = isBrowser && typeof Worker == "function";
Recorder2.prototype.mp3 = function(res, True, False) {
var This = this, set = This.set, size = res.length;
if (!Recorder2.lamejs) {
False(ImportEngineErr());
return;
}
if (HasWebWorker) {
var ctx = This.mp3_start(set);
if (ctx) {
if (ctx.isW) {
This.mp3_encode(ctx, res);
This.mp3_complete(ctx, True, False, 1);
return;
}
This.mp3_stop(ctx);
}
}
NormalizeSet(set);
var mp3 = new Recorder2.lamejs.Mp3Encoder(1, set.sampleRate, set.bitRate);
var blockSize = 57600;
var memory = new Int8Array(5e5), mOffset = 0;
var idx = 0, isFlush = 0;
var run = function() {
try {
if (idx < size) {
var buf = mp3.encodeBuffer(res.subarray(idx, idx + blockSize));
} else {
isFlush = 1;
var buf = mp3.flush();
}
;
} catch (e) {
console.error(e);
if (!isFlush) try {
mp3.flush();
} catch (r) {
console.error(r);
}
False("MP3 Encoder: " + e.message);
return;
}
var bufLen = buf.length;
if (bufLen > 0) {
if (mOffset + bufLen > memory.length) {
var tmp = new Int8Array(memory.length + Math.max(5e5, bufLen));
tmp.set(memory.subarray(0, mOffset));
memory = tmp;
}
memory.set(buf, mOffset);
mOffset += bufLen;
}
if (idx < size) {
idx += blockSize;
setTimeout(run);
} else {
var data = [memory.buffer.slice(0, mOffset)];
var meta = mp3TrimFix.fn(data, mOffset, size, set.sampleRate);
mp3TrimFixSetMeta(meta, set);
True(data[0] || new ArrayBuffer(0), "audio/mp3");
}
};
run();
};
var mp3Worker;
Recorder2.BindDestroy("mp3Worker", function() {
if (mp3Worker) {
Recorder2.CLog("mp3Worker Destroy");
mp3Worker.terminate();
mp3Worker = null;
}
});
Recorder2.prototype.mp3_envCheck = function(envInfo, set) {
var errMsg = "";
if (set.takeoffEncodeChunk) {
if (!newContext()) {
errMsg = $T("yhUs::当前浏览器版本太低,无法实时处理");
}
}
if (!errMsg && !Recorder2.lamejs) {
errMsg = ImportEngineErr();
}
return errMsg;
};
Recorder2.prototype.mp3_start = function(set) {
return newContext(set);
};
var openList = { id: 0 };
var newContext = function(setOrNull, _badW) {
var run = function(e) {
var ed = e.data;
var wk_ctxs = scope.wkScope.wk_ctxs;
var wk_lame = scope.wkScope.wk_lame;
var wk_mp3TrimFix = scope.wkScope.wk_mp3TrimFix;
var cur = wk_ctxs[ed.id];
if (ed.action == "init") {
wk_ctxs[ed.id] = {
sampleRate: ed.sampleRate,
bitRate: ed.bitRate,
takeoff: ed.takeoff,
pcmSize: 0,
memory: new Int8Array(5e5),
mOffset: 0,
encObj: new wk_lame.Mp3Encoder(1, ed.sampleRate, ed.bitRate)
};
} else if (!cur) {
return;
}
var addBytes = function(buf2) {
var bufLen = buf2.length;
if (cur.mOffset + bufLen > cur.memory.length) {
var tmp = new Int8Array(cur.memory.length + Math.max(5e5, bufLen));
tmp.set(cur.memory.subarray(0, cur.mOffset));
cur.memory = tmp;
}
cur.memory.set(buf2, cur.mOffset);
cur.mOffset += bufLen;
};
switch (ed.action) {
case "stop":
if (!cur.isCp) try {
cur.encObj.flush();
} catch (e2) {
console.error(e2);
}
cur.encObj = null;
delete wk_ctxs[ed.id];
break;
case "encode":
if (cur.isCp) break;
cur.pcmSize += ed.pcm.length;
try {
var buf = cur.encObj.encodeBuffer(ed.pcm);
} catch (e2) {
cur.err = e2;
console.error(e2);
}
if (buf && buf.length > 0) {
if (cur.takeoff) {
worker.onmessage({ action: "takeoff", id: ed.id, chunk: buf });
} else {
addBytes(buf);
}
}
break;
case "complete":
cur.isCp = 1;
try {
var buf = cur.encObj.flush();
} catch (e2) {
cur.err = e2;
console.error(e2);
}
if (buf && buf.length > 0) {
if (cur.takeoff) {
worker.onmessage({ action: "takeoff", id: ed.id, chunk: buf });
} else {
addBytes(buf);
}
}
if (cur.err) {
worker.onmessage({
action: ed.action,
id: ed.id,
err: "MP3 Encoder: " + cur.err.message
});
break;
}
var data = [cur.memory.buffer.slice(0, cur.mOffset)];
var meta = wk_mp3TrimFix.fn(data, cur.mOffset, cur.pcmSize, cur.sampleRate);
worker.onmessage({
action: ed.action,
id: ed.id,
blob: data[0] || new ArrayBuffer(0),
meta
});
break;
}
};
var initOnMsg = function(isW) {
worker.onmessage = function(e) {
var data = e;
if (isW) data = e.data;
var ctx2 = openList[data.id];
if (ctx2) {
if (data.action == "takeoff") {
ctx2.set.takeoffEncodeChunk(new Uint8Array(data.chunk.buffer));
} else {
ctx2.call && ctx2.call(data);
ctx2.call = null;
}
}
};
};
var initCtx = function() {
var ctx2 = { worker, set: setOrNull };
if (setOrNull) {
ctx2.id = ++openList.id;
openList[ctx2.id] = ctx2;
NormalizeSet(setOrNull);
worker.postMessage({
action: "init",
id: ctx2.id,
sampleRate: setOrNull.sampleRate,
bitRate: setOrNull.bitRate,
takeoff: !!setOrNull.takeoffEncodeChunk,
x: new Int16Array(5)
//低版本浏览器不支持序列化TypedArray
});
} else {
worker.postMessage({
x: new Int16Array(5)
//低版本浏览器不支持序列化TypedArray
});
}
return ctx2;
};
var scope, worker = mp3Worker;
if (_badW || !HasWebWorker) {
Recorder2.CLog($T("k9PT::当前环境不支持Web Worker,mp3实时编码器运行在主线程中"), 3);
worker = { postMessage: function(ed) {
run({ data: ed });
} };
scope = { wkScope: {
wk_ctxs: {},
wk_lame: Recorder2.lamejs,
wk_mp3TrimFix: mp3TrimFix
} };
initOnMsg();
return initCtx();
}
try {
if (!worker) {
var onmsg = (run + "").replace(/[\w\$]+\.onmessage/g, "self.postMessage");
onmsg = onmsg.replace(/[\w\$]+\.wkScope/g, "wkScope");
var jsCode = ");wk_lame();self.onmessage=" + onmsg;
jsCode += ";var wkScope={ wk_ctxs:{},wk_lame:wk_lame";
jsCode += ",wk_mp3TrimFix:{rm:" + mp3TrimFix.rm + ",fn:" + mp3TrimFix.fn + "} }";
var lamejsCode = Recorder2.lamejs.toString();
var url = (window.URL || webkitURL).createObjectURL(new Blob(["var wk_lame=(", lamejsCode, jsCode], { type: "text/javascript" }));
worker = new Worker(url);
setTimeout(function() {
(window.URL || webkitURL).revokeObjectURL(url);
}, 1e4);
initOnMsg(1);
}
;
var ctx = initCtx();
ctx.isW = 1;
mp3Worker = worker;
return ctx;
} catch (e) {
worker && worker.terminate();
console.error(e);
return newContext(setOrNull, 1);
}
};
Recorder2.prototype.mp3_stop = function(startCtx) {
if (startCtx && startCtx.worker) {
startCtx.worker.postMessage({
action: "stop",
id: startCtx.id
});
startCtx.worker = null;
delete openList[startCtx.id];
var opens = -1;
for (var k2 in openList) {
opens++;
}
if (opens) {
Recorder2.CLog($T("fT6M::mp3 worker剩{1}个未stop", 0, opens), 3);
}
}
};
Recorder2.prototype.mp3_encode = function(startCtx, pcm) {
if (startCtx && startCtx.worker) {
startCtx.worker.postMessage({
action: "encode",
id: startCtx.id,
pcm
});
}
};
Recorder2.prototype.mp3_complete = function(startCtx, True, False, autoStop) {
var This = this;
if (startCtx && startCtx.worker) {
startCtx.call = function(data) {
if (autoStop) {
This.mp3_stop(startCtx);
}
if (data.err) {
False(data.err);
} else {
mp3TrimFixSetMeta(data.meta, startCtx.set);
True(data.blob, "audio/mp3");
}
};
startCtx.worker.postMessage({
action: "complete",
id: startCtx.id
});
} else {
False($T("mPxH::mp3编码器未start"));
}
};
Recorder2.mp3ReadMeta = function(mp3Buffers, length) {
var parseInt_ES3 = typeof window != "undefined" && window.parseInt || typeof self != "undefined" && self.parseInt || parseInt;
var u8arr0 = new Uint8Array(mp3Buffers[0] || []);
if (u8arr0.length < 4) {
return null;
}
var byteAt = function(idx2, u8) {
return ("0000000" + ((u8 || u8arr0)[idx2] || 0).toString(2)).substr(-8);
};
var b2 = byteAt(0) + byteAt(1);
var b4 = byteAt(2) + byteAt(3);
if (!/^1{11}/.test(b2)) {
return null;
}
var version = { "00": 2.5, "10": 2, "11": 1 }[b2.substr(11, 2)];
var layer = { "01": 3 }[b2.substr(13, 2)];
var sampleRate = {
//lamejs -> Tables.samplerate_table
"1": [44100, 48e3, 32e3],
"2": [22050, 24e3, 16e3],
"2.5": [11025, 12e3, 8e3]
}[version];
sampleRate && (sampleRate = sampleRate[parseInt_ES3(b4.substr(4, 2), 2)]);
var bitRate = [
//lamejs -> Tables.bitrate_table
[0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
[0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]
//MPEG 1
][version == 1 ? 1 : 0][parseInt_ES3(b4.substr(0, 4), 2)];
if (!version || !layer || !bitRate || !sampleRate) {
return null;
}
var duration = Math.round(length * 8 / bitRate);
var frame = layer == 1 ? 384 : layer == 2 ? 1152 : version == 1 ? 1152 : 576;
var frameDurationFloat = frame / sampleRate * 1e3;
var frameSize = Math.floor(frame * bitRate / 8 / sampleRate * 1e3);
var hasPadding = 0, seek = 0;
for (var i = 0; i < mp3Buffers.length; i++) {
var buf = mp3Buffers[i];
seek += buf.byteLength;
if (seek >= frameSize + 3) {
var buf8 = new Uint8Array(buf);
var idx = buf.byteLength - (seek - (frameSize + 3) + 1);
var ib4 = byteAt(idx, buf8);
hasPadding = ib4.charAt(6) == "1";
break;
}
}
if (hasPadding) {
frameSize++;
}
return {
version,
layer,
sampleRate,
bitRate,
duration,
size: length,
hasPadding,
frameSize,
frameDurationFloat
//每帧时长,含小数 ms
};
};
var mp3TrimFix = {
//minfiy keep name
rm: Recorder2.mp3ReadMeta,
fn: function(mp3Buffers, length, pcmLength, pcmSampleRate) {
var meta = this.rm(mp3Buffers, length);
if (!meta) {
return { err: "mp3 unknown format" };
}
var pcmDuration = Math.round(pcmLength / pcmSampleRate * 1e3);
var num = Math.floor((meta.duration - pcmDuration) / meta.frameDurationFloat);
if (num > 0) {
var size = num * meta.frameSize - (meta.hasPadding ? 1 : 0);
length -= size;
var arr0 = 0, arrs = [];
for (var i = 0; i < mp3Buffers.length; i++) {
var arr = mp3Buffers[i];
if (size <= 0) {
break;
}
if (size >= arr.byteLength) {
size -= arr.byteLength;
arrs.push(arr);
mp3Buffers.splice(i, 1);
i--;
} else {
mp3Buffers[i] = arr.slice(size);
arr0 = arr;
size = 0;
}
}
var checkMeta = this.rm(mp3Buffers, length);
if (!checkMeta) {
arr0 && (mp3Buffers[0] = arr0);
for (var i = 0; i < arrs.length; i++) {
mp3Buffers.splice(i, 0, arrs[i]);
}
meta.err = "mp3 fix error: 已还原,错误原因不明";
}
var fix = meta.trimFix = {};
fix.remove = num;
fix.removeDuration = Math.round(num * meta.frameDurationFloat);
fix.duration = Math.round(length * 8 / meta.bitRate);
}
return meta;
}
};
var mp3TrimFixSetMeta = function(meta, set) {
var tag = "MP3 Info: ";
if (meta.sampleRate && meta.sampleRate != set.sampleRate || meta.bitRate && meta.bitRate != set.bitRate) {
Recorder2.CLog(tag + $T("uY9i::和设置的不匹配{1},已更新成{2}", 0, "set:" + set.bitRate + "kbps " + set.sampleRate + "hz", "set:" + meta.bitRate + "kbps " + meta.sampleRate + "hz"), 3, set);
set.sampleRate = meta.sampleRate;
set.bitRate = meta.bitRate;
}
var trimFix = meta.trimFix;
if (trimFix) {
tag += $T("iMSm::Fix移除{1}帧", 0, trimFix.remove) + " " + trimFix.removeDuration + "ms -> " + trimFix.duration + "ms";
if (trimFix.remove > 2) {
meta.err = (meta.err ? meta.err + ", " : "") + $T("b9zm::移除帧数过多");
}
} else {
tag += (meta.duration || "-") + "ms";
}
if (meta.err) {
Recorder2.CLog(tag, 1, meta.err, meta);
} else {
Recorder2.CLog(tag, meta);
}
};
});
(function(factory) {
var browser = typeof window == "object" && !!window.document;
var win = browser ? window : Object;
var rec = win.Recorder;
factory(rec);
})(function(Recorder2) {
function lamejs() {
var Math_log10 = function(s) {
return Math.log(s) / Math.log(10);
};
var abort = function(what) {
throw new Error("abort(" + what + ")");
};
function new_byte2(count) {
return new Int8Array(count);
}
function new_short2(count) {
return new Int16Array(count);
}
function new_int2(count) {
return new Int32Array(count);
}
function new_float2(count) {
return new Float32Array(count);
}
function new_double2(count) {
return new Float64Array(count);
}
function new_float_n2(args) {
if (args.length == 1) {
return new_float2(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_float_n2(args));
}
return A;
}
function new_int_n2(args) {
if (args.length == 1) {
return new_int2(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_int_n2(args));
}
return A;
}
function new_short_n2(args) {
if (args.length == 1) {
return new_short2(args[0]);
}
var sz = args[0];
args = args.slice(1);
var A = [];
for (var i = 0; i < sz; i++) {
A.push(new_short_n2(args));
}
return A;
}
function new_array_n2(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_n2(args));
}
return A;
}
var Arrays2 = {};
Arrays2.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 System2 = {};
System2.arraycopy = function(src, srcPos, dest, destPos, length) {
var srcEnd = srcPos + length;
while (srcPos < srcEnd)
dest[destPos++] = src[srcPos++];
};
var Util2 = {};
Util2.SQRT2 = 1.4142135623730951;
Util2.FAST_LOG10 = function(x) {
return Math_log10(x);
};
Util2.FAST_LOG10_X = function(x, y) {
return Math_log10(x) * y;
};
function ShortBlock2(ordinal) {
this.ordinal = ordinal;
}
ShortBlock2.short_block_allowed = new ShortBlock2(0);
ShortBlock2.short_block_coupled = new ShortBlock2(1);
ShortBlock2.short_block_dispensed = new ShortBlock2(2);
ShortBlock2.short_block_forced = new ShortBlock2(3);
var Float2 = {};
Float2.MAX_VALUE = 34028235e31;
function VbrMode2(ordinal) {
this.ordinal = ordinal;
}
VbrMode2.vbr_off = new VbrMode2(0);
VbrMode2.vbr_mt = new VbrMode2(1);
VbrMode2.vbr_rh = new VbrMode2(2);
VbrMode2.vbr_abr = new VbrMode2(3);
VbrMode2.vbr_mtrh = new VbrMode2(4);
VbrMode2.vbr_default = VbrMode2.vbr_mtrh;
function MPEGMode2(ordinal) {
var _ordinal = ordinal;
this.ordinal = function() {
return _ordinal;
};
}
MPEGMode2.STEREO = new MPEGMode2(0);
MPEGMode2.JOINT_STEREO = new MPEGMode2(1);
MPEGMode2.DUAL_CHANNEL = new MPEGMode2(2);
MPEGMode2.MONO = new MPEGMode2(3);
MPEGMode2.NOT_SET = new MPEGMode2(4);
function Version() {
var LAME_MAJOR_VERSION = 3;
var LAME_MINOR_VERSION = 98;
var LAME_PATCH_VERSION = 4;
this.getLameShortVersion = function() {
return LAME_MAJOR_VERSION + "." + LAME_MINOR_VERSION + "." + LAME_PATCH_VERSION;
};
}
function Takehiro() {
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(l2, istep, xr, xrPos, ix, ixPos) {
var compareval0 = (1 - 0.4054) / istep;
l2 = l2 >> 1;
while (l2-- != 0) {
ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1;
}
}
function quantize_lines_xrpow(l2, istep, xr, xrPos, ix, ixPos) {
l2 = l2 >> 1;
var remaining = l2 % 2;
l2 = l2 >> 1;
while (l2-- != 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 == Encoder2.SHORT_TYPE)
sfbmax = 38;
else
sfbmax = 21;
for (sfb = 0; sfb <= sfbmax; sfb++) {
var step = -1;
if (prev_data_use || codInfo.block_type == Encoder2.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;
}
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) {
abort();
}
} else {
var l2 = codInfo.width[sfb];
if (j + codInfo.width[sfb] > codInfo.max_nonzero_coeff) {
var usefullsize;
usefullsize = codInfo.max_nonzero_coeff - j + 1;
Arrays2.fill(pi, codInfo.max_nonzero_coeff, 576, 0);
l2 = usefullsize;
if (l2 < 0) {
l2 = 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 += l2;
} 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 += l2;
}
if (l2 <= 0) {
if (accumulate01 != 0) {
abort();
}
if (accumulate != 0) {
abort();
}
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) {
abort();
}
}
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 = Tables2.ht[t1].xlen * 65536 + Tables2.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 += Tables2.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 = Tables2.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 = Tables2.ht[t1].xlen;
var hlen;
if (t1 == 2)
hlen = Tables2.table23;
else
hlen = Tables2.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 = Tables2.ht[t1].xlen;
var hlen1 = Tables2.ht[t1].hlen;
var hlen2 = Tables2.ht[t1 + 1].hlen;
var hlen3 = Tables2.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.IXMAX_VAL) {
abort();
}
max -= 15;
var choice2;
for (choice2 = 24; choice2 < 32; choice2++) {
if (Tables2.ht[choice2].linmax >= max) {
break;
}
}
var choice;
for (choice = choice2 - 8; choice < 24; choice++) {
if (Tables2.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 p2;
if (((ix[i - 1] | ix[i - 2] | ix[i - 3] | ix[i - 4]) & 2147483647) > 1) {
break;
}
p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
a1 += Tables2.t32l[p2];
a2 += Tables2.t33l[p2];
}
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 == Encoder2.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 == Encoder2.NORM_TYPE) {
a1 = gi.region0_count = gfc.bv_scf[i - 2];
a2 = gi.region1_count = gfc.bv_scf[i - 1];
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 = Encoder2.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);
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) {
abort();
}
if (prev_noise != null) {
if (gi.block_type == Encoder2.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.IXMAX_VAL / qupvt.IPOW20(gi.global_gain);
if (gi.xrpow_max > w)
return QuantizePVT.LARGE_BITS;
quantize_xrpow(xr, ix, qupvt.IPOW20(gi.global_gain), gi, prev_noise);
if ((gfc.substep_shaping & 2) != 0) {
abort();
}
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.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 < Encoder2.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 GrInfo2();
var ix = gi.l3_enc;
var r01_bits = new_int2(7 + 15 + 1);
var r01_div = new_int2(7 + 15 + 1);
var r0_tbl = new_int2(7 + 15 + 1);
var r1_tbl = new_int2(7 + 15 + 1);
if (gi.block_type == Encoder2.SHORT_TYPE && gfc.mode_gr == 1)
return;
cod_info2.assign(gi);
if (gi.block_type == Encoder2.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;
for (; i > cod_info2.big_values; i -= 4) {
var p2 = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];
a1 += Tables2.t32l[p2];
a2 += Tables2.t33l[p2];
}
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 == Encoder2.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.slen1_tab = slen1_tab;
Takehiro.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 < Tables2.scfsi_band.length - 1; i++) {
for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.scfsi_band[i + 1]; sfb++) {
if (g0.scalefac[sfb] != gi.scalefac[sfb] && gi.scalefac[sfb] >= 0)
break;
}
if (sfb == Tables2.scfsi_band[i + 1]) {
for (sfb = Tables2.scfsi_band[i]; sfb < Tables2.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 < Encoder2.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, l2;
var recalc = 0;
j = 0;
for (sfb = 0; sfb < gi.sfbmax; sfb++) {
var width = gi.width[sfb];
j += width;
for (l2 = -width; l2 < 0; l2++) {
if (gi.l3_enc[l2 + j] != 0)
break;
}
if (l2 == 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 != Encoder2.SHORT_TYPE && gfc.mode_gr == 2) {
for (sfb = 11; sfb < Encoder2.SBPSY_l; sfb++)
if (gi.scalefac[sfb] < qupvt.pretab[sfb] && gi.scalefac[sfb] != -2)
break;
if (sfb == Encoder2.SBPSY_l) {
for (sfb = 11; sfb < Encoder2.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 != Encoder2.SHORT_TYPE && l3_side.tt[1][ch].block_type != Encoder2.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);
}
}
};
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 k2, sfb, max_slen1 = 0, max_slen2 = 0;
var tab;
var scalefac = cod_info.scalefac;
if (cod_info.block_type == Encoder2.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 < Encoder2.SBPSY_l; sfb++)
if (scalefac[sfb] < qupvt.pretab[sfb])
break;
if (sfb == Encoder2.SBPSY_l) {
cod_info.preflag = 1;
for (sfb = 11; sfb < Encoder2.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.LARGE_BITS;
for (k2 = 0; k2 < 16; k2++) {
if (max_slen1 < slen1_n[k2] && max_slen2 < slen2_n[k2] && cod_info.part2_length > tab[k2]) {
cod_info.part2_length = tab[k2];
cod_info.scalefac_compress = k2;
}
}
return cod_info.part2_length == QuantizePVT.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_int2(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 == Encoder2.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;
}
}
if (!over) {
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;
}
};
}
GainAnalysis2.STEPS_per_dB = 100;
GainAnalysis2.MAX_dB = 120;
GainAnalysis2.GAIN_NOT_ENOUGH_SAMPLES = -24601;
GainAnalysis2.GAIN_ANALYSIS_ERROR = 0;
GainAnalysis2.GAIN_ANALYSIS_OK = 1;
GainAnalysis2.INIT_GAIN_ANALYSIS_ERROR = 0;
GainAnalysis2.INIT_GAIN_ANALYSIS_OK = 1;
GainAnalysis2.YULE_ORDER = 10;
GainAnalysis2.MAX_ORDER = GainAnalysis2.YULE_ORDER;
GainAnalysis2.MAX_SAMP_FREQ = 48e3;
GainAnalysis2.RMS_WINDOW_TIME_NUMERATOR = 1;
GainAnalysis2.RMS_WINDOW_TIME_DENOMINATOR = 20;
GainAnalysis2.MAX_SAMPLES_PER_WINDOW = GainAnalysis2.MAX_SAMP_FREQ * GainAnalysis2.RMS_WINDOW_TIME_NUMERATOR / GainAnalysis2.RMS_WINDOW_TIME_DENOMINATOR + 1;
function GainAnalysis2() {
}
function Presets() {
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;
};
function apply_vbr_preset(gfp, a, enforce) {
abort();
}
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 = VbrMode2.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 k2 = int(abr_switch_map[r].nsbass * 4);
if (k2 < 0)
k2 += 64;
gfp.exp_nspsytune = gfp.exp_nspsytune | k2 << 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 Lame2.R3MIX: {
preset = Lame2.V3;
gfp.VBR = VbrMode2.vbr_mtrh;
break;
}
case Lame2.MEDIUM: {
preset = Lame2.V4;
gfp.VBR = VbrMode2.vbr_rh;
break;
}
case Lame2.MEDIUM_FAST: {
preset = Lame2.V4;
gfp.VBR = VbrMode2.vbr_mtrh;
break;
}
case Lame2.STANDARD: {
preset = Lame2.V2;
gfp.VBR = VbrMode2.vbr_rh;
break;
}
case Lame2.STANDARD_FAST: {
preset = Lame2.V2;
gfp.VBR = VbrMode2.vbr_mtrh;
break;
}
case Lame2.EXTREME: {
preset = Lame2.V0;
gfp.VBR = VbrMode2.vbr_rh;
break;
}
case Lame2.EXTREME_FAST: {
preset = Lame2.V0;
gfp.VBR = VbrMode2.vbr_mtrh;
break;
}
case Lame2.INSANE: {
preset = 320;
gfp.preset = preset;
apply_abr_preset(gfp, preset, enforce);
gfp.VBR = VbrMode2.vbr_off;
return preset;
}
}
gfp.preset = preset;
{
switch (preset) {
case Lame2.V9:
apply_vbr_preset();
return preset;
case Lame2.V8:
apply_vbr_preset();
return preset;
case Lame2.V7:
apply_vbr_preset();
return preset;
case Lame2.V6:
apply_vbr_preset();
return preset;
case Lame2.V5:
apply_vbr_preset();
return preset;
case Lame2.V4:
apply_vbr_preset();
return preset;
case Lame2.V3:
apply_vbr_preset();
return preset;
case Lame2.V2:
apply_vbr_preset();
return preset;
case Lame2.V1:
apply_vbr_preset();
return preset;
case Lame2.V0:
apply_vbr_preset();
return preset;
}
}
if (8 <= preset && preset <= 320) {
return apply_abr_preset(gfp, preset, enforce);
}
gfp.preset = 0;
return preset;
};
}
function Reservoir() {
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) {
abort();
} else {
maxmp3buf = 8 * 1440;
if (gfp.strict_ISO) {
abort();
}
}
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;
l3_side.resvDrain_pre = 0;
if (gfc.pinfo != null) {
abort();
}
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) {
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;
};
}
VBRTag2.NUMTOCENTRIES = 100;
VBRTag2.MAXFRAMESIZE = 2880;
function VBRTag2() {
this.setModules = function(_lame, _bs, _v) {
};
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 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]);
};
}
BitStream.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.NEQ = function(a, b) {
return !BitStream.EQ(a, b);
};
function BitStream() {
var self2 = this;
var ver = null;
var vbr = null;
this.setModules = function(_ga, _mpg, _ver, _vbr) {
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 = Tables2.bitrate_table[gfp.version][gfc.bitrate_index];
else
bit_rate = gfp.brate;
var bytes = 0 | (gfp.version + 1) * 72e3 * bit_rate / gfp.out_samplerate + gfc.padding;
return 8 * bytes;
};
function putheader_bits(gfc) {
System2.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 & LameInternalFlags2.MAX_HEADER_BUF - 1;
}
function putbits2(gfc, val, j) {
while (j > 0) {
var k2;
if (bufBitIdx == 0) {
bufBitIdx = 8;
bufByteIdx++;
if (gfc.header[gfc.w_ptr].write_timing == totbit) {
putheader_bits(gfc);
}
buf[bufByteIdx] = 0;
}
k2 = Math.min(j, bufBitIdx);
j -= k2;
bufBitIdx -= k2;
buf[bufByteIdx] |= val >> j << bufBitIdx;
totbit += k2;
}
}
function drain_into_ancillary(gfp, remainingBits) {
var gfc = gfp.internal_flags;
var i;
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.charCodeAt(i), 8);
}
}
for (; remainingBits >= 1; remainingBits -= 1) {
putbits2(gfc, gfc.ancillary_flag, 1);
gfc.ancillary_flag ^= !gfp.disable_reservoir ? 1 : 0;
}
}
function writeheader(gfc, val, j) {
var ptr = gfc.header[gfc.h_ptr].ptr;
while (j > 0) {
var k2 = Math.min(j, 8 - (ptr & 7));
j -= k2;
gfc.header[gfc.h_ptr].buf[ptr >> 3] |= val >> j << 8 - (ptr & 7) - k2;
ptr += k2;
}
gfc.header[gfc.h_ptr].ptr = ptr;
}
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;
Arrays2.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) {
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 != Encoder2.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);
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 {
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 != Encoder2.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);
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) {
abort();
}
{
var old = gfc.h_ptr;
gfc.h_ptr = old + 1 & LameInternalFlags2.MAX_HEADER_BUF - 1;
gfc.header[gfc.h_ptr].write_timing = gfc.header[old].write_timing + bitsPerFrame;
if (gfc.h_ptr == gfc.w_ptr) ;
}
}
function huffman_coder_count1(gfc, gi) {
var h = Tables2.ht[gi.count1table_select + 32];
var i, bits = 0;
var ix = gi.big_values;
var xr = gi.big_values;
for (i = (gi.count1 - gi.big_values) / 4; i > 0; --i) {
var huffbits = 0;
var p2 = 0, v;
v = gi.l3_enc[ix + 0];
if (v != 0) {
p2 += 8;
if (gi.xr[xr + 0] < 0)
huffbits++;
}
v = gi.l3_enc[ix + 1];
if (v != 0) {
p2 += 4;
huffbits *= 2;
if (gi.xr[xr + 1] < 0)
huffbits++;
}
v = gi.l3_enc[ix + 2];
if (v != 0) {
p2 += 2;
huffbits *= 2;
if (gi.xr[xr + 2] < 0)
huffbits++;
}
v = gi.l3_enc[ix + 3];
if (v != 0) {
p2++;
huffbits *= 2;
if (gi.xr[xr + 3] < 0)
huffbits++;
}
ix += 4;
xr += 4;
putbits2(gfc, huffbits + h.table[p2], h.hlen[p2]);
bits += h.hlen[p2];
}
return bits;
}
function Huffmancode(gfc, tableindex, start, end, gi) {
var h = Tables2.ht[tableindex];
var bits = 0;
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;
ext |= linbits_x1 << 1;
xbits = linbits;
x1 = 15;
}
if (x2 > 14) {
var linbits_x2 = x2 - 15;
ext <<= linbits;
ext |= linbits_x2;
xbits += linbits;
x2 = 15;
}
xlen = 16;
}
if (x2 != 0) {
ext <<= 1;
if (gi.xr[i + 1] < 0)
ext++;
cbits--;
}
x1 = x1 * xlen + x2;
xbits -= cbits;
cbits += h.hlen[x1];
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;
var i = gi.region0_count + 1;
region1Start = gfc.scalefac_band.l[i];
i += gi.region1_count + 1;
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.slen1_tab[gi.scalefac_compress];
var slen2 = Takehiro.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;
}
if (gi.block_type == Encoder2.SHORT_TYPE) {
data_bits += ShortHuffmancodebits(gfc, gi);
} else {
data_bits += LongHuffmancodebits(gfc, gi);
}
data_bits += huffman_coder_count1(gfc, gi);
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;
data_bits = 0;
sfb = 0;
sfb_partition = 0;
if (gi.block_type == Encoder2.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);
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;
var bitsPerFrame;
var last_ptr;
gfc.w_ptr;
last_ptr = gfc.h_ptr - 1;
if (last_ptr == -1)
last_ptr = LameInternalFlags2.MAX_HEADER_BUF - 1;
flushbits = gfc.header[last_ptr].write_timing - totbit;
total_bytes_output.total = flushbits;
if (flushbits >= 0) {
abort();
}
bitsPerFrame = self2.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;
return flushbits;
}
this.flush_bitstream = function(gfp) {
var gfc = gfp.internal_flags;
var l3_side;
var flushbits;
gfc.h_ptr - 1;
l3_side = gfc.l3_side;
if ((flushbits = compute_flushbits(gfp, new TotalBytes())) < 0)
return;
drain_into_ancillary(gfp, flushbits);
gfc.ResvSize = 0;
l3_side.main_data_begin = 0;
if (gfc.findReplayGain) {
abort();
}
if (gfc.findPeakSample) {
abort();
}
};
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) ;
if (l3_side.main_data_begin * 8 != gfc.ResvSize) {
gfc.ResvSize = l3_side.main_data_begin * 8;
}
if (totbit > 1e9) {
var i;
for (i = 0; i < LameInternalFlags2.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;
}
System2.arraycopy(buf, 0, buffer, bufferPos, minimum);
bufByteIdx = -1;
bufBitIdx = 0;
if (mp3data != 0) {
var crc = new_int2(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) {
abort();
}
}
return minimum;
};
this.init_bit_stream_w = function(gfc) {
buf = new_byte2(Lame2.LAME_MAXMP3BUFFER);
gfc.h_ptr = gfc.w_ptr = 0;
gfc.header[gfc.h_ptr].write_timing = 0;
bufByteIdx = -1;
bufBitIdx = 0;
totbit = 0;
};
}
function HuffCodeTab2(len, max, tab, hl) {
this.xlen = len;
this.linmax = max;
this.table = tab;
this.hlen = hl;
}
var Tables2 = {};
Tables2.t1HB = [
1,
1,
1,
0
];
Tables2.t2HB = [
1,
2,
1,
3,
1,
1,
3,
2,
0
];
Tables2.t3HB = [
3,
2,
1,
1,
1,
1,
3,
2,
0
];
Tables2.t5HB = [
1,
2,
6,
5,
3,
1,
4,
4,
7,
5,
7,
1,
6,
1,
1,
0
];
Tables2.t6HB = [
7,
3,
5,
1,
6,
2,
3,
2,
5,
4,
4,
1,
3,
3,
2,
0
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.t1l = [
1,
4,
3,
5
];
Tables2.t2l = [
1,
4,
7,
4,
5,
7,
6,
7,
8
];
Tables2.t3l = [
2,
3,
7,
4,
4,
7,
6,
7,
8
];
Tables2.t5l = [
1,
4,
7,
8,
4,
5,
8,
9,
7,
8,
9,
10,
8,
8,
9,
10
];
Tables2.t6l = [
3,
4,
6,
8,
4,
4,
6,
7,
5,
6,
7,
8,
7,
7,
8,
9
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.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
];
Tables2.ht = [
/* xlen, linmax, table, hlen */
new HuffCodeTab2(0, 0, null, null),
new HuffCodeTab2(2, 0, Tables2.t1HB, Tables2.t1l),
new HuffCodeTab2(3, 0, Tables2.t2HB, Tables2.t2l),
new HuffCodeTab2(3, 0, Tables2.t3HB, Tables2.t3l),
new HuffCodeTab2(0, 0, null, null),
/* Apparently not used */
new HuffCodeTab2(4, 0, Tables2.t5HB, Tables2.t5l),
new HuffCodeTab2(4, 0, Tables2.t6HB, Tables2.t6l),
new HuffCodeTab2(6, 0, Tables2.t7HB, Tables2.t7l),
new HuffCodeTab2(6, 0, Tables2.t8HB, Tables2.t8l),
new HuffCodeTab2(6, 0, Tables2.t9HB, Tables2.t9l),
new HuffCodeTab2(8, 0, Tables2.t10HB, Tables2.t10l),
new HuffCodeTab2(8, 0, Tables2.t11HB, Tables2.t11l),
new HuffCodeTab2(8, 0, Tables2.t12HB, Tables2.t12l),
new HuffCodeTab2(16, 0, Tables2.t13HB, Tables2.t13l),
new HuffCodeTab2(0, 0, null, Tables2.t16_5l),
/* Apparently not used */
new HuffCodeTab2(16, 0, Tables2.t15HB, Tables2.t15l),
new HuffCodeTab2(1, 1, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(2, 3, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(3, 7, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(4, 15, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(6, 63, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(8, 255, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(10, 1023, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(13, 8191, Tables2.t16HB, Tables2.t16l),
new HuffCodeTab2(4, 15, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(5, 31, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(6, 63, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(7, 127, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(8, 255, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(9, 511, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(11, 2047, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(13, 8191, Tables2.t24HB, Tables2.t24l),
new HuffCodeTab2(0, 0, Tables2.t32HB, Tables2.t32l),
new HuffCodeTab2(0, 0, Tables2.t33HB, Tables2.t33l)
];
Tables2.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
];
Tables2.table23 = [
65538,
262147,
458759,
262148,
327684,
458759,
393222,
458759,
524296
];
Tables2.table56 = [
65539,
262148,
458758,
524296,
262148,
327684,
524294,
589831,
458757,
524294,
589831,
655368,
524295,
524295,
589832,
655369
];
Tables2.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 */
];
Tables2.samplerate_table = [
[22050, 24e3, 16e3, -1],
[44100, 48e3, 32e3, -1],
[11025, 12e3, 8e3, -1]
];
Tables2.scfsi_band = [0, 6, 11, 16, 21];
function MeanBits2(meanBits) {
this.bits = meanBits;
}
function CalcNoiseResult2() {
this.over_noise = 0;
this.tot_noise = 0;
this.max_noise = 0;
this.over_count = 0;
this.over_SSD = 0;
this.bits = 0;
}
function VBRQuantize() {
this.setModules = function(_qupvt, _tk) {
};
}
function ATH2() {
this.useAdjust = 0;
this.aaSensitivityP = 0;
this.adjust = 0;
this.adjustLimit = 0;
this.decay = 0;
this.floor = 0;
this.l = new_float2(Encoder2.SBMAX_l);
this.s = new_float2(Encoder2.SBMAX_s);
this.psfb21 = new_float2(Encoder2.PSFB21);
this.psfb12 = new_float2(Encoder2.PSFB12);
this.cb_l = new_float2(Encoder2.CBANDS);
this.cb_s = new_float2(Encoder2.CBANDS);
this.eql_w = new_float2(Encoder2.BLKSIZE / 2);
}
function LameGlobalFlags2() {
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 = MPEGMode2.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;
}
function CBRNewIterationLoop2(_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_float2(L3Side2.SFBMAX);
var xrpow = new_float2(576);
var targ_bits = new_int2(2);
var mean_bits = 0;
var l3_side = gfc.l3_side;
var mb = new MeanBits2(mean_bits);
this.quantize.rv.ResvFrameBegin(gfp, mb);
mean_bits = mb.bits;
for (var gr = 0; gr < gfc.mode_gr; gr++) {
this.quantize.qupvt.on_pe(
gfp,
pe,
targ_bits,
mean_bits,
gr,
gr
);
if (gfc.mode_ext == Encoder2.MPG_MD_MS_LR) {
abort();
}
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 != Encoder2.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);
}
}
this.quantize.rv.ResvFrameEnd(gfc, mean_bits);
};
}
function ReplayGain2() {
}
function ScaleFac2(arrL, arrS, arr21, arr12) {
this.l = new_int2(1 + Encoder2.SBMAX_l);
this.s = new_int2(1 + Encoder2.SBMAX_s);
this.psfb21 = new_int2(1 + Encoder2.PSFB21);
this.psfb12 = new_int2(1 + Encoder2.PSFB12);
var l2 = 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];
System2.arraycopy(this.arrL, 0, l2, 0, Math.min(this.arrL.length, this.l.length));
System2.arraycopy(this.arrS, 0, s, 0, Math.min(this.arrS.length, this.s.length));
System2.arraycopy(this.arr21, 0, this.psfb21, 0, Math.min(this.arr21.length, this.psfb21.length));
System2.arraycopy(this.arr12, 0, this.psfb12, 0, Math.min(this.arr12.length, this.psfb12.length));
}
}
QuantizePVT.Q_MAX = 256 + 1;
QuantizePVT.Q_MAX2 = 116;
QuantizePVT.LARGE_BITS = 1e5;
QuantizePVT.IXMAX_VAL = 8206;
function QuantizePVT() {
var tak = null;
var rv = null;
var psy = null;
this.setModules = function(_tk, _rv, _psy) {
tak = _tk;
rv = _rv;
psy = _psy;
};
function POW20(x) {
return pow20[x + QuantizePVT.Q_MAX2];
}
this.IPOW20 = function(x) {
return ipow20[x];
};
var DBL_EPSILON = 2220446049250313e-31;
var IXMAX_VAL = QuantizePVT.IXMAX_VAL;
var PRECALC_SIZE = IXMAX_VAL + 2;
var Q_MAX = QuantizePVT.Q_MAX;
var Q_MAX2 = QuantizePVT.Q_MAX2;
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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 ScaleFac2(
[
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_float2(Q_MAX + Q_MAX2 + 1);
var ipow20 = new_float2(Q_MAX);
var pow43 = new_float2(PRECALC_SIZE);
var adj43 = new_float2(PRECALC_SIZE);
this.adj43 = adj43;
function ATHmdct(gfp, f2) {
var ath = psy.ATHformula(f2, 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 < Encoder2.SBMAX_l; sfb++) {
var start = gfc.scalefac_band.l[sfb];
var end = gfc.scalefac_band.l[sfb + 1];
ATH_l[sfb] = Float2.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 < Encoder2.PSFB21; sfb++) {
var start = gfc.scalefac_band.psfb21[sfb];
var end = gfc.scalefac_band.psfb21[sfb + 1];
ATH_psfb21[sfb] = Float2.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 < Encoder2.SBMAX_s; sfb++) {
var start = gfc.scalefac_band.s[sfb];
var end = gfc.scalefac_band.s[sfb + 1];
ATH_s[sfb] = Float2.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 < Encoder2.PSFB12; sfb++) {
var start = gfc.scalefac_band.psfb12[sfb];
var end = gfc.scalefac_band.psfb12[sfb + 1];
ATH_psfb12[sfb] = Float2.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) {
abort();
}
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 < Encoder2.SBMAX_l; i++) {
var f2;
if (i <= 6)
f2 = bass;
else if (i <= 13)
f2 = alto;
else if (i <= 20)
f2 = treble;
else
f2 = sfb21;
gfc.nsPsy.longfact[i] = f2;
}
for (i = 0; i < Encoder2.SBMAX_s; i++) {
var f2;
if (i <= 5)
f2 = bass;
else if (i <= 10)
f2 = alto;
else if (i <= 11)
f2 = treble;
else
f2 = sfb21;
gfc.nsPsy.shortfact[i] = f2;
}
}
}
};
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_int2(2);
var ch;
var mb = new MeanBits2(tbits);
var extra_bits = rv.ResvMaxBits(gfp, mean_bits, mb, cbr);
tbits = mb.bits;
var max_bits = tbits + extra_bits;
if (max_bits > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
max_bits = LameInternalFlags2.MAX_BITS_PER_GRANULE;
}
for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) {
targ_bits[ch] = Math.min(
LameInternalFlags2.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] > LameInternalFlags2.MAX_BITS_PER_CHANNEL)
add_bits[ch] = Math.max(
0,
LameInternalFlags2.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 > LameInternalFlags2.MAX_BITS_PER_GRANULE) {
abort();
}
return max_bits;
};
this.athAdjust = function(a, x, athFloor) {
var o = 90.30873362;
var p2 = 94.82444863;
var u = Util2.FAST_LOG10_X(x, 10);
var v = a * a;
var w = 0;
u -= athFloor;
if (v > 1e-20)
w = 1 + Util2.FAST_LOG10_X(v, 10 / o);
if (w < 0)
w = 0;
u *= w;
u += athFloor + o - p2;
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 ATH3 = gfc.ATH;
var xr = cod_info.xr;
var enable_athaa_fix = gfp.VBR == VbrMode2.vbr_mtrh ? 1 : 0;
var masking_lower = gfc.masking_lower;
if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
masking_lower = 1;
}
for (gsfb = 0; gsfb < cod_info.psy_lmax; gsfb++) {
var en0, xmin;
var rh1, rh2;
var width, l2;
if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
xmin = athAdjust(ATH3.adjust, ATH3.l[gsfb], ATH3.floor);
else
xmin = ATH3.adjust * ATH3.l[gsfb];
width = cod_info.width[gsfb];
rh1 = xmin / width;
rh2 = DBL_EPSILON;
l2 = 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 (--l2 > 0);
if (en0 > xmin)
ath_over++;
if (gsfb == Encoder2.SBPSY_l) {
abort();
}
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 != Encoder2.SHORT_TYPE) {
var k2 = 576;
while (k2-- != 0 && BitStream.EQ(xr[k2], 0)) {
max_nonzero = k2;
}
}
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 == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
tmpATH = athAdjust(ATH3.adjust, ATH3.s[sfb], ATH3.floor);
else
tmpATH = ATH3.adjust * ATH3.s[sfb];
width = cod_info.width[gsfb];
for (b = 0; b < 3; b++) {
var en0 = 0, xmin;
var rh1, rh2;
var l2 = 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 (--l2 > 0);
if (en0 > tmpATH)
ath_over++;
if (sfb == Encoder2.SBPSY_s) {
abort();
}
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, l2, step) {
var noise = 0;
var j = startline.s;
var ix = cod_info.l3_enc;
if (j > cod_info.count1) {
while (l2-- != 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_float2(2);
ix01[0] = 0;
ix01[1] = step;
while (l2-- != 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 (l2-- != 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, l2, 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);
l2 = 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)
l2 = usefullsize >> 1;
else
l2 = 0;
}
var sl = new StartLine(j);
noise = this.calc_noise_core(cod_info, sl, l2, 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 = Util2.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;
};
}
function CalcNoiseData() {
this.global_gain = 0;
this.sfb_count1 = 0;
this.step = new_int2(39);
this.noise = new_float2(39);
this.noise_log = new_float2(39);
}
function GrInfo2() {
this.xr = new_float2(576);
this.l3_enc = new_int2(576);
this.scalefac = new_int2(L3Side2.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_int2(3);
this.subblock_gain = new_int2(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_int2(L3Side2.SFBMAX);
this.window = new_int2(L3Side2.SFBMAX);
this.count1bits = 0;
this.sfb_partition_table = null;
this.slen = new_int2(4);
this.max_nonzero_coeff = 0;
var self2 = this;
function clone_int(array) {
return new Int32Array(array);
}
function clone_float(array) {
return new Float32Array(array);
}
this.assign = function(other) {
self2.xr = clone_float(other.xr);
self2.l3_enc = clone_int(other.l3_enc);
self2.scalefac = clone_int(other.scalefac);
self2.xrpow_max = other.xrpow_max;
self2.part2_3_length = other.part2_3_length;
self2.big_values = other.big_values;
self2.count1 = other.count1;
self2.global_gain = other.global_gain;
self2.scalefac_compress = other.scalefac_compress;
self2.block_type = other.block_type;
self2.mixed_block_flag = other.mixed_block_flag;
self2.table_select = clone_int(other.table_select);
self2.subblock_gain = clone_int(other.subblock_gain);
self2.region0_count = other.region0_count;
self2.region1_count = other.region1_count;
self2.preflag = other.preflag;
self2.scalefac_scale = other.scalefac_scale;
self2.count1table_select = other.count1table_select;
self2.part2_length = other.part2_length;
self2.sfb_lmax = other.sfb_lmax;
self2.sfb_smin = other.sfb_smin;
self2.psy_lmax = other.psy_lmax;
self2.sfbmax = other.sfbmax;
self2.psymax = other.psymax;
self2.sfbdivide = other.sfbdivide;
self2.width = clone_int(other.width);
self2.window = clone_int(other.window);
self2.count1bits = other.count1bits;
self2.sfb_partition_table = other.sfb_partition_table.slice(0);
self2.slen = clone_int(other.slen);
self2.max_nonzero_coeff = other.max_nonzero_coeff;
};
}
var L3Side2 = {};
L3Side2.SFBMAX = Encoder2.SBMAX_s * 3;
function Quantize() {
this.rv = null;
var rv;
this.qupvt = null;
var qupvt;
var vbr = new VBRQuantize();
var tk;
this.setModules = function(_bs, _rv, _qupvt, _tk) {
rv = _rv;
this.rv = _rv;
qupvt = _qupvt;
this.qupvt = _qupvt;
tk = _tk;
vbr.setModules(qupvt, tk);
};
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;
cod_info.xrpow_max = 0;
Arrays2.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;
}
Arrays2.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 != Encoder2.SHORT_TYPE) {
var stop = false;
for (var gsfb = Encoder2.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 = Encoder2.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 = Encoder2.SBPSY_l;
cod_info.sfb_smin = Encoder2.SBPSY_s;
cod_info.psy_lmax = gfc.sfb21_extra ? Encoder2.SBMAX_l : Encoder2.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 < Encoder2.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 == Encoder2.SHORT_TYPE) {
var ixwork = new_float2(576);
cod_info.sfb_smin = 0;
cod_info.sfb_lmax = 0;
if (cod_info.mixed_block_flag != 0) {
abort();
}
cod_info.psymax = cod_info.sfb_lmax + 3 * ((gfc.sfb21_extra ? Encoder2.SBMAX_s : Encoder2.SBPSY_s) - cod_info.sfb_smin);
cod_info.sfbmax = cod_info.sfb_lmax + 3 * (Encoder2.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];
System2.arraycopy(cod_info.xr, 0, ixwork, 0, 576);
for (var sfb = cod_info.sfb_smin; sfb < Encoder2.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 l2 = start; l2 < end; l2++) {
cod_info.xr[ix++] = ixwork[3 * l2 + window2];
}
}
}
var j = cod_info.sfb_lmax;
for (var sfb = cod_info.sfb_smin; sfb < Encoder2.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;
Arrays2.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;
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) {
abort();
}
if (cod_info.global_gain > 255) {
abort();
}
}
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;
}
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 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:
abort();
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) {
abort();
}
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 l2;
j += width;
if (distort[sfb] < trigger)
continue;
if ((gfc.substep_shaping & 2) != 0) {
abort();
}
cod_info.scalefac[sfb]++;
for (l2 = -width; l2 < 0; l2++) {
xrpow[j + l2] *= ifqstep34;
if (xrpow[j + l2] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l2];
}
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 l2 = -width; l2 < 0; l2++) {
xrpow[j + l2] *= ifqstep34;
if (xrpow[j + l2] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l2];
}
}
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];
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 l2 = -width; l2 < 0; l2++) {
xrpow[j + l2] *= amp;
if (xrpow[j + l2] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l2];
}
j += width * (3 - window2 - 1);
}
{
var amp = qupvt.IPOW20(202);
j += cod_info.width[sfb] * (window2 + 1);
for (var l2 = -cod_info.width[sfb]; l2 < 0; l2++) {
xrpow[j + l2] *= amp;
if (xrpow[j + l2] > cod_info.xrpow_max)
cod_info.xrpow_max = xrpow[j + l2];
}
}
}
return false;
}
function balance_noise(gfp, cod_info, distort, xrpow, bRefine) {
var gfc = gfp.internal_flags;
amp_scalefac_bands(gfp, cod_info, distort, xrpow);
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) {
Arrays2.fill(gfc.pseudohalf, 0);
if (0 == cod_info.scalefac_scale) {
inc_scalefac_scale(cod_info, xrpow);
status = false;
} else {
if (cod_info.block_type == Encoder2.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 GrInfo2();
var save_xrpow = new_float2(576);
var distort = new_float2(L3Side2.SFBMAX);
var best_noise_info = new CalcNoiseResult2();
var better;
var prev_noise = new CalcNoiseData();
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;
System2.arraycopy(xrpow, 0, save_xrpow, 0, 576);
while (!bEndOfSearch) {
do {
var noise_info = new CalcNoiseResult2();
var search_limit;
var maxggain = 255;
if ((gfc.substep_shaping & 2) != 0) {
search_limit = 20;
} else {
search_limit = 3;
}
if (gfc.sfb21_extra) {
abort();
}
if (!balance_noise(gfp, cod_info_w, distort, xrpow))
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 != Encoder2.SHORT_TYPE) {
better = gfp.quant_comp;
} else
better = gfp.quant_comp_short;
better = quant_compare(better, best_noise_info, noise_info) ? 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;
System2.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) {
abort();
} else {
bEndOfSearch = true;
}
}
if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh)
System2.arraycopy(save_xrpow, 0, xrpow, 0, 576);
else if ((gfc.substep_shaping & 1) != 0)
abort();
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);
};
}
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 * Util2.SQRT2 * 0.5 / 2384e-9,
0.017876148 * Util2.SQRT2 * 0.5 / 2384e-9,
3134727e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
2457142e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
971317e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
218868e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
101566e-9 * Util2.SQRT2 * 0.5 / 2384e-9,
13828e-9 * Util2.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[Encoder2.SHORT_TYPE];
var cx = win[Encoder2.SHORT_TYPE];
var ca = win[Encoder2.SHORT_TYPE];
var cs = win[Encoder2.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 * Util2.SQRT2;
xr = a[23] - a[7];
a[7] += a[23];
a[23] = xr * Util2.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 = Util2.SQRT2 * (a[2] - a[10]);
a[2] += a[10];
a[10] = xr;
xr = Util2.SQRT2 * (a[3] - a[11]);
a[3] += a[11];
a[11] = xr;
xr = Util2.SQRT2 * (-a[18] + a[26]);
a[18] += a[26];
a[26] = xr - a[18];
xr = Util2.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 = Util2.SQRT2 * (a[0] - a[4]);
a[0] += a[4];
a[4] = xr;
xr = Util2.SQRT2 * (a[1] - a[5]);
a[1] += a[5];
a[5] = xr;
xr = Util2.SQRT2 * (a[16] - a[20]);
a[16] += a[20];
a[20] = xr;
xr = Util2.SQRT2 * (a[17] - a[21]);
a[17] += a[21];
a[21] = xr;
xr = -Util2.SQRT2 * (a[8] - a[12]);
a[8] += a[12];
a[12] = xr - a[8];
xr = -Util2.SQRT2 * (a[9] - a[13]);
a[9] += a[13];
a[13] = xr - a[9];
xr = -Util2.SQRT2 * (a[25] - a[29]);
a[25] += a[29];
a[29] = xr - a[25];
xr = -Util2.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 l2 = 0; l2 < 3; l2++) {
var tc0, tc1, tc2, ts0, ts1, ts2;
ts0 = inout[inoutPos + 2 * 3] * win[Encoder2.SHORT_TYPE][0] - inout[inoutPos + 5 * 3];
tc0 = inout[inoutPos + 0 * 3] * win[Encoder2.SHORT_TYPE][2] - inout[inoutPos + 3 * 3];
tc1 = ts0 + tc0;
tc2 = ts0 - tc0;
ts0 = inout[inoutPos + 5 * 3] * win[Encoder2.SHORT_TYPE][0] + inout[inoutPos + 2 * 3];
tc0 = inout[inoutPos + 3 * 3] * win[Encoder2.SHORT_TYPE][2] + inout[inoutPos + 0 * 3];
ts1 = ts0 + tc0;
ts2 = -ts0 + tc0;
tc0 = (inout[inoutPos + 1 * 3] * win[Encoder2.SHORT_TYPE][1] - inout[inoutPos + 4 * 3]) * 2069978111953089e-26;
ts0 = (inout[inoutPos + 4 * 3] * win[Encoder2.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 k2 = 0; k2 < 18 / 2; k2++) {
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) {
Arrays2.fill(
mdct_enc,
mdct_encPos + 0,
mdct_encPos + 18,
0
);
} else {
if (gfc.amp_filter[band] < 1) {
abort();
}
if (type == Encoder2.SHORT_TYPE) {
for (var k2 = -NS / 4; k2 < 0; k2++) {
var w = win[Encoder2.SHORT_TYPE][k2 + 3];
mdct_enc[mdct_encPos + k2 * 3 + 9] = band0[9 + k2][order[band]] * w - band0[8 - k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 18] = band0[14 - k2][order[band]] * w + band0[15 + k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 10] = band0[15 + k2][order[band]] * w - band0[14 - k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 19] = band1[2 - k2][order[band]] * w + band1[3 + k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 11] = band1[3 + k2][order[band]] * w - band1[2 - k2][order[band]];
mdct_enc[mdct_encPos + k2 * 3 + 20] = band1[8 - k2][order[band]] * w + band1[9 + k2][order[band]];
}
mdct_short(mdct_enc, mdct_encPos);
} else {
var work = new_float2(18);
for (var k2 = -NL / 4; k2 < 0; k2++) {
var a, b;
a = win[type][k2 + 27] * band1[k2 + 9][order[band]] + win[type][k2 + 36] * band1[8 - k2][order[band]];
b = win[type][k2 + 9] * band0[k2 + 9][order[band]] - win[type][k2 + 18] * band0[8 - k2][order[band]];
work[k2 + 9] = a - b * tantab_l[3 + k2 + 9];
work[k2 + 18] = a * tantab_l[3 + k2 + 9] + b;
}
mdct_long(mdct_enc, mdct_encPos, work);
}
}
if (type != Encoder2.SHORT_TYPE && band != 0) {
for (var k2 = 7; k2 >= 0; --k2) {
var bu, bd;
bu = mdct_enc[mdct_encPos + k2] * ca[20 + k2] + mdct_enc[mdct_encPos + -1 - k2] * cs[28 + k2];
bd = mdct_enc[mdct_encPos + k2] * cs[28 + k2] - mdct_enc[mdct_encPos + -1 - k2] * ca[20 + k2];
mdct_enc[mdct_encPos + -1 - k2] = bu;
mdct_enc[mdct_encPos + k2] = bd;
}
}
}
}
wk = w1;
wkPos = 286;
if (gfc.mode_gr == 1) {
for (var i = 0; i < 18; i++) {
System2.arraycopy(
gfc.sb_sample[ch][1][i],
0,
gfc.sb_sample[ch][0][i],
0,
32
);
}
}
}
};
}
function III_psy_ratio() {
this.thm = new III_psy_xmin2();
this.en = new III_psy_xmin2();
}
Encoder2.ENCDELAY = 576;
Encoder2.POSTDELAY = 1152;
Encoder2.MDCTDELAY = 48;
Encoder2.FFTOFFSET = 224 + Encoder2.MDCTDELAY;
Encoder2.DECDELAY = 528;
Encoder2.SBLIMIT = 32;
Encoder2.CBANDS = 64;
Encoder2.SBPSY_l = 21;
Encoder2.SBPSY_s = 12;
Encoder2.SBMAX_l = 22;
Encoder2.SBMAX_s = 13;
Encoder2.PSFB21 = 6;
Encoder2.PSFB12 = 6;
Encoder2.BLKSIZE = 1024;
Encoder2.HBLKSIZE = Encoder2.BLKSIZE / 2 + 1;
Encoder2.BLKSIZE_s = 256;
Encoder2.HBLKSIZE_s = Encoder2.BLKSIZE_s / 2 + 1;
Encoder2.NORM_TYPE = 0;
Encoder2.START_TYPE = 1;
Encoder2.SHORT_TYPE = 2;
Encoder2.STOP_TYPE = 3;
Encoder2.MPG_MD_LR_LR = 0;
Encoder2.MPG_MD_LR_I = 1;
Encoder2.MPG_MD_MS_LR = 2;
Encoder2.MPG_MD_MS_I = 3;
Encoder2.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 Encoder2() {
var MPG_MD_MS_LR = Encoder2.MPG_MD_MS_LR;
var bs = null;
this.psy = null;
var psy = null;
var vbr = null;
this.setModules = function(_bs, _psy, _qupvt, _vbr) {
bs = _bs;
this.psy = _psy;
psy = _psy;
vbr = _vbr;
};
var newMDCT = new NewMDCT();
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) {
abort();
} 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;
gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][4]++;
gfc.bitrate_stereoMode_Hist[15][4]++;
if (gfc.channels_out == 2) {
abort();
}
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_float2(286 + 1152 + 576);
var primebuff1 = new_float2(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 = Encoder2.SHORT_TYPE;
}
}
newMDCT.mdct_sub48(gfc, primebuff0, primebuff1);
}
}
this.lame_encode_mp3_frame = function(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
var mp3count;
var masking_LR = new_array_n2([2, 2]);
masking_LR[0][0] = new III_psy_ratio();
masking_LR[0][1] = new III_psy_ratio();
masking_LR[1][0] = new III_psy_ratio();
masking_LR[1][1] = new III_psy_ratio();
var masking_MS = new_array_n2([2, 2]);
masking_MS[0][0] = new III_psy_ratio();
masking_MS[0][1] = new III_psy_ratio();
masking_MS[1][0] = new III_psy_ratio();
masking_MS[1][1] = new III_psy_ratio();
var masking;
var inbuf = [null, null];
var gfc = gfp.internal_flags;
var tot_ener = new_float_n2([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_int2(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 - Encoder2.FFTOFFSET;
}
if (gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) {
abort();
} 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 == MPEGMode2.JOINT_STEREO) {
abort();
}
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 {
abort();
}
adjust_ATH(gfc);
newMDCT.mdct_sub48(gfc, inbuf[0], inbuf[1]);
gfc.mode_ext = Encoder2.MPG_MD_LR_LR;
if (gfp.force_ms) {
gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
} else if (gfp.mode == MPEGMode2.JOINT_STEREO) {
abort();
}
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) {
abort();
}
if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_abr) {
var i;
var f2;
for (i = 0; i < 18; i++)
gfc.nsPsy.pefirbuf[i] = gfc.nsPsy.pefirbuf[i + 1];
f2 = 0;
for (gr = 0; gr < gfc.mode_gr; gr++)
for (ch = 0; ch < gfc.channels_out; ch++)
f2 += pe_use[gr][ch];
gfc.nsPsy.pefirbuf[18] = f2;
f2 = gfc.nsPsy.pefirbuf[9];
for (i = 0; i < 9; i++)
f2 += (gfc.nsPsy.pefirbuf[i] + gfc.nsPsy.pefirbuf[18 - i]) * Encoder2.fircoef[i];
f2 = 670 * 5 * gfc.mode_gr * gfc.channels_out / f2;
for (gr = 0; gr < gfc.mode_gr; gr++) {
for (ch = 0; ch < gfc.channels_out; ch++) {
pe_use[gr][ch] *= f2;
}
}
}
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) {
abort();
}
updateStats(gfc);
return mp3count;
};
}
function VBRSeekInfo2() {
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;
}
function IIISideInfo2() {
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_int2(4), new_int2(4)];
for (var gr = 0; gr < 2; gr++) {
for (var ch = 0; ch < 2; ch++) {
this.tt[gr][ch] = new GrInfo2();
}
}
}
function III_psy_xmin2() {
this.l = new_float2(Encoder2.SBMAX_l);
this.s = new_float_n2([Encoder2.SBMAX_s, 3]);
var self2 = this;
this.assign = function(iii_psy_xmin) {
System2.arraycopy(iii_psy_xmin.l, 0, self2.l, 0, Encoder2.SBMAX_l);
for (var i = 0; i < Encoder2.SBMAX_s; i++) {
for (var j = 0; j < 3; j++) {
self2.s[i][j] = iii_psy_xmin.s[i][j];
}
}
};
}
function NsPsy2() {
this.last_en_subshort = new_float_n2([4, 9]);
this.lastAttacks = new_int2(4);
this.pefirbuf = new_float2(19);
this.longfact = new_float2(Encoder2.SBMAX_l);
this.shortfact = new_float2(Encoder2.SBMAX_s);
this.attackthre = 0;
this.attackthre_s = 0;
}
LameInternalFlags2.MFSIZE = 3 * 1152 + Encoder2.ENCDELAY - Encoder2.MDCTDELAY;
LameInternalFlags2.MAX_HEADER_BUF = 256;
LameInternalFlags2.MAX_BITS_PER_CHANNEL = 4095;
LameInternalFlags2.MAX_BITS_PER_GRANULE = 7680;
LameInternalFlags2.BPC = 320;
function LameInternalFlags2() {
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_n2([2, LameInternalFlags2.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 IIISideInfo2();
this.ms_ratio = new_float2(2);
this.padding = 0;
this.frac_SpF = 0;
this.slot_lag = 0;
this.tag_spec = null;
this.nMusicCRC = 0;
this.OldValue = new_int2(2);
this.CurrentStep = new_int2(2);
this.masking_lower = 0;
this.bv_scf = new_int2(576);
this.pseudohalf = new_int2(L3Side2.SFBMAX);
this.sfb21_extra = false;
this.inbuf_old = new Array(2);
this.blackfilt = new Array(2 * LameInternalFlags2.BPC + 1);
this.itime = new_double2(2);
this.sideinfo_len = 0;
this.sb_sample = new_float_n2([2, 2, 18, Encoder2.SBLIMIT]);
this.amp_filter = new_float2(32);
function Header() {
this.write_timing = 0;
this.ptr = 0;
this.buf = new_byte2(MAX_HEADER_LEN);
}
this.header = new Array(LameInternalFlags2.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 ScaleFac2();
this.minval_l = new_float2(Encoder2.CBANDS);
this.minval_s = new_float2(Encoder2.CBANDS);
this.nb_1 = new_float_n2([4, Encoder2.CBANDS]);
this.nb_2 = new_float_n2([4, Encoder2.CBANDS]);
this.nb_s1 = new_float_n2([4, Encoder2.CBANDS]);
this.nb_s2 = new_float_n2([4, Encoder2.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_float2(4);
this.loudness_sq = new_float_n2([2, 2]);
this.loudness_sq_save = new_float2(2);
this.mld_l = new_float2(Encoder2.SBMAX_l);
this.mld_s = new_float2(Encoder2.SBMAX_s);
this.bm_l = new_int2(Encoder2.SBMAX_l);
this.bo_l = new_int2(Encoder2.SBMAX_l);
this.bm_s = new_int2(Encoder2.SBMAX_s);
this.bo_s = new_int2(Encoder2.SBMAX_s);
this.npart_l = 0;
this.npart_s = 0;
this.s3ind = new_int_n2([Encoder2.CBANDS, 2]);
this.s3ind_s = new_int_n2([Encoder2.CBANDS, 2]);
this.numlines_s = new_int2(Encoder2.CBANDS);
this.numlines_l = new_int2(Encoder2.CBANDS);
this.rnumlines_l = new_float2(Encoder2.CBANDS);
this.mld_cb_l = new_float2(Encoder2.CBANDS);
this.mld_cb_s = new_float2(Encoder2.CBANDS);
this.numlines_s_num1 = 0;
this.numlines_l_num1 = 0;
this.pe = new_float2(4);
this.ms_ratio_s_old = 0;
this.ms_ratio_l_old = 0;
this.ms_ener_ratio_old = 0;
this.blocktype_old = new_int2(2);
this.nsPsy = new NsPsy2();
this.VBR_seek_table = new VBRSeekInfo2();
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_n2([16, 4 + 1]);
this.bitrate_blockType_Hist = new_int_n2([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_xmin2();
}
for (var i = 0; i < this.thm.length; i++) {
this.thm[i] = new III_psy_xmin2();
}
for (var i = 0; i < this.header.length; i++) {
this.header[i] = new Header();
}
}
function FFT2() {
var window2 = new_float2(Encoder2.BLKSIZE);
var window_s = new_float2(Encoder2.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, n2) {
var tri = 0;
var k4;
var fi;
var gi;
n2 <<= 1;
var fn = fzPos + n2;
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 = Util2.SQRT2 * fz[gi + k3];
f2 = Util2.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 < n2);
}
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 = Encoder2.BLKSIZE_s / 2;
var k2 = 65535 & 576 / 3 * (b + 1);
var j = Encoder2.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 + k2];
w = window_s[127 - i] * buffer[chn][bufPos + i + k2 + 128];
f1 = f0 - w;
f0 = f0 + w;
f2 = window_s[i + 64] * buffer[chn][bufPos + i + k2 + 64];
w = window_s[63 - i] * buffer[chn][bufPos + i + k2 + 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 + k2 + 1];
w = window_s[126 - i] * buffer[chn][bufPos + i + k2 + 129];
f1 = f0 - w;
f0 = f0 + w;
f2 = window_s[i + 65] * buffer[chn][bufPos + i + k2 + 65];
w = window_s[62 - i] * buffer[chn][bufPos + i + k2 + 193];
f3 = f2 - w;
f2 = f2 + w;
x_real[b][x + Encoder2.BLKSIZE_s / 2 + 0] = f0 + f2;
x_real[b][x + Encoder2.BLKSIZE_s / 2 + 2] = f0 - f2;
x_real[b][x + Encoder2.BLKSIZE_s / 2 + 1] = f1 + f3;
x_real[b][x + Encoder2.BLKSIZE_s / 2 + 3] = f1 - f3;
} while (--j >= 0);
fht(x_real[b], x, Encoder2.BLKSIZE_s / 2);
}
};
this.fft_long = function(gfc, y, chn, buffer, bufPos) {
var jj = Encoder2.BLKSIZE / 8 - 1;
var x = Encoder2.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 + Encoder2.BLKSIZE / 2 + 0] = f0 + f2;
y[x + Encoder2.BLKSIZE / 2 + 2] = f0 - f2;
y[x + Encoder2.BLKSIZE / 2 + 1] = f1 + f3;
y[x + Encoder2.BLKSIZE / 2 + 3] = f1 - f3;
} while (--jj >= 0);
fht(y, x, Encoder2.BLKSIZE / 2);
};
this.init_fft = function(gfc) {
for (var i = 0; i < Encoder2.BLKSIZE; i++)
window2[i] = 0.42 - 0.5 * Math.cos(2 * Math.PI * (i + 0.5) / Encoder2.BLKSIZE) + 0.08 * Math.cos(4 * Math.PI * (i + 0.5) / Encoder2.BLKSIZE);
for (var i = 0; i < Encoder2.BLKSIZE_s / 2; i++)
window_s[i] = 0.5 * (1 - Math.cos(2 * Math.PI * (i + 0.5) / Encoder2.BLKSIZE_s));
};
}
function PsyModel2() {
var fft = new FFT2();
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) / (Encoder2.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 NSFIRLEN = 21;
var LN_TO_LOG10 = 0.2302585093;
function psycho_loudness_approx(energy, gfc) {
var loudness_power = 0;
for (var i = 0; i < Encoder2.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) {
abort();
}
fftenergy[0] = /*fix NON_LINEAR_SCALE_ENERGY*/
wsamp_l[wsamp_lPos + 0][0];
fftenergy[0] *= fftenergy[0];
for (var j = Encoder2.BLKSIZE / 2 - 1; j >= 0; --j) {
var re = wsamp_l[wsamp_lPos + 0][Encoder2.BLKSIZE / 2 - j];
var im = wsamp_l[wsamp_lPos + 0][Encoder2.BLKSIZE / 2 + j];
fftenergy[Encoder2.BLKSIZE / 2 - j] = /*fix 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 = Encoder2.BLKSIZE_s / 2 - 1; j >= 0; --j) {
var re = wsamp_s[wsamp_sPos + 0][b][Encoder2.BLKSIZE_s / 2 - j];
var im = wsamp_s[wsamp_sPos + 0][b][Encoder2.BLKSIZE_s / 2 + j];
fftenergy_s[b][Encoder2.BLKSIZE_s / 2 - j] = /*fix NON_LINEAR_SCALE_ENERGY*/
(re * re + im * im) * 0.5;
}
}
{
var totalenergy = 0;
for (var j = 11; j < Encoder2.HBLKSIZE; j++)
totalenergy += fftenergy[j];
gfc.tot_ener[chn] = totalenergy;
}
if (gfp.analysis) {
abort();
}
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;
}
m1 += m2;
if (b + 3 <= 3 + 3) {
if (ratio >= ma_max_i1) {
return m1;
}
var i = 0 | Util2.FAST_LOG10_X(ratio, 16);
return m1 * table2[i];
}
var i = 0 | Util2.FAST_LOG10_X(ratio, 16);
{
m2 = gfc.ATH.cb_l[kk] * gfc.ATH.adjust;
}
if (m1 < ma_max_m * m2) {
if (m1 > m2) {
var f2, r;
f2 = 1;
if (i <= 13)
f2 = table3[i];
r = Util2.FAST_LOG10_X(m1 / m2, 10 / 15);
return m1 * ((table1[i] - f2) * r + f2);
}
if (i > 13)
return m1;
return m1 * table3[i];
}
return m1 * table1[i];
}
function convert_partition2scalefac_s(gfc, eb, thr, chn, sblock) {
var sb, b;
var enn = 0;
var thmm = 0;
for (sb = b = 0; sb < Encoder2.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) {
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;
}
{
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 < Encoder2.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 < Encoder2.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) {
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;
}
{
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 < Encoder2.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;
var n2 = gfc.numlines_s[b];
for (var i = 0; i < n2; ++i, ++j) {
var el = fftenergy_s[sblock][j];
ebb += el;
}
eb[b] = ebb;
}
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] == Encoder2.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;
}
for (; b <= Encoder2.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 == ShortBlock2.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] = Encoder2.NORM_TYPE;
if (gfp.short_blocks == ShortBlock2.short_block_dispensed)
uselongblock[chn] = 1;
if (gfp.short_blocks == ShortBlock2.short_block_forced)
uselongblock[chn] = 0;
if (uselongblock[chn] != 0) {
if (gfc.blocktype_old[chn] == Encoder2.SHORT_TYPE)
blocktype[chn] = Encoder2.STOP_TYPE;
} else {
blocktype[chn] = Encoder2.SHORT_TYPE;
if (gfc.blocktype_old[chn] == Encoder2.NORM_TYPE) {
gfc.blocktype_old[chn] = Encoder2.START_TYPE;
}
if (gfc.blocktype_old[chn] == Encoder2.STOP_TYPE)
gfc.blocktype_old[chn] = Encoder2.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 < Encoder2.SBMAX_s - 1; sb++) {
for (var sblock = 0; sblock < 3; sblock++) {
var thm = mr.thm.s[sb][sblock];
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 {
pe_s += regcoef_s[sb] * Util2.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 < Encoder2.SBMAX_l - 1; sb++) {
var thm = mr.thm.l[sb];
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 {
pe_l += regcoef_l[sb] * Util2.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, m2 = 0;
var i;
for (i = 0; i < gfc.numlines_l[b]; ++i, ++j) {
var el = fftenergy[j];
ebb += el;
if (m2 < el)
m2 = el;
}
eb[b] = ebb;
max[b] = m2;
avg[b] = ebb * gfc.rnumlines_l[b];
}
}
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];
if (a > 0) {
var m2 = max[b];
if (m2 < max[b + 1])
m2 = max[b + 1];
a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
for (b = 1; b < gfc.npart_l - 1; b++) {
a = avg[b - 1] + avg[b] + avg[b + 1];
if (a > 0) {
var m2 = max[b - 1];
if (m2 < max[b])
m2 = max[b];
if (m2 < max[b + 1])
m2 = max[b + 1];
a = 20 * (m2 * 3 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
}
a = avg[b - 1] + avg[b];
if (a > 0) {
var m2 = max[b - 1];
if (m2 < max[b])
m2 = max[b];
a = 20 * (m2 * 2 - a) / (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1));
var k2 = 0 | a;
if (k2 > last_tab_entry)
k2 = last_tab_entry;
mask_idx[b] = k2;
} else {
mask_idx[b] = 0;
}
}
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_n2([2, Encoder2.BLKSIZE]);
var wsamp_S = new_float_n2([2, 3, Encoder2.BLKSIZE_s]);
var eb_l = new_float2(Encoder2.CBANDS + 1);
var eb_s = new_float2(Encoder2.CBANDS + 1);
var thr = new_float2(Encoder2.CBANDS + 2);
var blocktype = new_int2(2), uselongblock = new_int2(2);
var numchn, chn;
var b, i, j, k2;
var sb, sblock;
var ns_hpfsmpl = new_float_n2([2, 576]);
var pcfact;
var mask_idx_l = new_int2(Encoder2.CBANDS + 2), mask_idx_s = new_int2(Encoder2.CBANDS + 2);
Arrays2.fill(mask_idx_s, 0);
numchn = gfc.channels_out;
if (gfp.mode == MPEGMode2.JOINT_STEREO)
numchn = 4;
if (gfp.VBR == VbrMode2.vbr_off)
pcfact = gfc.ResvMax == 0 ? 0 : gfc.ResvSize / gfc.ResvMax * 0.5;
else if (gfp.VBR == VbrMode2.vbr_rh || gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.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;
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) {
abort();
}
}
for (chn = 0; chn < numchn; chn++) {
var wsamp_l;
var wsamp_s;
var en_subshort = new_float2(12);
var en_short = [0, 0, 0, 0];
var attack_intensity = new_float2(12);
var ns_uselongblock = 1;
var attackThreshold;
var max = new_float2(Encoder2.CBANDS), avg = new_float2(Encoder2.CBANDS);
var ns_attacks = [0, 0, 0, 0];
var fftenergy = new_float2(Encoder2.HBLKSIZE);
var fftenergy_s = new_float_n2([3, Encoder2.HBLKSIZE_s]);
for (i = 0; i < 3; i++) {
en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6];
attack_intensity[i] = en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4];
en_short[0] += en_subshort[i];
}
if (chn == 2) {
abort();
}
{
var pf = ns_hpfsmpl[chn & 1];
var pfPos = 0;
for (i = 0; i < 9; i++) {
var pfe = pfPos + 576 / 9;
var p2 = 1;
for (; pfPos < pfe; pfPos++)
if (p2 < Math.abs(pf[pfPos]))
p2 = Math.abs(pf[pfPos]);
gfc.nsPsy.last_en_subshort[chn][i] = en_subshort[i + 3] = p2;
en_short[1 + i / 3] += p2;
if (p2 > en_subshort[i + 3 - 2]) {
p2 = p2 / en_subshort[i + 3 - 2];
} else if (en_subshort[i + 3 - 2] > p2 * 10) {
p2 = en_subshort[i + 3 - 2] / (p2 * 10);
} else
p2 = 0;
attack_intensity[i + 3] = p2;
}
}
if (gfp.analysis) {
abort();
}
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]) {
ratio = en_short[i - 1] / en_short[i];
} else {
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 {
abort();
}
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 < Encoder2.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 p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT1 * pcfact
);
thmm = Math.min(thmm, p2);
}
if (ns_attacks[sblock] == 1) {
var idx = sblock != 0 ? sblock - 1 : 2;
var p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p2);
} else if (sblock != 0 && ns_attacks[sblock - 1] == 3 || sblock == 0 && gfc.nsPsy.lastAttacks[chn] == 3) {
var idx = sblock != 2 ? sblock + 1 : 0;
var p2 = NS_INTERP(
gfc.thm[chn].s[sb][idx],
thmm,
NS_PREECHO_ATT2 * pcfact
);
thmm = Math.min(thmm, p2);
}
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];
k2 = 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[k2++] * eb2;
while (++kk <= gfc.s3ind[b][1]) {
eb2 = eb_l[kk] * tab[mask_idx_l[kk]];
ecb = mask_add(
ecb,
gfc.s3_ll[k2++] * eb2,
kk,
kk - b,
gfc
);
}
ecb *= 0.158489319246111;
if (gfc.blocktype_old[chn & 1] == Encoder2.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 <= Encoder2.CBANDS; ++b) {
eb_l[b] = 0;
thr[b] = 0;
}
convert_partition2scalefac_l(gfc, eb_l, thr, chn);
}
if (gfp.mode == MPEGMode2.STEREO || gfp.mode == MPEGMode2.JOINT_STEREO) {
abort();
}
if (gfp.mode == MPEGMode2.JOINT_STEREO) {
abort();
}
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) {
abort();
} else {
ppe = percep_entropy;
ppePos = 0;
type = blocktype_d[chn];
mr = masking_ratio[gr_out][chn];
}
if (type == Encoder2.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(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_float2(Encoder2.CBANDS + 1);
var sample_freq_frac = sfreq / (sbmax > 15 ? 2 * 576 : 2 * 192);
var partition = new_int2(Encoder2.HBLKSIZE);
var i;
sfreq /= blksize;
var j = 0;
var ni = 0;
for (i = 0; i < Encoder2.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) {
partition[j++] = i;
}
if (j > blksize / 2) {
j = blksize / 2;
++i;
break;
}
}
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 k2 = 0; k2 < ni; k2++) {
var w = numlines[k2];
var bark1, bark2;
bark1 = freq2bark(sfreq * j);
bark2 = freq2bark(sfreq * (j + w - 1));
bval[k2] = 0.5 * (bark1 + bark2);
bark1 = freq2bark(sfreq * (j - 0.5));
bark2 = freq2bark(sfreq * (j + w - 0.5));
bval_width[k2] = bark2 - bark1;
j += w;
}
return ni;
}
function init_s3_values(s3ind, npart, bval, bval_width, norm, use_old_s3) {
var s3 = new_float_n2([Encoder2.CBANDS, Encoder2.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 {
abort();
}
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 p2 = new_float2(numberOfNoneZero);
var k2 = 0;
for (var i = 0; i < npart; i++)
for (j = s3ind[i][0]; j <= s3ind[i][1]; j++)
p2[k2++] = s3[i][j];
return p2;
}
function stereo_demask(f2) {
var arg = freq2bark(f2);
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_float2(Encoder2.CBANDS);
var bval_width = new_float2(Encoder2.CBANDS);
var norm = new_float2(Encoder2.CBANDS);
var sfreq = gfp.out_samplerate;
switch (gfp.experimentalZ) {
default:
case 0:
useOldS3 = true;
break;
case 1:
useOldS3 = gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.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] = Encoder2.NORM_TYPE;
for (i = 0; i < 4; ++i) {
for (var j = 0; j < Encoder2.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 < Encoder2.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 < Encoder2.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,
Encoder2.BLKSIZE,
gfc.scalefac_band.l,
Encoder2.BLKSIZE / (2 * 576),
Encoder2.SBMAX_l
);
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 = Float2.MAX_VALUE;
for (var k2 = 0; k2 < gfc.numlines_l[i]; k2++, j++) {
var freq = sfreq * j / (1e3 * Encoder2.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,
Encoder2.BLKSIZE_s,
gfc.scalefac_band.s,
Encoder2.BLKSIZE_s / (2 * 192),
Encoder2.SBMAX_s
);
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 = Float2.MAX_VALUE;
for (var k2 = 0; k2 < gfc.numlines_s[i]; k2++, j++) {
var freq = sfreq * j / (1e3 * Encoder2.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;
if (gfp.ATHtype != -1) {
var freq;
var freq_inc = gfp.out_samplerate / Encoder2.BLKSIZE;
var eql_balance = 0;
freq = 0;
for (i = 0; i < Encoder2.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 = Encoder2.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;
}
}
for (var b = j = 0; b < gfc.npart_l; ++b) {
for (i = 0; i < gfc.numlines_l[b]; ++i) {
++j;
}
}
}
j = 0;
for (i = 0; i < gfc.npart_l; i++) {
var freq = sfreq * (j + gfc.numlines_l[i] / 2) / (1 * Encoder2.BLKSIZE);
gfc.mld_cb_l[i] = stereo_demask(freq);
j += gfc.numlines_l[i];
}
for (; i < Encoder2.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 * Encoder2.BLKSIZE_s);
gfc.mld_cb_s[i] = stereo_demask(freq);
j += gfc.numlines_s[i];
}
for (; i < Encoder2.CBANDS; ++i) {
gfc.mld_cb_s[i] = 1;
}
return 0;
};
function ATHformula_GB(f2, value) {
if (f2 < -0.3)
f2 = 3410;
f2 /= 1e3;
f2 = Math.max(0.1, f2);
var ath = 3.64 * Math.pow(f2, -0.8) - 6.8 * Math.exp(-0.6 * Math.pow(f2 - 3.4, 2)) + 6 * Math.exp(-0.15 * Math.pow(f2 - 8.7, 2)) + (0.6 + 0.04 * value) * 1e-3 * Math.pow(f2, 4);
return ath;
}
this.ATHformula = function(f2, gfp) {
var ath;
switch (gfp.ATHtype) {
case 0:
ath = ATHformula_GB(f2, 9);
break;
case 1:
ath = ATHformula_GB(f2, -1);
break;
case 2:
ath = ATHformula_GB(f2, 0);
break;
case 3:
ath = ATHformula_GB(f2, 1) + 6;
break;
case 4:
ath = ATHformula_GB(f2, gfp.ATHcurve);
break;
default:
ath = ATHformula_GB(f2, 0);
break;
}
return ath;
};
}
function Lame2() {
var self2 = this;
var LAME_MAXALBUMART = 128 * 1024;
Lame2.V9 = 410;
Lame2.V8 = 420;
Lame2.V7 = 430;
Lame2.V6 = 440;
Lame2.V5 = 450;
Lame2.V4 = 460;
Lame2.V3 = 470;
Lame2.V2 = 480;
Lame2.V1 = 490;
Lame2.V0 = 500;
Lame2.R3MIX = 1e3;
Lame2.STANDARD = 1001;
Lame2.EXTREME = 1002;
Lame2.INSANE = 1003;
Lame2.STANDARD_FAST = 1004;
Lame2.EXTREME_FAST = 1005;
Lame2.MEDIUM = 1006;
Lame2.MEDIUM_FAST = 1007;
var LAME_MAXMP3BUFFER = 16384 + LAME_MAXALBUMART;
Lame2.LAME_MAXMP3BUFFER = LAME_MAXMP3BUFFER;
var ga;
var bs;
var p2;
var qupvt;
var qu;
var psy = new PsyModel2();
var vbr;
var id3;
this.enc = new Encoder2();
this.setModules = function(_ga, _bs, _p, _qupvt, _qu, _vbr, _ver, _id3, _mpglib) {
ga = _ga;
bs = _bs;
p2 = _p;
qupvt = _qupvt;
qu = _qu;
vbr = _vbr;
id3 = _id3;
this.enc.setModules(bs, psy, qupvt, vbr);
};
function PSY() {
this.mask_adjust = 0;
this.mask_adjust_short = 0;
this.bo_l_weight = new_float2(Encoder2.SBMAX_l);
this.bo_s_weight = new_float2(Encoder2.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 LameInternalFlags2();
gfp.mode = MPEGMode2.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 = VbrMode2.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 = Encoder2.ENCDELAY + Encoder2.POSTDELAY;
gfp.encoder_padding = 0;
gfc.mf_size = Encoder2.ENCDELAY - Encoder2.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 LameGlobalFlags2();
lame_init_old(gfp);
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 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 = Tables2.bitrate_table[version][1];
for (var i = 2; i <= 14; i++) {
if (Tables2.bitrate_table[version][i] > 0) {
if (Math.abs(Tables2.bitrate_table[version][i] - bRate) < Math.abs(bitrate - bRate))
bitrate = Tables2.bitrate_table[version][i];
}
}
return bitrate;
}
function BitrateIndex(bRate, version, samplerate) {
if (samplerate < 16e3)
version = 2;
for (var i = 0; i <= 14; i++) {
if (Tables2.bitrate_table[version][i] > 0) {
if (Tables2.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 = self2.nearestBitrateFullIndex(bitrate);
lh.lowerlimit = freq_map[table_index].lowpass;
}
function lame_init_params_ppflt(gfp) {
var gfc = gfp.internal_flags;
var lowpass_band = 32;
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) {
abort();
}
if (gfc.highpass2 > 0) {
abort();
}
for (var band = 0; band < 32; band++) {
var fc1, fc2;
var freq = band / 31;
if (gfc.highpass2 > gfc.highpass1) {
abort();
} 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_n2([16, 4 + 1]);
gfc.bitrate_blockType_Hist = new_int_n2([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 ATH2();
if (gfc.PSY == null)
gfc.PSY = new PSY();
if (gfc.rgdata == null)
gfc.rgdata = new ReplayGain2();
gfc.channels_in = gfp.num_channels;
if (gfc.channels_in == 1)
gfp.mode = MPEGMode2.MONO;
gfc.channels_out = gfp.mode == MPEGMode2.MONO ? 1 : 2;
gfc.mode_ext = Encoder2.MPG_MD_MS_LR;
if (gfp.mode == MPEGMode2.MONO)
gfp.force_ms = false;
if (gfp.VBR == VbrMode2.vbr_off && gfp.VBR_mean_bitrate_kbps != 128 && gfp.brate == 0)
gfp.brate = gfp.VBR_mean_bitrate_kbps;
if (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_mtrh || gfp.VBR == VbrMode2.vbr_mt) ;
else {
gfp.free_format = false;
}
if (gfp.VBR == VbrMode2.vbr_off && gfp.brate == 0) {
abort();
}
if (gfp.VBR == VbrMode2.vbr_off && gfp.compression_ratio > 0) {
abort();
}
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 VbrMode2.vbr_off: {
var lh = new LowPassHighPass();
optimum_bandwidth(lh, gfp.brate);
lowpass = lh.lowerlimit;
break;
}
case VbrMode2.vbr_abr: {
var lh = new LowPassHighPass();
optimum_bandwidth(lh, gfp.VBR_mean_bitrate_kbps);
lowpass = lh.lowerlimit;
break;
}
case VbrMode2.vbr_rh: {
abort();
}
default: {
abort();
}
}
if (gfp.mode == MPEGMode2.MONO && (gfp.VBR == VbrMode2.vbr_off || gfp.VBR == VbrMode2.vbr_abr))
lowpass *= 1.5;
gfp.lowpassfreq = lowpass | 0;
}
if (gfp.out_samplerate == 0) {
abort();
}
gfp.lowpassfreq = Math.min(20500, gfp.lowpassfreq);
gfp.lowpassfreq = Math.min(gfp.out_samplerate / 2, gfp.lowpassfreq);
if (gfp.VBR == VbrMode2.vbr_off) {
gfp.compression_ratio = gfp.out_samplerate * 16 * gfc.channels_out / (1e3 * gfp.brate);
}
if (gfp.VBR == VbrMode2.vbr_abr) {
abort();
}
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) {
abort();
}
if (gfc.decode_on_the_fly && !gfp.decode_only) {
abort();
}
gfc.mode_gr = gfp.out_samplerate <= 24e3 ? 1 : 2;
gfp.framesize = 576 * gfc.mode_gr;
gfp.encoder_delay = Encoder2.ENCDELAY;
gfc.resample_ratio = gfp.in_samplerate / gfp.out_samplerate;
switch (gfp.VBR) {
case VbrMode2.vbr_mt:
case VbrMode2.vbr_rh:
case VbrMode2.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 VbrMode2.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 == MPEGMode2.NOT_SET) {
gfp.mode = MPEGMode2.JOINT_STEREO;
}
if (gfp.highpassfreq > 0) {
abort();
} else {
gfc.highpass1 = 0;
gfc.highpass2 = 0;
}
if (gfp.lowpassfreq > 0) {
gfc.lowpass2 = 2 * gfp.lowpassfreq;
if (gfp.lowpasswidth >= 0) {
abort();
} else {
gfc.lowpass1 = (1 - 0) * 2 * gfp.lowpassfreq;
}
gfc.lowpass1 /= gfp.out_samplerate;
gfc.lowpass2 /= gfp.out_samplerate;
} else {
abort();
}
lame_init_params_ppflt(gfp);
gfc.samplerate_index = SmpFrqIndex(gfp.out_samplerate, gfp);
if (gfc.samplerate_index < 0) {
abort();
}
if (gfp.VBR == VbrMode2.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) {
abort();
}
}
} 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 < Encoder2.SBMAX_l + 1; i++)
gfc.scalefac_band.l[i] = qupvt.sfBandIndex[j].l[i];
for (var i = 0; i < Encoder2.PSFB21 + 1; i++) {
var size = (gfc.scalefac_band.l[22] - gfc.scalefac_band.l[21]) / Encoder2.PSFB21;
var start = gfc.scalefac_band.l[21] + i * size;
gfc.scalefac_band.psfb21[i] = start;
}
gfc.scalefac_band.psfb21[Encoder2.PSFB21] = 576;
for (var i = 0; i < Encoder2.SBMAX_s + 1; i++)
gfc.scalefac_band.s[i] = qupvt.sfBandIndex[j].s[i];
for (var i = 0; i < Encoder2.PSFB12 + 1; i++) {
var size = (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) / Encoder2.PSFB12;
var start = gfc.scalefac_band.s[12] + i * size;
gfc.scalefac_band.psfb12[i] = start;
}
gfc.scalefac_band.psfb12[Encoder2.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 k2;
for (k2 = 0; k2 < 19; k2++)
gfc.nsPsy.pefirbuf[k2] = 700 * gfc.mode_gr * gfc.channels_out;
if (gfp.ATHtype == -1)
gfp.ATHtype = 4;
}
switch (gfp.VBR) {
case VbrMode2.vbr_mt:
gfp.VBR = VbrMode2.vbr_mtrh;
case VbrMode2.vbr_mtrh: {
if (gfp.useTemporal == null) {
gfp.useTemporal = false;
}
p2.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 VbrMode2.vbr_rh: {
p2.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 == VbrMode2.vbr_off)
gfp.VBR_mean_bitrate_kbps = gfp.brate;
p2.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 == VbrMode2.vbr_off) {
gfc.iteration_loop = new CBRNewIterationLoop2(qu);
} else {
abort();
}
break;
}
}
if (gfp.VBR != VbrMode2.vbr_off) {
abort();
}
if (gfp.tune) {
abort();
}
lame_init_qval(gfp);
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 = ShortBlock2.short_block_allowed;
}
if (gfp.short_blocks == ShortBlock2.short_block_allowed && (gfp.mode == MPEGMode2.JOINT_STEREO || gfp.mode == MPEGMode2.STEREO)) {
gfp.short_blocks = ShortBlock2.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 = PsyModel2.NSATTACKTHRE;
if (gfp.internal_flags.nsPsy.attackthre_s < 0)
gfp.internal_flags.nsPsy.attackthre_s = PsyModel2.NSATTACKTHRE_S;
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 == VbrMode2.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);
return 0;
};
function update_inbuffer_size(gfc, nsamples) {
if (gfc.in_buffer_0 == null || gfc.in_buffer_nsamples < nsamples) {
gfc.in_buffer_0 = new_float2(nsamples);
gfc.in_buffer_1 = new_float2(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_n2([2, 1152]);
var imp3 = 0, mp3count, mp3buffer_size_remaining;
var end_padding;
var frames_left;
var samples_to_encode = gfc.mf_samples_to_encode - Encoder2.POSTDELAY;
var mf_needed = calcNeeded(gfp);
if (gfc.mf_samples_to_encode < 1) {
return 0;
}
mp3count = 0;
if (gfp.in_samplerate != gfp.out_samplerate) {
abort();
}
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) {
abort();
}
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 = Encoder2.BLKSIZE + gfp.framesize - Encoder2.FFTOFFSET;
mf_needed = Math.max(mf_needed, 512 + gfp.framesize - 32);
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.NEQ(gfp.scale, 0) && BitStream.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.NEQ(gfp.scale_left, 0) && BitStream.NEQ(gfp.scale_left, 1)) {
for (i = 0; i < nsamples; ++i) {
in_buffer[0][i] *= gfp.scale_left;
}
}
if (BitStream.NEQ(gfp.scale_right, 0) && BitStream.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) {
abort();
}
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
) == GainAnalysis2.GAIN_ANALYSIS_ERROR)
return -6;
}
nsamples -= n_in;
in_bufferPos += n_in;
if (gfc.channels_out == 2)
;
gfc.mf_size += n_out;
if (gfc.mf_samples_to_encode < 1) {
abort();
}
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];
}
}
return mp3size;
}
function lame_encode_frame(gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {
var ret = self2.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 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) {
abort();
} 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];
}
}
}
}
function GetAudio() {
this.setModules = function(parse2, mpg2) {
};
}
function Parse() {
this.setModules = function(ver2, id32, pre2) {
};
}
function MPGLib() {
}
function ID3Tag() {
this.setModules = function(_bits, _ver) {
};
}
function Mp3Encoder(channels, samplerate, kbps) {
if (channels != 1) {
abort("fix cc: only supports mono");
}
var lame = new Lame2();
var gaud = new GetAudio();
var ga = new GainAnalysis2();
var bs = new BitStream();
var p2 = new Presets();
var qupvt = new QuantizePVT();
var qu = new Quantize();
var vbr = new VBRTag2();
var ver = new Version();
var id3 = new ID3Tag();
var rv = new Reservoir();
var tak = new Takehiro();
var parse = new Parse();
var mpg = new MPGLib();
lame.setModules(ga, bs, p2, qupvt, qu, vbr, ver, id3, mpg);
bs.setModules(ga, mpg, ver, vbr);
id3.setModules(bs, ver);
p2.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, p2);
var gfp = lame.lame_init();
gfp.num_channels = channels;
gfp.in_samplerate = samplerate;
gfp.out_samplerate = samplerate;
gfp.brate = kbps;
gfp.mode = MPEGMode2.STEREO;
gfp.quality = 3;
gfp.bWriteVbrTag = false;
gfp.disable_reservoir = true;
gfp.write_id3tag_automatic = false;
lame.lame_init_params(gfp);
var maxSamples = 1152;
var mp3buf_size = 0 | 1.25 * maxSamples + 7200;
var mp3buf = new_byte2(mp3buf_size);
this.encodeBuffer = function(left, right) {
if (channels == 1) {
right = left;
}
if (left.length > maxSamples) {
maxSamples = left.length;
mp3buf_size = 0 | 1.25 * maxSamples + 7200;
mp3buf = new_byte2(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));
};
}
L3Side2.SFBMAX = Encoder2.SBMAX_s * 3;
lamejs.Mp3Encoder = Mp3Encoder;
}
lamejs();
Recorder2.lamejs = lamejs;
});
(function(factory) {
var browser = typeof window == "object" && !!window.document;
var win = browser ? window : Object;
var rec = win.Recorder, ni = rec.i18n;
factory(rec, ni, ni.$T, browser);
})(function(Recorder2, i18n, $T, isBrowser) {
Recorder2.prototype.enc_wav = {
stable: true,
fast: true,
getTestMsg: function() {
return $T("gPSE::支持位数8位、16位(填在比特率里面),采样率取值无限制;此编码器仅在pcm数据前加了一个44字节的wav头,编码出来的16位wav文件去掉开头的44字节即可得到pcm(注:其他wav编码器可能不是44字节)");
}
};
var NormalizeSet = function(set) {
var bS = set.bitRate, b = bS == 8 ? 8 : 16;
if (bS != b) Recorder2.CLog($T("wyw9::WAV Info: 不支持{1}位,已更新成{2}位", 0, bS, b), 3);
set.bitRate = b;
};
Recorder2.prototype.wav = function(res, True, False) {
var This = this, set = This.set;
NormalizeSet(set);
var size = res.length, sampleRate = set.sampleRate, bitRate = set.bitRate;
var dataLength = size * (bitRate / 8);
var header = Recorder2.wav_header(1, 1, sampleRate, bitRate, dataLength);
var offset = header.length;
var bytes = new Uint8Array(offset + dataLength);
bytes.set(header);
if (bitRate == 8) {
for (var i = 0; i < size; i++) {
var val = (res[i] >> 8) + 128;
bytes[offset++] = val;
}
} else {
bytes = new Int16Array(bytes.buffer);
bytes.set(res, offset / 2);
}
True(bytes.buffer, "audio/wav");
};
Recorder2.wav_header = function(format, numCh, sampleRate, bitRate, dataLength) {
var extSize = format == 1 ? 0 : 2;
var buffer = new ArrayBuffer(44 + extSize);
var data = new DataView(buffer);
var offset = 0;
var writeString = function(str) {
for (var i = 0; i < str.length; i++, offset++) {
data.setUint8(offset, str.charCodeAt(i));
}
};
var write16 = function(v) {
data.setUint16(offset, v, true);
offset += 2;
};
var write32 = function(v) {
data.setUint32(offset, v, true);
offset += 4;
};
writeString("RIFF");
write32(36 + extSize + dataLength);
writeString("WAVE");
writeString("fmt ");
write32(16 + extSize);
write16(format);
write16(numCh);
write32(sampleRate);
write32(sampleRate * (numCh * bitRate / 8));
write16(numCh * bitRate / 8);
write16(bitRate);
if (format != 1) {
write16(0);
}
writeString("data");
write32(dataLength);
return new Uint8Array(buffer);
};
});
Recorder.Wav2Other = function(newSet, wavBlob, True, False) {
const reader = new FileReader();
reader.onloadend = function() {
const wavView = new Uint8Array(reader.result);
const eq = function(p2, s) {
for (var i2 = 0; i2 < s.length; i2++) {
if (wavView[p2 + i2] != s.charCodeAt(i2)) {
return false;
}
}
return true;
};
let pcm;
if (eq(0, "RIFF") && eq(8, "WAVEfmt ")) {
var numCh = wavView[22];
if (wavView[20] == 1 && (numCh == 1 || numCh == 2)) {
var sampleRate = wavView[24] + (wavView[25] << 8) + (wavView[26] << 16) + (wavView[27] << 24);
var bitRate = wavView[34] + (wavView[35] << 8);
var dataPos = 0;
for (var i = 12, iL = wavView.length - 8; i < iL; ) {
if (wavView[i] == 100 && wavView[i + 1] == 97 && wavView[i + 2] == 116 && wavView[i + 3] == 97) {
dataPos = i + 8;
break;
}
i += 4;
i += 4 + wavView[i] + (wavView[i + 1] << 8) + (wavView[i + 2] << 16) + (wavView[i + 3] << 24);
}
console.log("wav info", sampleRate, bitRate, numCh, dataPos);
if (dataPos) {
if (bitRate == 16) {
pcm = new Int16Array(wavView.buffer.slice(dataPos));
} else if (bitRate == 8) {
pcm = new Int16Array(wavView.length - dataPos);
for (var j = dataPos, d = 0; j < wavView.length; j++, d++) {
var b = wavView[j];
pcm[d] = b - 128 << 8;
}
}
}
if (pcm && numCh == 2) {
var pcm1 = new Int16Array(pcm.length / 2);
for (var i = 0; i < pcm1.length; i++) {
pcm1[i] = (pcm[i * 2] + pcm[i * 2 + 1]) / 2;
}
pcm = pcm1;
}
}
}
if (!pcm) {
False && False("非单或双声道wav raw pcm格式音频,无法转码");
return;
}
var rec = Recorder(newSet).mock(pcm, sampleRate);
rec.stop(function(blob, duration) {
True(blob, duration, rec);
}, False);
};
reader.readAsArrayBuffer(wavBlob);
};
const transWavBlob = async (wavBlob, fileName, total, cd, currentIndex) => {
if (!wavBlob) {
return;
}
var set = {
type: "mp3",
sampleRate: 48e3,
bitRate: 96
};
setTimeout(() => {
Recorder.Wav2Other(
set,
wavBlob,
function(blob, duration, rec) {
console.log(
blob,
(window.URL || webkitURL).createObjectURL(blob),
"log——audio",
total + "process"
);
window.toAudioCount++;
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", fileName + ".mp3");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
if (window.toAudioCount === total - 1) {
cd();
}
},
function(msg) {
}
);
}, currentIndex * 200);
};
const syncRecursive = (data, index, callback, asnyCallback) => {
if (index >= data.length) {
const audio2 = document.querySelector("audio");
audio2.muted = false;
callback(data);
return;
}
console.log("Processing data:", data[index]);
if (asnyCallback) asnyCallback(index);
const audio = document.querySelector("audio");
if (index !== 1) {
audio.muted = true;
}
data[index] = { ...data[index], downUrl: audio.src };
const btn = document.querySelector(".btn_big_next");
btn.click();
setTimeout(() => {
syncRecursive(data, index + 1, callback, asnyCallback);
}, 2e3);
};
const splitAndMoveElement = (arr, targetId) => {
const targetIndex = arr.findIndex((item) => item.id === targetId);
if (targetIndex === -1) {
return arr;
} else if (targetIndex === 0) {
return arr;
}
const afterTargetElements = arr.slice(targetIndex);
const beforeTargetElements = arr.slice(0, targetIndex - 1);
return [...afterTargetElements, ...beforeTargetElements];
};
const blobToAwv = (buffer, fileName, total, cd, currentIndex) => {
const audioCtx = new AudioContext();
audioCtx.decodeAudioData(buffer, async function(audioBuffer) {
const blob = bufferToWave(audioBuffer, audioBuffer.sampleRate * audioBuffer.duration);
transWavBlob(blob, fileName, total, cd, currentIndex);
});
};
function bufferToWave(abuffer, len) {
var numOfChan = abuffer.numberOfChannels, length = len * numOfChan * 2 + 44, buffer = new ArrayBuffer(length), view = new DataView(buffer), channels = [], i, sample, offset = 0, pos = 0;
setUint32(1179011410);
setUint32(length - 8);
setUint32(1163280727);
setUint32(544501094);
setUint32(16);
setUint16(1);
setUint16(numOfChan);
setUint32(abuffer.sampleRate);
setUint32(abuffer.sampleRate * 2 * numOfChan);
setUint16(numOfChan * 2);
setUint16(16);
setUint32(1635017060);
setUint32(length - pos - 4);
for (i = 0; i < abuffer.numberOfChannels; i++)
channels.push(abuffer.getChannelData(i));
while (pos < length) {
for (i = 0; i < numOfChan; i++) {
if (channels[i][offset] !== void 0) {
sample = Math.max(-1, Math.min(1, channels[i][offset]));
sample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767) | 0;
view.setInt16(pos, sample, true);
pos += 2;
} else {
pos += 2;
break;
}
}
offset++;
}
return new Blob([buffer], { type: "audio/wav" });
function setUint16(data) {
view.setUint16(pos, data, true);
pos += 2;
}
function setUint32(data) {
view.setUint32(pos, data, true);
pos += 4;
}
}
class FileDownloader {
constructor(maxConcurrentDownloads = 1) {
__publicField(this, "maxConcurrentDownloads");
__publicField(this, "downloadQueue");
__publicField(this, "numActiveDownloads");
this.maxConcurrentDownloads = maxConcurrentDownloads;
this.downloadQueue = [];
this.numActiveDownloads = 0;
}
addToDownloadQueue(fileUrl, fileName, cd) {
this.downloadQueue.push({ fileUrl, fileName });
this.processDownloadQueue(cd);
}
processDownloadQueue(cd) {
while (this.numActiveDownloads < this.maxConcurrentDownloads && this.downloadQueue.length > 0) {
const { fileUrl, fileName } = this.downloadQueue.shift();
this.startDownload(fileUrl, fileName, cd);
}
}
startDownload(fileUrl, fileName, cd) {
this.numActiveDownloads++;
fetch(fileUrl).then((response) => {
return response.arrayBuffer();
}).then((blob) => {
let buffer = blob;
blobToAwv(buffer, fileName, this.maxConcurrentDownloads, cd, this.numActiveDownloads);
}).catch((error) => {
console.error("Error downloading file:", error);
}).finally(() => {
this.numActiveDownloads--;
this.processDownloadQueue(cd);
});
}
downloadFile(blob, fileName) {
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", fileName + ".mp3");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
}
// async downloadFileConvert(response: any, fileName: any) {
// const file = new File([await response.blob()], fileName, { type: response.headers.get('content-type') });
// const formData = new FormData();
// formData.append('file', file);
// formData.append('targetformat', 'mp3');
// formData.append('audiobitratetype', "0");
// formData.append('customaudiobitrate', "");
// formData.append('audiosamplingtype', "0");
// formData.append('customaudiosampling', "");
// formData.append('code', "82000");
// formData.append('filelocation', "local");
// formData.append('legal', "Our PHP programs can only be used in aconvert.com. We DO NOT allow using our PHP programs in any third-party websites, software or apps. We will report abuse to your cloud provider, Google Play and App store if illegal usage found!");
// const uploadResponse: any = await fetch('/postFilesToMp3/convert/convert9.php', {
// method: 'POST',
// body: formData,
// });
// if (uploadResponse.state === "SUCCESS") {
// console.log('SUCCESS');
// } else {
// console.error('Error uploading file:', await uploadResponse.text());
// }
// }
}
function App(props) {
const [loadding, setLoading] = require$$0.useState(false);
const [process, setProcess] = require$$0.useState(0);
const [totalNum, setTotalNum] = require$$0.useState(0);
const [isGetMp3, setIsGetMp3] = require$$0.useState(false);
require$$0.useEffect(() => {
if (!window.isExceOne) {
window.isExceOne = true;
const msg = confirm(
"是否下载播放列表音乐.tip: 下载网页播放器内全部音乐,若需要挑选请点击取消,修改播放器内音乐,刷新页面点击确认等待全部下载!!!"
);
if (msg === true) {
setLoading(true);
const body = document.querySelector("#app");
body.style.visibility = "hidden";
const addXMLRequestCallback = (callback) => {
let oldSend = null;
let i = null;
if (XMLHttpRequest.callbacks) {
XMLHttpRequest.callbacks.push(callback);
} else {
XMLHttpRequest.callbacks = [callback];
oldSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function() {
for (i = 0; i < XMLHttpRequest.callbacks.length; i++) {
XMLHttpRequest.callbacks[i](this);
}
oldSend.apply(this, arguments);
};
}
};
addXMLRequestCallback((xhr) => {
xhr.addEventListener("loadend", function() {
var _a, _b, _c;
if (xhr.readyState == 4 && xhr.status == 200) {
if (xhr.responseURL.indexOf("cgi-bin/musics.fcg") !== -1) {
let list = JSON.parse(xhr.response);
let preUrl = void 0;
let songList = void 0;
let songId = void 0;
let songName = void 0;
(_a = Object.keys(list)) == null ? void 0 : _a.forEach((item) => {
var _a2, _b2, _c2, _d, _e, _f, _g, _h;
if (preUrl === void 0) {
preUrl = (_d = (_c2 = (_b2 = (_a2 = list[item]) == null ? void 0 : _a2.data) == null ? void 0 : _b2.midurlinfo) == null ? void 0 : _c2[0]) == null ? void 0 : _d.purl;
}
if (songList === void 0) {
songList = (_f = (_e = list[item]) == null ? void 0 : _e.data) == null ? void 0 : _f.tracks;
}
if (songId === void 0) {
songId = (_h = (_g = list[item]) == null ? void 0 : _g.data) == null ? void 0 : _h.songID;
}
});
if (songId !== void 0) {
songName = (_c = (_b = songList == null ? void 0 : songList.filter(
(item) => (item == null ? void 0 : item.id) === songId
)) == null ? void 0 : _b[0]) == null ? void 0 : _c.name;
songList == null ? void 0 : songList.findIndex(
(item) => (item == null ? void 0 : item.id) === songId
);
songList = splitAndMoveElement(songList, songId);
setTotalNum(songList == null ? void 0 : songList.length);
}
if (preUrl !== void 0 && songName !== void 0) {
const btn = document.querySelector(".btn_big_next");
btn.click();
songList[0] = {
...songList[0],
downUrl: "https://ws6.stream.qqmusic.qq.com/" + preUrl
};
syncRecursive(
songList,
1,
(data) => {
console.log(data, "allData");
const fileDownloader2 = new FileDownloader(
songList == null ? void 0 : songList.length
);
songList == null ? void 0 : songList.forEach((item, i) => {
setTimeout(() => {
fileDownloader2.addToDownloadQueue(
item == null ? void 0 : item.downUrl,
item == null ? void 0 : item.title,
() => {
const body2 = document.querySelector("#app");
body2.style.visibility = "visible";
setLoading(false);
}
);
}, 800 * i);
});
},
(index) => {
setIsGetMp3(false);
if (process === totalNum) {
setIsGetMp3(true);
}
setProcess(index);
}
);
console.log(preUrl, "aaaa");
}
}
}
});
});
}
}
}, []);
return loadding ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
"div",
{
style: {
width: "100%",
height: "100vh",
zIndex: 999999,
background: "#cecece",
fontSize: 24,
color: "white",
position: "absolute",
top: 0,
left: 0
},
children: [
isGetMp3 ? "转换mp3文件中...(需要一段时间请耐心等待)" : "获取下载链接中...",
" ",
"(" + process + "/" + totalNum + ")"
]
}
) : /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, {});
}
const fileDownloader = new FileDownloader(10);
client.createRoot(
(() => {
const app = document.createElement("div");
document.body.append(app);
window.toAudioCount = 0;
return app;
})()
).render(
/* @__PURE__ */ jsxRuntimeExports.jsx(require$$0.StrictMode, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
App,
{
DownloadList: (url, filename) => fileDownloader.addToDownloadQueue(url, filename, () => {
})
}
) })
);
})(React, ReactDOM);