#![allow(clippy::unreadable_literal)]
#![allow(clippy::excessive_precision)]
pub static POST_GAIN_LUT: [f32; 20] = [
0.316236_f32,
0.479471_f32,
0.613419_f32,
0.725124_f32,
0.805335_f32,
0.864560_f32,
0.905192_f32,
0.933339_f32,
0.952972_f32,
0.967126_f32,
0.976939_f32,
0.983813_f32,
0.988713_f32,
0.991978_f32,
0.994303_f32,
0.995993_f32,
0.997184_f32,
0.998007_f32,
0.998586_f32,
0.998995_f32,
];
pub static PRED_GAIN_QUANT_TAB: [f32; 32] = [
-0.774159_f32,
-0.701047_f32,
-0.643523_f32,
-0.592422_f32,
-0.545256_f32,
-0.500842_f32,
-0.459094_f32,
-0.417332_f32,
-0.372691_f32,
-0.320244_f32,
-0.234887_f32,
0.279585_f32,
0.359153_f32,
0.418135_f32,
0.473107_f32,
0.527033_f32,
0.578410_f32,
0.626281_f32,
0.670053_f32,
0.709739_f32,
0.746091_f32,
0.778722_f32,
0.808374_f32,
0.834547_f32,
0.858089_f32,
0.879124_f32,
0.897850_f32,
0.915267_f32,
0.931211_f32,
0.945991_f32,
0.960347_f32,
0.976227_f32,
];
pub static PRED_RFS_TABLE: [u8; 37] = [
5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 3,
3, 3, 3, 3, 2,
];
pub static PRED_RTS_TABLE: [u8; 37] = [
1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3,
];
pub static CDF_TABLE: [i32; 705] = [
0x00000000, 0x00000003, 0x00000005, 0x00000006, 0x00000008, 0x00000009, 0x0000000B, 0x0000000C,
0x0000000D, 0x0000000F, 0x00000010, 0x00000012, 0x00000013, 0x00000014, 0x00000016, 0x00000017,
0x00000019, 0x0000001A, 0x0000001C, 0x0000001D, 0x0000001E, 0x00000020, 0x00000021, 0x00000023,
0x00000024, 0x00000026, 0x00000027, 0x00000028, 0x0000002A, 0x0000002B, 0x0000002D, 0x0000002E,
0x0000002F, 0x00000031, 0x00000032, 0x00000034, 0x00000035, 0x00000037, 0x00000038, 0x00000039,
0x0000003B, 0x0000003C, 0x0000003E, 0x0000003F, 0x00000041, 0x00000042, 0x00000043, 0x00000045,
0x00000046, 0x00000048, 0x00000049, 0x0000004A, 0x0000004C, 0x0000004D, 0x0000004F, 0x00000050,
0x00000052, 0x00000053, 0x00000054, 0x00000056, 0x00000057, 0x00000059, 0x0000005A, 0x0000005B,
0x0000005D, 0x0000005E, 0x00000060, 0x00000061, 0x00000063, 0x00000064, 0x00000065, 0x00000067,
0x00000068, 0x0000006A, 0x0000006B, 0x0000006D, 0x0000006E, 0x0000006F, 0x00000071, 0x00000072,
0x00000074, 0x00000075, 0x00000076, 0x00000078, 0x00000079, 0x0000007B, 0x0000007C, 0x0000007E,
0x0000007F, 0x00000080, 0x00000082, 0x00000083, 0x00000085, 0x00000086, 0x00000088, 0x00000089,
0x0000008A, 0x0000008C, 0x0000008D, 0x0000008F, 0x00000090, 0x00000091, 0x00000093, 0x00000094,
0x00000096, 0x00000097, 0x00000099, 0x0000009A, 0x0000009B, 0x0000009D, 0x0000009E, 0x000000A0,
0x000000A1, 0x000000A3, 0x000000A4, 0x000000A5, 0x000000A7, 0x000000A8, 0x000000AA, 0x000000AB,
0x000000AC, 0x000000AE, 0x000000AF, 0x000000B1, 0x000000B2, 0x000000B4, 0x000000B5, 0x000000B6,
0x000000B8, 0x000000B9, 0x000000BB, 0x000000BC, 0x000000BE, 0x000000BF, 0x000000C0, 0x000000C2,
0x000000C3, 0x000000C5, 0x000000C6, 0x000000C7, 0x000000C9, 0x000000CA, 0x000000CC, 0x000000CD,
0x000000CF, 0x000000D0, 0x000000D1, 0x000000D3, 0x000000D4, 0x000000D6, 0x000000D7, 0x000000D8,
0x000000DA, 0x000000DB, 0x000000DD, 0x000000DE, 0x000000E0, 0x000000E1, 0x000000E2, 0x000000E4,
0x000000E5, 0x000000E7, 0x000000E8, 0x000000EA, 0x000000EB, 0x000000EC, 0x000000EE, 0x000000EF,
0x000000F1, 0x000000F2, 0x000000F3, 0x000000F5, 0x000000F6, 0x000000F8, 0x000000F9, 0x000000FB,
0x000000FC, 0x000000FD, 0x000000FF, 0x00000100, 0x00000102, 0x00000103, 0x00000105, 0x00000106,
0x00000107, 0x00000109, 0x0000010A, 0x0000010C, 0x0000010D, 0x0000010E, 0x00000110, 0x00000111,
0x00000113, 0x00000114, 0x00000116, 0x00000117, 0x00000118, 0x0000011A, 0x0000011B, 0x0000011D,
0x0000011E, 0x00000120, 0x00000121, 0x00000124, 0x00000126, 0x00000128, 0x0000012A, 0x0000012C,
0x0000012F, 0x00000132, 0x00000135, 0x00000137, 0x0000013A, 0x0000013D, 0x00000140, 0x00000143,
0x00000146, 0x00000148, 0x0000014B, 0x0000014F, 0x00000154, 0x00000157, 0x0000015A, 0x0000015E,
0x00000163, 0x00000167, 0x0000016C, 0x00000171, 0x00000176, 0x0000017C, 0x00000182, 0x00000186,
0x0000018C, 0x00000193, 0x00000199, 0x0000019F, 0x000001A6, 0x000001AD, 0x000001B5, 0x000001BD,
0x000001C5, 0x000001CE, 0x000001D8, 0x000001E1, 0x000001EA, 0x000001F3, 0x000001FD, 0x00000207,
0x00000211, 0x0000021D, 0x00000229, 0x00000236, 0x00000243, 0x00000250, 0x0000025E, 0x0000026C,
0x0000027C, 0x0000028B, 0x0000029C, 0x000002AD, 0x000002BF, 0x000002D3, 0x000002E7, 0x000002FD,
0x00000313, 0x0000032A, 0x00000343, 0x0000035D, 0x00000378, 0x00000394, 0x000003B1, 0x000003CE,
0x000003ED, 0x00000410, 0x00000431, 0x00000455, 0x00000479, 0x000004A1, 0x000004CB, 0x000004F4,
0x00000520, 0x0000054E, 0x0000057E, 0x000005B0, 0x000005E5, 0x0000061B, 0x00000653, 0x00000690,
0x000006D0, 0x00000710, 0x00000754, 0x0000079D, 0x000007E6, 0x00000835, 0x00000885, 0x000008D6,
0x0000092D, 0x00000986, 0x000009E4, 0x00000A46, 0x00000AAB, 0x00000B14, 0x00000B80, 0x00000BF0,
0x00000C63, 0x00000CDB, 0x00000D5A, 0x00000DDD, 0x00000E62, 0x00000EEB, 0x00000F7A, 0x0000100E,
0x000010A8, 0x00001146, 0x000011ED, 0x00001298, 0x0000134C, 0x00001404, 0x000014C4, 0x00001586,
0x0000164E, 0x0000171A, 0x000017F5, 0x000018DB, 0x000019C0, 0x00001AAA, 0x00001B9B, 0x00001C98,
0x00001D9C, 0x00001EA7, 0x00001FBF, 0x000020DC, 0x000021FF, 0x0000232C, 0x0000246A, 0x000025AC,
0x000026F9, 0x0000284B, 0x000029A6, 0x00002B0D, 0x00002C81, 0x00002DF9, 0x00002F7A, 0x0000310A,
0x000032A3, 0x00003445, 0x000035F2, 0x000037A4, 0x00003960, 0x00003B21, 0x00003CEE, 0x00003EC3,
0x000040D1, 0x000042A7, 0x00004476, 0x0000463E, 0x00004801, 0x000049B0, 0x00004B61, 0x00004D05,
0x00004E99, 0x00005024, 0x000051A7, 0x00005321, 0x00005496, 0x000055FA, 0x00005757, 0x000058AE,
0x000059F8, 0x00005B3E, 0x00005C79, 0x00005DAB, 0x00005ED3, 0x00005FF3, 0x0000610B, 0x0000621C,
0x00006322, 0x00006420, 0x0000651A, 0x00006606, 0x000066EF, 0x000067D0, 0x000068A9, 0x0000697A,
0x00006A47, 0x00006B0F, 0x00006BCE, 0x00006C84, 0x00006D36, 0x00006DE2, 0x00006E8B, 0x00006F2F,
0x00006FC9, 0x0000705E, 0x000070F0, 0x0000717C, 0x00007206, 0x0000728B, 0x00007308, 0x00007381,
0x000073F9, 0x0000746C, 0x000074DA, 0x00007542, 0x000075A6, 0x00007606, 0x00007661, 0x000076BD,
0x00007714, 0x00007766, 0x000077B4, 0x00007801, 0x0000784A, 0x00007891, 0x000078D7, 0x00007919,
0x00007957, 0x00007994, 0x000079CE, 0x00007A04, 0x00007A3A, 0x00007A6E, 0x00007A9F, 0x00007ACF,
0x00007AFC, 0x00007B28, 0x00007B53, 0x00007B7B, 0x00007BA2, 0x00007BC7, 0x00007BE9, 0x00007C0B,
0x00007C2C, 0x00007C4A, 0x00007C66, 0x00007C81, 0x00007C9B, 0x00007CB4, 0x00007CCD, 0x00007CE5,
0x00007CFC, 0x00007D12, 0x00007D27, 0x00007D3A, 0x00007D4C, 0x00007D5E, 0x00007D70, 0x00007D80,
0x00007D90, 0x00007DA0, 0x00007DAE, 0x00007DBC, 0x00007DC9, 0x00007DD6, 0x00007DE2, 0x00007DED,
0x00007DF9, 0x00007E03, 0x00007E0E, 0x00007E18, 0x00007E21, 0x00007E2B, 0x00007E34, 0x00007E3C,
0x00007E44, 0x00007E4C, 0x00007E53, 0x00007E5A, 0x00007E60, 0x00007E67, 0x00007E6D, 0x00007E73,
0x00007E79, 0x00007E7F, 0x00007E83, 0x00007E89, 0x00007E8E, 0x00007E93, 0x00007E98, 0x00007E9C,
0x00007EA0, 0x00007EA5, 0x00007EA9, 0x00007EAD, 0x00007EB1, 0x00007EB4, 0x00007EB7, 0x00007EBB,
0x00007EBE, 0x00007EC2, 0x00007EC5, 0x00007EC7, 0x00007ECA, 0x00007ECD, 0x00007ECF, 0x00007ED2,
0x00007ED4, 0x00007ED7, 0x00007ED8, 0x00007EDA, 0x00007EDB, 0x00007EDD, 0x00007EDE, 0x00007EDF,
0x00007EE2, 0x00007EE3, 0x00007EE6, 0x00007EE7, 0x00007EE9, 0x00007EEA, 0x00007EEB, 0x00007EED,
0x00007EEE, 0x00007EF0, 0x00007EF1, 0x00007EF3, 0x00007EF4, 0x00007EF5, 0x00007EF7, 0x00007EF8,
0x00007EFA, 0x00007EFB, 0x00007EFC, 0x00007EFE, 0x00007EFF, 0x00007F01, 0x00007F02, 0x00007F04,
0x00007F05, 0x00007F06, 0x00007F08, 0x00007F09, 0x00007F0B, 0x00007F0C, 0x00007F0E, 0x00007F0F,
0x00007F10, 0x00007F12, 0x00007F13, 0x00007F15, 0x00007F16, 0x00007F17, 0x00007F19, 0x00007F1A,
0x00007F1C, 0x00007F1D, 0x00007F1F, 0x00007F20, 0x00007F21, 0x00007F23, 0x00007F24, 0x00007F26,
0x00007F27, 0x00007F29, 0x00007F2A, 0x00007F2B, 0x00007F2D, 0x00007F2E, 0x00007F30, 0x00007F31,
0x00007F32, 0x00007F34, 0x00007F35, 0x00007F37, 0x00007F38, 0x00007F3A, 0x00007F3B, 0x00007F3C,
0x00007F3E, 0x00007F3F, 0x00007F41, 0x00007F42, 0x00007F44, 0x00007F45, 0x00007F46, 0x00007F48,
0x00007F49, 0x00007F4B, 0x00007F4C, 0x00007F4D, 0x00007F4F, 0x00007F50, 0x00007F52, 0x00007F53,
0x00007F55, 0x00007F56, 0x00007F57, 0x00007F59, 0x00007F5A, 0x00007F5C, 0x00007F5D, 0x00007F5E,
0x00007F60, 0x00007F61, 0x00007F63, 0x00007F64, 0x00007F66, 0x00007F67, 0x00007F68, 0x00007F6A,
0x00007F6B, 0x00007F6D, 0x00007F6E, 0x00007F70, 0x00007F71, 0x00007F72, 0x00007F74, 0x00007F75,
0x00007F77, 0x00007F78, 0x00007F79, 0x00007F7B, 0x00007F7C, 0x00007F7E, 0x00007F7F, 0x00007F81,
0x00007F82, 0x00007F83, 0x00007F85, 0x00007F86, 0x00007F88, 0x00007F89, 0x00007F8B, 0x00007F8C,
0x00007F8D, 0x00007F8F, 0x00007F90, 0x00007F92, 0x00007F93, 0x00007F94, 0x00007F96, 0x00007F97,
0x00007F99, 0x00007F9A, 0x00007F9C, 0x00007F9D, 0x00007F9E, 0x00007FA0, 0x00007FA1, 0x00007FA3,
0x00007FA4, 0x00007FA6, 0x00007FA7, 0x00007FA8, 0x00007FAA, 0x00007FAB, 0x00007FAD, 0x00007FAE,
0x00007FAF, 0x00007FB1, 0x00007FB2, 0x00007FB4, 0x00007FB5, 0x00007FB7, 0x00007FB8, 0x00007FB9,
0x00007FBB, 0x00007FBC, 0x00007FBE, 0x00007FBF, 0x00007FC1, 0x00007FC2, 0x00007FC3, 0x00007FC5,
0x00007FC6, 0x00007FC8, 0x00007FC9, 0x00007FCA, 0x00007FCC, 0x00007FCD, 0x00007FCF, 0x00007FD0,
0x00007FD2, 0x00007FD3, 0x00007FD4, 0x00007FD6, 0x00007FD7, 0x00007FD9, 0x00007FDA, 0x00007FDB,
0x00007FDD, 0x00007FDE, 0x00007FE0, 0x00007FE1, 0x00007FE3, 0x00007FE4, 0x00007FE5, 0x00007FE7,
0x00007FE8, 0x00007FEA, 0x00007FEB, 0x00007FED, 0x00007FEE, 0x00007FEF, 0x00007FF1, 0x00007FF2,
0x00007FF4, 0x00007FF5, 0x00007FF6, 0x00007FF8, 0x00007FF9, 0x00007FFB, 0x00007FFC, 0x00007FFE,
0x00008000,
];
pub static PREDICTOR_GAIN_CDF_LUT: [u32; 33] = [
0x0000, 0x003F, 0x0126, 0x02B3, 0x0501, 0x0813, 0x0BD2, 0x1044, 0x1525, 0x1993, 0x1C58, 0x1D01,
0x1ECF, 0x23F3, 0x2A4C, 0x3066, 0x360D, 0x3BA6, 0x412C, 0x46DC, 0x4C96, 0x5268, 0x5843, 0x5E2E,
0x641F, 0x69E3, 0x6F74, 0x748D, 0x7900, 0x7C55, 0x7E92, 0x7FB4, 0x8000,
];
pub static ENVELOPE_CDF_LUT: [i32; 33] = [
0x00000000, 0x00000041, 0x000000b5, 0x00000128, 0x000001b3, 0x000002d6, 0x000003e9, 0x000004d4,
0x000005f7, 0x00000755, 0x000008dc, 0x00000b2b, 0x00000ec9, 0x000014b6, 0x00001e59, 0x00002d57,
0x000040a5, 0x0000538e, 0x0000611e, 0x000069d8, 0x00006fd5, 0x000073e6, 0x000076b6, 0x000078db,
0x00007a50, 0x00007bbc, 0x00007c92, 0x00007d3a, 0x00007e19, 0x00007edd, 0x00007f73, 0x00007fb0,
0x00008000,
];
pub static DITHER_TABLE: [i32; 256] = [
0x3200, 0x3280, 0x7A00, 0x6C80, 0x6980, 0x1400, 0x7400, 0x2B80, 0x7980, 0x3080, 0x3900, 0x2C80,
0x3800, 0x5D80, 0x7300, 0x6780, 0x3300, 0x3C80, 0x4C80, 0x2300, 0x4580, 0x5000, 0x7A80, 0x4500,
0x1580, 0x1700, 0x6680, 0x6300, 0x1F80, 0x6700, 0x1100, 0x2200, 0x7700, 0x5E00, 0x1A80, 0x2B00,
0x1080, 0x6200, 0x2F80, 0x6C00, 0x2880, 0x6F00, 0x2D00, 0x5580, 0x3D00, 0x6800, 0x7780, 0x2C00,
0x6880, 0x4300, 0x3400, 0x7C00, 0x3B80, 0x4080, 0x4000, 0x0B80, 0x6380, 0x0800, 0x2980, 0x1280,
0x4280, 0x3780, 0x1300, 0x1D80, 0x1800, 0x2E80, 0x1500, 0x6F80, 0x4800, 0x0580, 0x5C80, 0x4E80,
0x2700, 0x3E00, 0x6E00, 0x4A00, 0x6480, 0x4A80, 0x0600, 0x3F00, 0x7180, 0x3500, 0x3E80, 0x5500,
0x4480, 0x0400, 0x0880, 0x0200, 0x7600, 0x4E00, 0x6100, 0x4000, 0x1C00, 0x1C80, 0x3380, 0x6500,
0x7880, 0x6B00, 0x3480, 0x3F80, 0x6000, 0x2180, 0x0780, 0x4900, 0x3680, 0x6080, 0x0000, 0x5600,
0x2600, 0x3100, 0x0700, 0x4100, 0x5680, 0x5880, 0x6580, 0x0980, 0x2500, 0x1E00, 0x2100, 0x6E80,
0x7580, 0x6B80, 0x0F00, 0x4B00, 0x2800, 0x7800, 0x4680, 0x5180, 0x6A00, 0x7900, 0x7100, 0x1480,
0x5D00, 0x6A80, 0x2580, 0x3180, 0x5200, 0x2780, 0x6D80, 0x2900, 0x1980, 0x1B00, 0x1F00, 0x2480,
0x2000, 0x3B00, 0x1B80, 0x5B80, 0x2D80, 0x5700, 0x6600, 0x4980, 0x1380, 0x3D80, 0x1680, 0x4F80,
0x5980, 0x5A00, 0x7D80, 0x0A00, 0x4180, 0x7680, 0x1900, 0x3000, 0x0380, 0x5780, 0x6900, 0x4200,
0x5380, 0x2A00, 0x5480, 0x3A00, 0x0E00, 0x3880, 0x3A80, 0x3980, 0x6400, 0x4600, 0x1780, 0x5100,
0x2E00, 0x4C00, 0x0500, 0x5800, 0x7E00, 0x0C80, 0x0900, 0x0280, 0x0480, 0x0080, 0x6D00, 0x5300,
0x1200, 0x7280, 0x7B00, 0x4780, 0x0F80, 0x2A80, 0x7F00, 0x7200, 0x7000, 0x1D00, 0x5C00, 0x4400,
0x4D80, 0x7480, 0x1180, 0x0A80, 0x2380, 0x4700, 0x3C00, 0x3580, 0x7B80, 0x5280, 0x0C00, 0x0680,
0x0300, 0x7E80, 0x7080, 0x4380, 0x5E80, 0x4B80, 0x0D00, 0x0180, 0x5F00, 0x2400, 0x4880, 0x3700,
0x5400, 0x0100, 0x2080, 0x7D00, 0x2280, 0x1A00, 0x5900, 0x1600, 0x7C80, 0x5080, 0x1E80, 0x4F00,
0x0E80, 0x3600, 0x2F00, 0x2680, 0x7500, 0x5B00, 0x1000, 0x6280, 0x5F80, 0x7380, 0x5A80, 0x0D80,
0x4D00, 0x0B00, 0x6180, 0x1880,
];
pub static RANDOM_NOISE_TABLE: [f32; 256] = [
0.643120_f32,
0.970001_f32,
-0.340081_f32,
-0.643120_f32,
0.889720_f32,
-0.612330_f32,
0.332226_f32,
0.038815_f32,
-0.248121_f32,
0.211033_f32,
0.987555_f32,
0.152782_f32,
-0.308890_f32,
-0.109753_f32,
-0.218404_f32,
0.138387_f32,
1.618787_f32,
-1.237989_f32,
-0.553833_f32,
1.381896_f32,
0.181761_f32,
-0.686079_f32,
-0.152782_f32,
0.060027_f32,
-0.697200_f32,
-0.780194_f32,
1.208686_f32,
0.017636_f32,
-0.755469_f32,
0.708487_f32,
0.324411_f32,
-0.045881_f32,
-0.832580_f32,
-0.095503_f32,
-1.718228_f32,
0.920482_f32,
0.109753_f32,
-0.731594_f32,
0.572915_f32,
-1.381896_f32,
-0.181761_f32,
0.421076_f32,
-0.278261_f32,
-0.743431_f32,
0.031753_f32,
-0.632730_f32,
-0.987555_f32,
0.263134_f32,
-0.421076_f32,
-0.489838_f32,
0.145577_f32,
0.686079_f32,
0.301183_f32,
0.429454_f32,
1.303538_f32,
0.045881_f32,
1.269466_f32,
0.653644_f32,
-1.428033_f32,
0.602310_f32,
1.718228_f32,
0.664308_f32,
0.340081_f32,
0.124046_f32,
0.697200_f32,
-0.102623_f32,
0.248121_f32,
-0.233213_f32,
-0.347976_f32,
-0.293510_f32,
-1.155382_f32,
0.355913_f32,
0.446387_f32,
0.379985_f32,
-0.463567_f32,
0.404484_f32,
-0.936505_f32,
0.904897_f32,
-0.819081_f32,
0.081290_f32,
0.525906_f32,
-0.664308_f32,
0.498739_f32,
-1.480806_f32,
0.553833_f32,
1.237989_f32,
0.024693_f32,
0.003527_f32,
-0.622469_f32,
1.024513_f32,
-0.379985_f32,
1.005707_f32,
0.225797_f32,
-0.525906_f32,
0.860482_f32,
0.767720_f32,
-0.572915_f32,
-0.355913_f32,
0.088392_f32,
0.347976_f32,
-1.044036_f32,
-0.363892_f32,
1.542840_f32,
-1.340760_f32,
-0.874923_f32,
1.130919_f32,
-0.301183_f32,
-1.269466_f32,
-0.767720_f32,
-0.263134_f32,
0.102623_f32,
0.131210_f32,
-0.017636_f32,
-0.138387_f32,
-0.388102_f32,
1.064347_f32,
0.592404_f32,
0.233213_f32,
0.052951_f32,
0.489838_f32,
-0.952999_f32,
-0.067108_f32,
0.846374_f32,
0.516770_f32,
0.563325_f32,
-0.792903_f32,
-0.324411_f32,
0.293510_f32,
-0.131210_f32,
-1.024513_f32,
-0.024693_f32,
1.428033_f32,
-0.429454_f32,
0.074195_f32,
0.454945_f32,
-0.412753_f32,
-0.970001_f32,
-0.211033_f32,
0.010581_f32,
-0.332226_f32,
1.480806_f32,
-1.181236_f32,
-0.003527_f32,
-0.904897_f32,
0.743431_f32,
-0.582607_f32,
-0.446387_f32,
0.622469_f32,
0.255614_f32,
1.181236_f32,
-0.371916_f32,
-0.255614_f32,
-0.052951_f32,
0.544434_f32,
-0.145577_f32,
-0.081290_f32,
0.832580_f32,
-0.805861_f32,
0.805861_f32,
-1.303538_f32,
0.755469_f32,
-0.544434_f32,
-0.316632_f32,
0.463567_f32,
-0.507715_f32,
1.085529_f32,
-0.437891_f32,
0.874923_f32,
0.819081_f32,
-0.535126_f32,
-0.708487_f32,
-0.203685_f32,
0.371916_f32,
-1.005707_f32,
0.116894_f32,
0.792903_f32,
0.308890_f32,
0.719949_f32,
-0.167238_f32,
0.936505_f32,
0.507715_f32,
-0.160002_f32,
-0.653644_f32,
-0.010581_f32,
0.203685_f32,
0.396268_f32,
-0.481011_f32,
0.582607_f32,
-1.107681_f32,
-0.124046_f32,
-0.196357_f32,
-1.064347_f32,
0.174491_f32,
0.952999_f32,
0.167238_f32,
0.437891_f32,
0.780194_f32,
1.107681_f32,
0.612330_f32,
-0.038815_f32,
0.316632_f32,
0.731594_f32,
0.278261_f32,
-1.542840_f32,
0.412753_f32,
-0.240654_f32,
0.632730_f32,
0.363892_f32,
-0.472255_f32,
-0.174491_f32,
-0.719949_f32,
0.196357_f32,
0.285870_f32,
-1.618787_f32,
0.189050_f32,
-0.074195_f32,
1.867070_f32,
-0.225797_f32,
0.240654_f32,
-0.189050_f32,
0.472255_f32,
0.095503_f32,
-0.860482_f32,
-0.270683_f32,
-0.516770_f32,
0.388102_f32,
-0.602310_f32,
-0.285870_f32,
-0.889720_f32,
-1.867070_f32,
1.340760_f32,
-0.060027_f32,
0.218404_f32,
-0.592404_f32,
-1.208686_f32,
0.675117_f32,
-0.116894_f32,
1.155382_f32,
-0.088392_f32,
0.535126_f32,
-0.675117_f32,
0.160002_f32,
-0.563325_f32,
-0.031753_f32,
-0.920482_f32,
-0.498739_f32,
-0.404484_f32,
-1.130919_f32,
1.044036_f32,
-0.396268_f32,
-0.846374_f32,
-0.454945_f32,
0.481011_f32,
-1.085529_f32,
0.067108_f32,
0.270683_f32,
];
pub static STEP_SIZES_Q4_15: [i32; 21] = [
0x00000000, 0x00028C00, 0x0001CE00, 0x00016000, 0x00011100, 0x0000DA00, 0x0000AF80, 0x00008F80,
0x00007680, 0x00006280, 0x000051C0, 0x00004420, 0x000038E0, 0x00002F60, 0x000027E0, 0x00002190,
0x00001C20, 0x00001790, 0x000013D0, 0x000010B0, 0x00000E10,
];
pub static AC_COEFF_MAX_INDEX: [u8; 21] = [
0, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 19, 23, 27, 32, 38, 46, 54, 65, 77, 91,
];
pub static SLOPES_DB_TO_LIN: [i32; 10] = [2, 4, 6, 9, 15, 23, 37, 59, 93, 148];
pub static OFFSETS_DB_TO_LIN: [i32; 10] = [16, 11, -7, -48, -135, -308, -636, -1244, -2344, -4305];
pub static SLOPES_LIN_TO_DB: [i32; 50] = [
1221, 568, 374, 279, 223, 186, 159, 139, 124, 111, 101, 93, 86, 79, 74, 70, 65, 62, 59, 56, 53,
51, 48, 46, 44, 43, 41, 40, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 29, 28, 27, 26, 26, 25, 25,
24, 24, 23, 23, 22,
];
pub static OFFSETS_LIN_TO_DB: [i32; 50] = [
-1221, 739, 1708, 2371, 2878, 3289, 3635, 3934, 4198, 4433, 4646, 4840, 5018, 5183, 5337, 5481,
5616, 5743, 5864, 5978, 6086, 6190, 6289, 6384, 6474, 6562, 6646, 6727, 6804, 6880, 6953, 7024,
7092, 7158, 7223, 7286, 7347, 7406, 7464, 7520, 7575, 7628, 7681, 7732, 7782, 7831, 7879, 7925,
7971, 8016,
];
pub fn lin_to_db(idx: usize, x: i32) -> i32 {
SLOPES_LIN_TO_DB[idx] * x + OFFSETS_LIN_TO_DB[idx]
}
pub fn db_to_lin(idx: usize, x: i32) -> i32 {
SLOPES_DB_TO_LIN[idx] * x + OFFSETS_DB_TO_LIN[idx]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lengths_match_spec() {
assert_eq!(POST_GAIN_LUT.len(), 20);
assert_eq!(PRED_GAIN_QUANT_TAB.len(), 32);
assert_eq!(PRED_RFS_TABLE.len(), 37);
assert_eq!(PRED_RTS_TABLE.len(), 37);
assert_eq!(CDF_TABLE.len(), 705);
assert_eq!(PREDICTOR_GAIN_CDF_LUT.len(), 33);
assert_eq!(ENVELOPE_CDF_LUT.len(), 33);
assert_eq!(DITHER_TABLE.len(), 256);
assert_eq!(RANDOM_NOISE_TABLE.len(), 256);
assert_eq!(STEP_SIZES_Q4_15.len(), 21);
assert_eq!(AC_COEFF_MAX_INDEX.len(), 21);
assert_eq!(SLOPES_DB_TO_LIN.len(), 10);
assert_eq!(OFFSETS_DB_TO_LIN.len(), 10);
assert_eq!(SLOPES_LIN_TO_DB.len(), 50);
assert_eq!(OFFSETS_LIN_TO_DB.len(), 50);
}
#[test]
fn cdf_table_anchor() {
assert_eq!(CDF_TABLE[0], 0x0000);
assert_eq!(CDF_TABLE[704], 0x8000);
assert!(
CDF_TABLE.windows(2).all(|w| w[0] <= w[1]),
"CDF_TABLE must be monotonic non-decreasing"
);
}
#[test]
fn predictor_gain_cdf_anchor() {
assert_eq!(PREDICTOR_GAIN_CDF_LUT[0], 0x0000);
assert_eq!(PREDICTOR_GAIN_CDF_LUT[32], 0x8000);
assert!(PREDICTOR_GAIN_CDF_LUT.windows(2).all(|w| w[0] <= w[1]));
}
#[test]
fn envelope_cdf_anchor() {
assert_eq!(ENVELOPE_CDF_LUT[0], 0x00000000);
assert_eq!(ENVELOPE_CDF_LUT[32], 0x00008000);
}
#[test]
fn post_gain_lut_monotone() {
for w in POST_GAIN_LUT.windows(2) {
assert!(
w[0] < w[1],
"POST_GAIN_LUT must increase: {} < {}",
w[0],
w[1]
);
}
assert!(POST_GAIN_LUT[19] < 1.0);
assert!(POST_GAIN_LUT[19] > 0.99);
}
#[test]
fn pred_strip_tables_anchors() {
assert_eq!(PRED_RFS_TABLE[0], 5);
assert_eq!(PRED_RFS_TABLE[36], 2);
assert_eq!(PRED_RTS_TABLE[0], 1);
assert_eq!(PRED_RTS_TABLE[36], 3);
}
#[test]
fn ac_coeff_max_index_anchor() {
assert_eq!(
AC_COEFF_MAX_INDEX,
[0, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 19, 23, 27, 32, 38, 46, 54, 65, 77, 91]
);
}
#[test]
fn lin_to_db_idx0() {
let y0 = lin_to_db(0, 0);
let y1 = lin_to_db(0, 1);
assert!(
y1 > y0,
"slope[0] = {} should be positive",
SLOPES_LIN_TO_DB[0]
);
}
#[test]
fn dither_table_q15_range() {
for &v in DITHER_TABLE.iter() {
assert!(
(0..=0x7F80).contains(&v),
"dither sample {} out of Q0.15 range",
v
);
}
let mut sorted: Vec<i32> = DITHER_TABLE.to_vec();
sorted.sort_unstable();
sorted.dedup();
assert_eq!(
sorted.len(),
255,
"spec has one duplicated entry (0x4000 x2)"
);
}
#[test]
fn random_noise_zero_mean() {
let sum: f64 = RANDOM_NOISE_TABLE.iter().map(|&x| x as f64).sum();
let mean = sum / RANDOM_NOISE_TABLE.len() as f64;
assert!(mean.abs() < 0.05, "mean = {}", mean);
}
}