1/* 2 * Real Audio 1.0 (14.4K) 3 * Copyright (c) 2003 the ffmpeg project 4 * 5 * This file is part of Libav. 6 * 7 * Libav is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * Libav is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with Libav; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include <stdint.h> 23#include "avcodec.h" 24#include "celp_filters.h" 25#include "ra144.h" 26 27const int16_t ff_gain_val_tab[256][3] = { 28 { 541, 956, 768}, { 877, 581, 568}, { 675,1574, 635}, {1248,1464, 668}, 29 {1246, 839, 1394}, {2560,1386, 991}, { 925, 687, 608}, {2208, 797, 1144}, 30 { 535, 832, 799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176}, 31 {1292, 901, 732}, {1656, 689, 896}, {1750,1248, 848}, {2284, 942, 1022}, 32 { 824,1472, 643}, { 517, 765, 512}, { 562,1816, 1522}, { 694,1826, 2700}, 33 { 704, 524, 672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692}, 34 { 932, 746, 777}, {1132, 822, 926}, {1226, 771, 611}, {2948,1342, 1008}, 35 {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614, 575}, 36 { 665, 935, 628}, { 631,1192, 829}, { 644, 926, 1052}, { 879, 988, 1226}, 37 { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628, 740}, { 639, 532, 1074}, 38 { 955,1208, 598}, {1124,1160, 900}, {1206, 899, 1242}, { 746, 533, 624}, 39 {1458,1028, 735}, {1706,1102, 692}, {1898,1018, 1004}, {2176, 988, 735}, 40 {1578, 782, 1642}, { 897, 516, 754}, {2068, 702, 1656}, {2344, 818, 1526}, 41 { 907, 652, 592}, {1056, 652, 642}, {2124,1416, 780}, {2664,1250, 727}, 42 {1894, 727, 1108}, {2196, 657, 981}, {4840, 920, 1704}, {4992,1238, 983}, 43 {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612, 853}, {3068, 832, 574}, 44 { 523,1796, 923}, { 722,1916, 1382}, {1226,1542, 928}, { 758, 757, 584}, 45 { 512,1134, 577}, { 615,1276, 698}, { 574,2568, 2356}, { 993,2728, 3512}, 46 { 539, 890, 913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128}, 47 { 816, 950, 590}, { 955, 847, 811}, {1094, 883, 556}, {1304, 888, 604}, 48 { 863,1170, 855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564, 573}, 49 { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714}, 50 {1090,1166, 631}, {1314,1202, 751}, {1480, 905, 795}, {1682,1016, 568}, 51 {1494,1178, 983}, { 878, 613, 526}, {1728,1446, 779}, {2136,1348, 774}, 52 { 950, 649, 939}, {1180, 703, 899}, {1236, 527, 1158}, {1450, 647, 972}, 53 {1282, 647, 707}, {1460, 663, 644}, {1614, 572, 578}, {3516,1222, 821}, 54 {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733, 976}, {6800, 871, 1416}, 55 {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632, 875}, {4092, 732, 638}, 56 {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559, 854}, 57 {1736, 729, 787}, {1940, 686, 547}, {2140, 635, 674}, {4480,1272, 828}, 58 {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801, 955}, {4656, 522, 646}, 59 {4848, 625, 1636}, {4984, 591, 874}, {5352, 535, 1001}, {11216,938, 1184}, 60 { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576, 674}, { 655, 783, 528}, 61 { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468}, 62 { 586, 683, 715}, { 739, 609, 717}, { 778, 773, 697}, { 922, 785, 813}, 63 { 766, 651, 984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178}, 64 {1108,2144, 979}, { 723, 982, 690}, { 936, 956, 527}, {1180,1002, 547}, 65 { 517,1306, 825}, { 832,1184, 974}, {1024, 957, 903}, {1262,1090, 906}, 66 {1028, 720, 649}, {1192, 679, 694}, {2468,1480, 979}, {2844,1370, 877}, 67 {1310, 835, 848}, {1508, 839, 698}, {1742,1030, 769}, {1910, 852, 573}, 68 {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104}, 69 { 891, 536, 690}, {1016, 560, 663}, {2172, 870, 1348}, {2404, 999, 1170}, 70 {1890, 966, 889}, {2116, 912, 777}, {2296,1020, 714}, {4872,1844, 932}, 71 {2392, 778, 929}, {2604, 772, 744}, {2764, 957, 722}, {5832,1532, 984}, 72 {2188, 519, 1264}, {2332, 532, 922}, {5064, 995, 2412}, {2708, 571, 874}, 73 {2408, 545, 666}, {5016,1084, 875}, {5376, 983, 1196}, {5536, 979, 730}, 74 {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905, 763}, 75 {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998}, 76 {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567, 835}, {1478, 571, 973}, 77 {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686, 741}, 78 {1462, 552, 714}, {3296, 991, 1452}, {1590, 615, 544}, {3480,1150, 824}, 79 {3212, 832, 923}, {3276, 839, 531}, {3548, 786, 852}, {3732, 764, 570}, 80 {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535, 876}, {3228, 598, 649}, 81 {6536, 759, 1436}, {6648, 993, 846}, {6864, 567, 1210},{14016,1012, 1302}, 82 {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032, 836}, 83 {7448, 612, 1552}, {7744, 614, 816}, {8384, 777, 1438}, {8784, 694, 786}, 84 { 882,1508, 1068}, { 597, 837, 766}, {1270, 954, 1408}, { 803, 550, 798}, 85 {1398,1308, 798}, {1848,1534, 738}, { 970, 675, 608}, {1264, 706, 684}, 86 {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048, 611}, 87 { 999, 942, 963}, {1094, 857, 935}, {2936, 926, 1138}, {1934, 746, 551}, 88 {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564, 636}, {4096,1126, 793}, 89 {3936, 556, 1140}, {3936, 540, 740}, {4216, 764, 874}, {8480,1328, 1014}, 90 {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062, 733}, 91 {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086} 92}; 93 94const uint8_t ff_gain_exp_tab[256] = { 95 15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14, 96 14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13, 97 13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13, 98 13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 99 13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12, 100 12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12, 101 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13, 102 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 103 13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 104 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11, 105 12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13, 106 12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 107 12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12, 108 13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13, 109 11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10, 9, 11, 10, 110 12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12 111}; 112 113const int8_t ff_cb1_vects[128][40]={ 114 { 115 38, -4, 15, -4, 14, -13, 12, -11, -2, -6, 116 -6, -11, -45, -16, -11, -13, -7, 6, -12, 4, 117 -20, 3, -16, 12, -1, 12, 46, 24, 0, 33, 118 -3, 9, -12, -12, -8, -7, 17, -6, 0, -2, 119 }, { 120 60, -16, 3, -22, 10, -32, 0, -28, -17, -18, 121 -3, -25, -37, -23, -10, 3, 2, 3, 0, 3, 122 -14, 0, -14, -1, 0, 2, 32, 9, -1, 25, 123 7, 13, -5, 13, 8, 1, 2, 8, -10, 6, 124 }, { 125 27, -12, 28, -2, 6, -7, 15, 9, -11, 1, 126 -13, -11, -40, 4, -29, -14, -19, -5, -23, -8, 127 -30, -13, -17, 0, -14, 12, 34, 20, -2, 25, 128 2, -16, -4, -12, 15, 16, 29, 7, 24, 10, 129 }, { 130 49, -24, 16, -20, 2, -26, 2, -7, -25, -10, 131 -11, -25, -32, -3, -27, 2, -8, -8, -11, -9, 132 -24, -17, -16, -14, -13, 2, 20, 5, -4, 17, 133 14, -12, 3, 13, 33, 25, 14, 23, 15, 19, 134 }, { 135 46, -6, 21, 8, -2, -16, -5, -8, -11, 4, 136 8, 15, -24, 4, -2, -26, -3, -16, -16, -14, 137 -9, -2, -1, 4, 19, 7, 36, 17, 9, 13, 138 0, 31, -5, -12, 7, -8, 11, -15, -13, -4, 139 }, { 140 68, -18, 9, -9, -6, -35, -18, -25, -26, -7, 141 10, 1, -16, -3, -1, -9, 6, -19, -4, -15, 142 -4, -6, 0, -8, 20, -2, 23, 2, 7, 5, 143 12, 35, 1, 13, 24, 0, -3, 0, -22, 4, 144 }, { 145 35, -14, 34, 10, -10, -10, -1, 12, -20, 12, 146 0, 15, -18, 24, -20, -27, -14, -28, -27, -27, 147 -20, -19, -2, -8, 5, 7, 25, 13, 5, 5, 148 6, 5, 2, -12, 31, 15, 23, -1, 12, 8, 149 }, { 150 57, -26, 22, -7, -14, -28, -14, -3, -35, 0, 151 3, 1, -11, 16, -18, -10, -4, -31, -15, -28, 152 -14, -23, -1, -21, 7, -2, 11, -1, 3, -1, 153 18, 9, 10, 13, 49, 24, 8, 14, 2, 16, 154 }, { 155 25, 15, 22, 11, 18, 4, 15, -22, 8, -2, 156 -17, -9, -48, -20, -30, -17, -16, 11, -1, 16, 157 2, 10, -5, 26, -2, -4, 22, 0, 2, 10, 158 -6, 13, -14, 10, -23, 0, 10, -2, 1, 0, 159 }, { 160 47, 3, 11, -6, 15, -13, 2, -38, -6, -13, 161 -15, -22, -40, -28, -28, 0, -5, 8, 10, 15, 162 7, 7, -4, 13, -1, -14, 9, -14, 0, 2, 163 4, 18, -7, 36, -6, 8, -3, 13, -7, 8, 164 }, { 165 14, 7, 36, 13, 10, 10, 18, 0, 0, 5, 166 -25, -8, -43, 0, -48, -18, -27, 0, -12, 3, 167 -7, -6, -7, 13, -15, -5, 11, -3, 0, 2, 168 0, -12, -6, 10, 0, 23, 22, 11, 26, 12, 169 }, { 170 36, -5, 24, -4, 7, -7, 6, -17, -14, -5, 171 -22, -22, -35, -8, -46, -1, -17, -3, 0, 2, 172 -2, -10, -5, 0, -14, -15, -2, -18, -2, -4, 173 11, -7, 1, 36, 18, 32, 7, 27, 17, 20, 174 }, { 175 33, 13, 29, 24, 1, 1, -2, -18, 0, 9, 176 -3, 17, -27, 0, -21, -30, -12, -11, -5, -2, 177 12, 4, 9, 19, 18, -9, 13, -6, 11, -8, 178 -2, 35, -8, 10, -7, -1, 4, -11, -10, -2, 179 }, { 180 55, 1, 17, 6, -1, -16, -15, -35, -15, -2, 181 0, 4, -19, -8, -20, -13, -1, -14, 7, -3, 182 18, 0, 10, 5, 19, -19, 0, -21, 8, -16, 183 9, 39, 0, 36, 10, 7, -9, 4, -20, 5, 184 }, { 185 22, 5, 42, 26, -6, 8, 1, 2, -9, 17, 186 -10, 18, -21, 19, -39, -31, -23, -23, -16, -15, 187 2, -12, 7, 6, 5, -9, 1, -10, 7, -16, 188 4, 9, 0, 10, 17, 22, 16, 2, 14, 9, 189 }, { 190 44, -6, 30, 8, -9, -10, -11, -14, -23, 5, 191 -8, 4, -14, 12, -37, -14, -12, -26, -4, -16, 192 8, -16, 9, -7, 6, -19, -12, -25, 5, -24, 193 15, 13, 8, 36, 34, 31, 1, 18, 4, 18, 194 }, { 195 -3, -5, -9, -7, 15, -1, 5, 13, 2, 12, 196 5, 2, -21, -23, -2, -16, 0, 5, -6, 13, 197 -23, 3, -32, 10, -15, 8, 44, 28, 9, 37, 198 -2, 13, -9, -15, -12, -27, -7, -12, 0, -11, 199 }, { 200 18, -17, -21, -25, 11, -19, -6, -3, -11, 0, 201 7, -11, -13, -31, -1, 0, 9, 1, 5, 12, 202 -18, 0, -31, -2, -13, -1, 30, 14, 7, 29, 203 9, 18, -1, 10, 4, -18, -22, 3, -10, -2, 204 }, { 205 -13, -13, 3, -5, 7, 4, 9, 34, -5, 20, 206 -2, 3, -16, -3, -20, -17, -11, -7, -17, 0, 207 -34, -13, -33, -2, -28, 8, 32, 24, 5, 29, 208 3, -12, 0, -15, 11, -3, 3, 2, 24, 1, 209 }, { 210 8, -25, -8, -23, 3, -13, -3, 17, -20, 8, 211 0, -10, -8, -11, -18, 0, -1, -10, -5, 0, 212 -28, -17, -32, -15, -26, -1, 19, 9, 3, 21, 213 15, -7, 6, 9, 29, 5, -10, 17, 15, 9, 214 }, { 215 4, -6, -3, 5, -1, -4, -11, 16, -6, 23, 216 19, 29, 0, -3, 6, -30, 3, -17, -10, -5, 217 -13, -2, -17, 3, 5, 3, 35, 21, 17, 17, 218 2, 35, -2, -15, 3, -28, -13, -21, -13, -13, 219 }, { 220 26, -19, -15, -12, -5, -22, -24, 0, -21, 12, 221 21, 15, 8, -11, 7, -12, 14, -20, 2, -6, 222 -7, -6, -16, -9, 6, -5, 21, 7, 15, 10, 223 13, 39, 5, 10, 20, -19, -28, -5, -22, -5, 224 }, { 225 -5, -15, 9, 7, -9, 2, -8, 37, -14, 31, 226 11, 29, 5, 16, -11, -30, -7, -29, -21, -18, 227 -23, -19, -18, -9, -7, 3, 23, 17, 14, 9, 228 8, 9, 6, -15, 27, -4, -2, -6, 12, -1, 229 }, { 230 16, -27, -2, -10, -13, -16, -20, 20, -29, 20, 231 14, 16, 13, 8, -9, -13, 2, -33, -9, -19, 232 -17, -23, -17, -22, -6, -6, 9, 2, 12, 2, 233 20, 13, 13, 10, 45, 4, -16, 8, 2, 7, 234 }, { 235 -16, 14, -2, 8, 20, 17, 9, 2, 14, 16, 236 -6, 5, -24, -28, -21, -20, -8, 9, 4, 25, 237 -1, 11, -22, 24, -15, -8, 21, 5, 11, 14, 238 -5, 18, -11, 7, -27, -20, -14, -7, 1, -9, 239 }, { 240 6, 2, -14, -9, 16, -1, -3, -14, 0, 5, 241 -3, -8, -16, -36, -19, -3, 1, 6, 17, 24, 242 4, 7, -21, 11, -14, -18, 7, -9, 9, 7, 243 6, 22, -3, 33, -10, -11, -28, 7, -7, 0, 244 }, { 245 -26, 6, 11, 10, 12, 23, 12, 23, 5, 24, 246 -13, 5, -19, -8, -38, -21, -20, -2, -6, 12, 247 -11, -5, -23, 11, -29, -9, 9, 0, 7, 6, 248 1, -7, -2, 7, -3, 3, -2, 6, 27, 3, 249 }, { 250 -4, -6, 0, -7, 8, 4, 0, 6, -9, 13, 251 -11, -7, -11, -15, -37, -4, -9, -5, 5, 11, 252 -5, -9, -22, -1, -27, -18, -4, -14, 5, 0, 253 12, -3, 4, 32, 14, 12, -17, 22, 17, 11, 254 }, { 255 -8, 12, 3, 21, 3, 14, -8, 5, 4, 28, 256 7, 32, -2, -8, -12, -34, -4, -12, 1, 6, 257 9, 4, -7, 17, 4, -13, 11, -1, 19, -4, 258 0, 39, -4, 7, -11, -21, -20, -16, -10, -11, 259 }, { 260 13, 0, -8, 3, 0, -4, -21, -11, -9, 16, 261 10, 18, 5, -16, -10, -16, 5, -15, 13, 5, 262 15, 1, -6, 4, 6, -23, -2, -16, 17, -12, 263 10, 44, 3, 33, 6, -12, -34, -1, -20, -3, 264 }, { 265 -18, 4, 17, 23, -4, 20, -4, 26, -3, 36, 266 0, 32, 2, 12, -29, -34, -16, -24, -10, -6, 267 0, -12, -8, 4, -8, -13, 0, -6, 16, -12, 268 5, 13, 3, 7, 13, 3, -8, -2, 14, 0, 269 }, { 270 3, -7, 5, 5, -8, 2, -17, 9, -18, 24, 271 2, 19, 10, 4, -28, -17, -5, -28, 2, -7, 272 4, -15, -7, -8, -6, -23, -13, -21, 14, -20, 273 17, 18, 11, 33, 30, 11, -23, 13, 5, 9, 274 }, { 275 60, 10, 7, -1, 9, -8, 6, -13, 2, -15, 276 -1, -10, -13, -11, 15, 0, 6, 9, -1, 0, 277 -13, 1, -11, -3, -13, 21, 13, 26, -7, 31, 278 -10, -7, -16, -33, -31, -10, 22, -8, 1, -2, 279 }, { 280 82, -1, -4, -19, 6, -27, -6, -29, -12, -26, 281 1, -24, -5, -18, 17, 17, 17, 6, 10, 0, 282 -7, -2, -9, -16, -12, 11, 0, 11, -9, 23, 283 0, -3, -8, -8, -13, -1, 8, 7, -7, 6, 284 }, { 285 49, 2, 21, 0, 1, -2, 9, 8, -6, -6, 286 -8, -10, -8, 9, -2, 0, -4, -2, -13, -12, 287 -23, -15, -12, -16, -26, 21, 2, 21, -11, 23, 288 -4, -33, -7, -33, -6, 13, 34, 5, 27, 10, 289 }, { 290 71, -10, 9, -17, -1, -20, -3, -8, -21, -18, 291 -6, -24, 0, 1, 0, 16, 6, -5, 0, -13, 292 -17, -19, -11, -29, -25, 11, -11, 6, -13, 15, 293 7, -29, 0, -8, 11, 22, 20, 21, 17, 18, 294 }, { 295 67, 8, 14, 11, -7, -11, -11, -9, -7, -3, 296 13, 16, 8, 9, 24, -12, 10, -13, -5, -17, 297 -2, -4, 3, -10, 6, 17, 4, 19, 0, 11, 298 -6, 13, -9, -33, -14, -10, 16, -17, -10, -4, 299 }, { 300 90, -3, 2, -6, -10, -29, -24, -26, -21, -15, 301 15, 2, 16, 1, 25, 4, 21, -16, 6, -18, 302 3, -8, 5, -24, 8, 7, -9, 4, -1, 3, 303 5, 18, -1, -7, 2, -1, 2, -1, -19, 3, 304 }, { 305 57, 0, 27, 13, -14, -5, -7, 11, -15, 4, 306 5, 16, 13, 29, 6, -13, 0, -25, -16, -31, 307 -12, -22, 2, -23, -6, 16, -7, 14, -2, 3, 308 0, -12, 0, -33, 9, 13, 28, -3, 14, 7, 309 }, { 310 79, -11, 15, -4, -18, -23, -20, -5, -30, -7, 311 7, 2, 21, 21, 8, 3, 10, -28, -4, -31, 312 -6, -25, 3, -37, -4, 7, -20, 0, -4, -4, 313 11, -7, 6, -8, 27, 22, 14, 12, 5, 16, 314 }, { 315 47, 30, 15, 14, 14, 9, 9, -23, 13, -10, 316 -12, -7, -16, -15, -3, -3, -1, 14, 9, 12, 317 9, 8, 0, 10, -14, 4, -9, 2, -5, 8, 318 -13, -3, -18, -10, -45, -3, 16, -4, 4, 0, 319 }, { 320 69, 17, 3, -3, 10, -8, -3, -40, -1, -21, 321 -10, -21, -8, -23, -1, 13, 8, 11, 21, 11, 322 15, 4, 0, -2, -13, -5, -23, -12, -7, 0, 323 -1, 0, -10, 14, -28, 5, 1, 11, -5, 7, 324 }, { 325 36, 21, 28, 16, 6, 16, 12, -2, 4, -2, 326 -20, -7, -11, 4, -20, -4, -12, 2, -1, 0, 327 0, -8, -2, -2, -27, 4, -21, -2, -9, 0, 328 -6, -29, -9, -10, -21, 21, 28, 10, 29, 11, 329 }, { 330 58, 9, 16, -1, 2, -2, 0, -19, -10, -13, 331 -17, -21, -3, -3, -19, 12, -2, 0, 10, -1, 332 5, -12, 0, -15, -26, -5, -34, -16, -11, -7, 333 4, -25, -2, 14, -3, 29, 13, 25, 20, 20, 334 }, { 335 55, 28, 21, 27, -2, 7, -8, -20, 4, 1, 336 1, 18, 5, 4, 5, -16, 2, -8, 5, -5, 337 19, 2, 14, 3, 6, 0, -18, -4, 2, -11, 338 -8, 18, -11, -10, -29, -3, 10, -13, -8, -3, 339 }, { 340 77, 16, 9, 9, -6, -11, -21, -37, -10, -10, 341 4, 5, 13, -3, 7, 0, 13, -11, 17, -6, 342 25, -1, 15, -9, 7, -9, -32, -19, 0, -18, 343 2, 22, -3, 15, -12, 5, -4, 2, -17, 5, 344 }, { 345 44, 20, 34, 29, -10, 13, -4, 0, -4, 9, 346 -5, 19, 10, 24, -11, -17, -8, -20, -5, -19, 347 9, -14, 12, -9, -6, 0, -30, -9, 0, -19, 348 -2, -7, -2, -10, -5, 20, 21, 1, 17, 9, 349 }, { 350 66, 8, 23, 11, -14, -5, -17, -16, -19, -2, 351 -3, 5, 18, 17, -10, 0, 1, -23, 6, -20, 352 15, -18, 14, -22, -5, -10, -44, -23, -2, -26, 353 9, -3, 4, 14, 12, 29, 7, 16, 7, 18, 354 }, { 355 18, 9, -17, -4, 11, 3, 0, 11, 7, 4, 356 10, 3, 10, -18, 24, -3, 14, 7, 4, 10, 357 -16, 1, -27, -4, -27, 17, 12, 30, 0, 35, 358 -9, -3, -12, -36, -35, -30, -2, -13, 2, -11, 359 }, { 360 40, -2, -29, -22, 7, -14, -12, -5, -7, -7, 361 12, -9, 18, -26, 26, 14, 24, 4, 16, 9, 362 -10, -2, -26, -18, -26, 7, -1, 15, -1, 27, 363 2, 0, -4, -11, -17, -21, -16, 1, -7, -3, 364 }, { 365 8, 1, -3, -2, 3, 10, 3, 32, -1, 12, 366 2, 4, 15, 1, 7, -3, 2, -4, -6, -3, 367 -26, -15, -29, -17, -40, 17, 0, 26, -2, 27, 368 -2, -29, -4, -36, -10, -6, 9, 0, 27, 0, 369 }, { 370 30, -11, -15, -20, 0, -8, -9, 15, -15, 0, 371 5, -9, 23, -6, 8, 13, 13, -7, 5, -3, 372 -20, -19, -27, -31, -39, 7, -13, 11, -4, 19, 373 8, -25, 3, -11, 7, 2, -4, 16, 18, 9, 374 }, { 375 26, 7, -11, 8, -5, 1, -17, 14, -1, 15, 376 24, 30, 32, 1, 33, -16, 18, -14, 0, -8, 377 -6, -4, -12, -12, -6, 13, 2, 23, 8, 15, 378 -4, 17, -5, -36, -18, -30, -8, -22, -10, -14, 379 }, { 380 48, -4, -23, -9, -9, -17, -30, -2, -16, 3, 381 26, 16, 40, -6, 35, 1, 28, -17, 12, -9, 382 0, -8, -11, -25, -5, 3, -10, 8, 6, 7, 383 6, 22, 1, -11, -1, -21, -22, -7, -19, -5, 384 }, { 385 15, 0, 2, 10, -13, 7, -14, 35, -10, 23, 386 16, 31, 37, 21, 16, -17, 6, -26, -10, -21, 387 -16, -21, -13, -25, -19, 13, -8, 19, 5, 7, 388 1, -8, 2, -36, 5, -6, 3, -8, 15, -1, 389 }, { 390 37, -12, -9, -7, -17, -11, -26, 18, -25, 12, 391 19, 17, 45, 14, 17, 0, 17, -30, 1, -22, 392 -10, -25, -12, -38, -18, 3, -22, 4, 3, 0, 393 13, -3, 10, -11, 23, 2, -10, 7, 5, 7, 394 }, { 395 5, 29, -9, 11, 15, 22, 3, 0, 18, 8, 396 -1, 6, 7, -23, 6, -6, 5, 12, 15, 21, 397 5, 8, -17, 9, -28, 0, -11, 6, 2, 12, 398 -11, 0, -14, -13, -49, -22, -8, -9, 4, -9, 399 }, { 400 27, 16, -21, -6, 12, 3, -9, -16, 3, -2, 401 1, -7, 15, -31, 7, 10, 16, 9, 27, 21, 402 11, 5, -16, -3, -26, -9, -24, -7, 0, 4, 403 0, 4, -6, 11, -32, -14, -23, 6, -5, -1, 404 }, { 405 -4, 20, 3, 13, 8, 28, 6, 21, 10, 16, 406 -8, 7, 12, -3, -11, -7, -5, 0, 4, 8, 407 -4, -8, -18, -3, -41, 0, -22, 2, 0, 4, 408 -5, -25, -6, -14, -25, 1, 2, 4, 29, 2, 409 }, { 410 17, 8, -8, -4, 4, 10, -6, 5, -4, 5, 411 -6, -6, 20, -10, -9, 9, 4, -2, 16, 7, 412 1, -12, -17, -16, -39, -9, -36, -12, -2, -3, 413 6, -21, 1, 11, -7, 10, -11, 20, 20, 11, 414 }, { 415 13, 27, -3, 24, -1, 19, -14, 3, 9, 20, 416 12, 33, 29, -3, 15, -20, 9, -9, 11, 3, 417 16, 2, -2, 2, -7, -3, -20, 0, 10, -7, 418 -7, 22, -7, -13, -33, -23, -14, -18, -7, -12, 419 }, { 420 35, 15, -15, 6, -4, 1, -27, -12, -5, 8, 421 15, 19, 37, -11, 16, -2, 20, -12, 23, 2, 422 22, -1, -1, -11, -5, -13, -34, -14, 8, -14, 423 4, 26, 0, 11, -16, -14, -29, -2, -17, -3, 424 }, { 425 3, 19, 9, 26, -8, 26, -10, 24, 0, 28, 426 5, 33, 34, 17, -2, -20, -1, -22, 0, -10, 427 6, -14, -3, -10, -20, -4, -32, -4, 7, -15, 428 0, -3, 0, -13, -9, 0, -3, -4, 17, 0, 429 }, { 430 25, 7, -2, 8, -12, 7, -23, 8, -13, 16, 431 7, 20, 42, 9, 0, -3, 9, -25, 12, -10, 432 12, -18, -2, -24, -19, -13, -46, -19, 5, -22, 433 10, 0, 8, 11, 8, 9, -17, 11, 7, 8, 434 }, { 435 -25, -7, 2, -8, 12, -7, 23, -8, 13, -16, 436 -7, -20, -42, -9, 0, 3, -9, 25, -12, 10, 437 -12, 18, 2, 24, 19, 13, 46, 19, -5, 22, 438 -10, 0, -8, -11, -8, -9, 17, -11, -7, -8, 439 }, { 440 -3, -19, -9, -26, 8, -26, 10, -24, 0, -28, 441 -5, -33, -34, -17, 2, 20, 1, 22, 0, 10, 442 -6, 14, 3, 10, 20, 4, 32, 4, -7, 15, 443 0, 3, 0, 13, 9, 0, 3, 4, -17, 0, 444 }, { 445 -35, -15, 15, -6, 4, -1, 27, 12, 5, -8, 446 -15, -19, -37, 11, -16, 2, -20, 12, -23, -2, 447 -22, 1, 1, 11, 5, 13, 34, 14, -8, 14, 448 -4, -26, 0, -11, 16, 14, 29, 2, 17, 3, 449 }, { 450 -13, -27, 3, -24, 1, -19, 14, -3, -9, -20, 451 -12, -33, -29, 3, -15, 20, -9, 9, -11, -3, 452 -16, -2, 2, -2, 7, 3, 20, 0, -10, 7, 453 7, -22, 7, 13, 33, 23, 14, 18, 7, 12, 454 }, { 455 -17, -8, 8, 4, -4, -10, 6, -5, 4, -5, 456 6, 6, -20, 10, 9, -9, -4, 2, -16, -7, 457 -1, 12, 17, 16, 39, 9, 36, 12, 2, 3, 458 -6, 21, -1, -11, 7, -10, 11, -20, -20, -11, 459 }, { 460 4, -20, -3, -13, -8, -28, -6, -21, -10, -16, 461 8, -7, -12, 3, 11, 7, 5, 0, -4, -8, 462 4, 8, 18, 3, 41, 0, 22, -2, 0, -4, 463 5, 25, 6, 14, 25, -1, -2, -4, -29, -2, 464 }, { 465 -27, -16, 21, 6, -12, -3, 9, 16, -3, 2, 466 -1, 7, -15, 31, -7, -10, -16, -9, -27, -21, 467 -11, -5, 16, 3, 26, 9, 24, 7, 0, -4, 468 0, -4, 6, -11, 32, 14, 23, -6, 5, 1, 469 }, { 470 -5, -29, 9, -11, -15, -22, -3, 0, -18, -8, 471 1, -6, -7, 23, -6, 6, -5, -12, -15, -21, 472 -5, -8, 17, -9, 28, 0, 11, -6, -2, -12, 473 11, 0, 14, 13, 49, 22, 8, 9, -4, 9, 474 }, { 475 -37, 12, 9, 7, 17, 11, 26, -18, 25, -12, 476 -19, -17, -45, -14, -17, 0, -17, 30, -1, 22, 477 10, 25, 12, 38, 18, -3, 22, -4, -3, 0, 478 -13, 3, -10, 11, -23, -2, 10, -7, -5, -7, 479 }, { 480 -15, 0, -2, -10, 13, -7, 14, -35, 10, -23, 481 -16, -31, -37, -21, -16, 17, -6, 26, 10, 21, 482 16, 21, 13, 25, 19, -13, 8, -19, -5, -7, 483 -1, 8, -2, 36, -5, 6, -3, 8, -15, 1, 484 }, { 485 -48, 4, 23, 9, 9, 17, 30, 2, 16, -3, 486 -26, -16, -40, 6, -35, -1, -28, 17, -12, 9, 487 0, 8, 11, 25, 5, -3, 10, -8, -6, -7, 488 -6, -22, -1, 11, 1, 21, 22, 7, 19, 5, 489 }, { 490 -26, -7, 11, -8, 5, -1, 17, -14, 1, -15, 491 -24, -30, -32, -1, -33, 16, -18, 14, 0, 8, 492 6, 4, 12, 12, 6, -13, -2, -23, -8, -15, 493 4, -17, 5, 36, 18, 30, 8, 22, 10, 14, 494 }, { 495 -30, 11, 15, 20, 0, 8, 9, -15, 15, 0, 496 -5, 9, -23, 6, -8, -13, -13, 7, -5, 3, 497 20, 19, 27, 31, 39, -7, 13, -11, 4, -19, 498 -8, 25, -3, 11, -7, -2, 4, -16, -18, -9, 499 }, { 500 -8, -1, 3, 2, -3, -10, -3, -32, 1, -12, 501 -2, -4, -15, -1, -7, 3, -2, 4, 6, 3, 502 26, 15, 29, 17, 40, -17, 0, -26, 2, -27, 503 2, 29, 4, 36, 10, 6, -9, 0, -27, 0, 504 }, { 505 -40, 2, 29, 22, -7, 14, 12, 5, 7, 7, 506 -12, 9, -18, 26, -26, -14, -24, -4, -16, -9, 507 10, 2, 26, 18, 26, -7, 1, -15, 1, -27, 508 -2, 0, 4, 11, 17, 21, 16, -1, 7, 3, 509 }, { 510 -18, -9, 17, 4, -11, -3, 0, -11, -7, -4, 511 -10, -3, -10, 18, -24, 3, -14, -7, -4, -10, 512 16, -1, 27, 4, 27, -17, -12, -30, 0, -35, 513 9, 3, 12, 36, 35, 30, 2, 13, -2, 11, 514 }, { 515 -66, -8, -23, -11, 14, 5, 17, 16, 19, 2, 516 3, -5, -18, -17, 10, 0, -1, 23, -6, 20, 517 -15, 18, -14, 22, 5, 10, 44, 23, 2, 26, 518 -9, 3, -4, -14, -12, -29, -7, -16, -7, -18, 519 }, { 520 -44, -20, -34, -29, 10, -13, 4, 0, 4, -9, 521 5, -19, -10, -24, 11, 17, 8, 20, 5, 19, 522 -9, 14, -12, 9, 6, 0, 30, 9, 0, 19, 523 2, 7, 2, 10, 5, -20, -21, -1, -17, -9, 524 }, { 525 -77, -16, -9, -9, 6, 11, 21, 37, 10, 10, 526 -4, -5, -13, 3, -7, 0, -13, 11, -17, 6, 527 -25, 1, -15, 9, -7, 9, 32, 19, 0, 18, 528 -2, -22, 3, -15, 12, -5, 4, -2, 17, -5, 529 }, { 530 -55, -28, -21, -27, 2, -7, 8, 20, -4, -1, 531 -1, -18, -5, -4, -5, 16, -2, 8, -5, 5, 532 -19, -2, -14, -3, -6, 0, 18, 4, -2, 11, 533 8, -18, 11, 10, 29, 3, -10, 13, 8, 3, 534 }, { 535 -58, -9, -16, 1, -2, 2, 0, 19, 10, 13, 536 17, 21, 3, 3, 19, -12, 2, 0, -10, 1, 537 -5, 12, 0, 15, 26, 5, 34, 16, 11, 7, 538 -4, 25, 2, -14, 3, -29, -13, -25, -20, -20, 539 }, { 540 -36, -21, -28, -16, -6, -16, -12, 2, -4, 2, 541 20, 7, 11, -4, 20, 4, 12, -2, 1, 0, 542 0, 8, 2, 2, 27, -4, 21, 2, 9, 0, 543 6, 29, 9, 10, 21, -21, -28, -10, -29, -11, 544 }, { 545 -69, -17, -3, 3, -10, 8, 3, 40, 1, 21, 546 10, 21, 8, 23, 1, -13, -8, -11, -21, -11, 547 -15, -4, 0, 2, 13, 5, 23, 12, 7, 0, 548 1, 0, 10, -14, 28, -5, -1, -11, 5, -7, 549 }, { 550 -47, -30, -15, -14, -14, -9, -9, 23, -13, 10, 551 12, 7, 16, 15, 3, 3, 1, -14, -9, -12, 552 -9, -8, 0, -10, 14, -4, 9, -2, 5, -8, 553 13, 3, 18, 10, 45, 3, -16, 4, -4, 0, 554 }, { 555 -79, 11, -15, 4, 18, 23, 20, 5, 30, 7, 556 -7, -2, -21, -21, -8, -3, -10, 28, 4, 31, 557 6, 25, -3, 37, 4, -7, 20, 0, 4, 4, 558 -11, 7, -6, 8, -27, -22, -14, -12, -5, -16, 559 }, { 560 -57, 0, -27, -13, 14, 5, 7, -11, 15, -4, 561 -5, -16, -13, -29, -6, 13, 0, 25, 16, 31, 562 12, 22, -2, 23, 6, -16, 7, -14, 2, -3, 563 0, 12, 0, 33, -9, -13, -28, 3, -14, -7, 564 }, { 565 -90, 3, -2, 6, 10, 29, 24, 26, 21, 15, 566 -15, -2, -16, -1, -25, -4, -21, 16, -6, 18, 567 -3, 8, -5, 24, -8, -7, 9, -4, 1, -3, 568 -5, -18, 1, 7, -2, 1, -2, 1, 19, -3, 569 }, { 570 -67, -8, -14, -11, 7, 11, 11, 9, 7, 3, 571 -13, -16, -8, -9, -24, 12, -10, 13, 5, 17, 572 2, 4, -3, 10, -6, -17, -4, -19, 0, -11, 573 6, -13, 9, 33, 14, 10, -16, 17, 10, 4, 574 }, { 575 -71, 10, -9, 17, 1, 20, 3, 8, 21, 18, 576 6, 24, 0, -1, 0, -16, -6, 5, 0, 13, 577 17, 19, 11, 29, 25, -11, 11, -6, 13, -15, 578 -7, 29, 0, 8, -11, -22, -20, -21, -17, -18, 579 }, { 580 -49, -2, -21, 0, -1, 2, -9, -8, 6, 6, 581 8, 10, 8, -9, 2, 0, 4, 2, 13, 12, 582 23, 15, 12, 16, 26, -21, -2, -21, 11, -23, 583 4, 33, 7, 33, 6, -13, -34, -5, -27, -10, 584 }, { 585 -82, 1, 4, 19, -6, 27, 6, 29, 12, 26, 586 -1, 24, 5, 18, -17, -17, -17, -6, -10, 0, 587 7, 2, 9, 16, 12, -11, 0, -11, 9, -23, 588 0, 3, 8, 8, 13, 1, -8, -7, 7, -6, 589 }, { 590 -60, -10, -7, 1, -9, 8, -6, 13, -2, 15, 591 1, 10, 13, 11, -15, 0, -6, -9, 1, 0, 592 13, -1, 11, 3, 13, -21, -13, -26, 7, -31, 593 10, 7, 16, 33, 31, 10, -22, 8, -1, 2, 594 }, { 595 -3, 7, -5, -5, 8, -2, 17, -9, 18, -24, 596 -2, -19, -10, -4, 28, 17, 5, 28, -2, 7, 597 -4, 15, 7, 8, 6, 23, 13, 21, -14, 20, 598 -17, -18, -11, -33, -30, -11, 23, -13, -5, -9, 599 }, { 600 18, -4, -17, -23, 4, -20, 4, -26, 3, -36, 601 0, -32, -2, -12, 29, 34, 16, 24, 10, 6, 602 0, 12, 8, -4, 8, 13, 0, 6, -16, 12, 603 -5, -13, -3, -7, -13, -3, 8, 2, -14, 0, 604 }, { 605 -13, 0, 8, -3, 0, 4, 21, 11, 9, -16, 606 -10, -18, -5, 16, 10, 16, -5, 15, -13, -5, 607 -15, -1, 6, -4, -6, 23, 2, 16, -17, 12, 608 -10, -44, -3, -33, -6, 12, 34, 1, 20, 3, 609 }, { 610 8, -12, -3, -21, -3, -14, 8, -5, -4, -28, 611 -7, -32, 2, 8, 12, 34, 4, 12, -1, -6, 612 -9, -4, 7, -17, -4, 13, -11, 1, -19, 4, 613 0, -39, 4, -7, 11, 21, 20, 16, 10, 11, 614 }, { 615 4, 6, 0, 7, -8, -4, 0, -6, 9, -13, 616 11, 7, 11, 15, 37, 4, 9, 5, -5, -11, 617 5, 9, 22, 1, 27, 18, 4, 14, -5, 0, 618 -12, 3, -4, -32, -14, -12, 17, -22, -17, -11, 619 }, { 620 26, -6, -11, -10, -12, -23, -12, -23, -5, -24, 621 13, -5, 19, 8, 38, 21, 20, 2, 6, -12, 622 11, 5, 23, -11, 29, 9, -9, 0, -7, -6, 623 -1, 7, 2, -7, 3, -3, 2, -6, -27, -3, 624 }, { 625 -6, -2, 14, 9, -16, 1, 3, 14, 0, -5, 626 3, 8, 16, 36, 19, 3, -1, -6, -17, -24, 627 -4, -7, 21, -11, 14, 18, -7, 9, -9, -7, 628 -6, -22, 3, -33, 10, 11, 28, -7, 7, 0, 629 }, { 630 16, -14, 2, -8, -20, -17, -9, -2, -14, -16, 631 6, -5, 24, 28, 21, 20, 8, -9, -4, -25, 632 1, -11, 22, -24, 15, 8, -21, -5, -11, -14, 633 5, -18, 11, -7, 27, 20, 14, 7, -1, 9, 634 }, { 635 -16, 27, 2, 10, 13, 16, 20, -20, 29, -20, 636 -14, -16, -13, -8, 9, 13, -2, 33, 9, 19, 637 17, 23, 17, 22, 6, 6, -9, -2, -12, -2, 638 -20, -13, -13, -10, -45, -4, 16, -8, -2, -7, 639 }, { 640 5, 15, -9, -7, 9, -2, 8, -37, 14, -31, 641 -11, -29, -5, -16, 11, 30, 7, 29, 21, 18, 642 23, 19, 18, 9, 7, -3, -23, -17, -14, -9, 643 -8, -9, -6, 15, -27, 4, 2, 6, -12, 1, 644 }, { 645 -26, 19, 15, 12, 5, 22, 24, 0, 21, -12, 646 -21, -15, -8, 11, -7, 12, -14, 20, -2, 6, 647 7, 6, 16, 9, -6, 5, -21, -7, -15, -10, 648 -13, -39, -5, -10, -20, 19, 28, 5, 22, 5, 649 }, { 650 -4, 6, 3, -5, 1, 4, 11, -16, 6, -23, 651 -19, -29, 0, 3, -6, 30, -3, 17, 10, 5, 652 13, 2, 17, -3, -5, -3, -35, -21, -17, -17, 653 -2, -35, 2, 15, -3, 28, 13, 21, 13, 13, 654 }, { 655 -8, 25, 8, 23, -3, 13, 3, -17, 20, -8, 656 0, 10, 8, 11, 18, 0, 1, 10, 5, 0, 657 28, 17, 32, 15, 26, 1, -19, -9, -3, -21, 658 -15, 7, -6, -9, -29, -5, 10, -17, -15, -9, 659 }, { 660 13, 13, -3, 5, -7, -4, -9, -34, 5, -20, 661 2, -3, 16, 3, 20, 17, 11, 7, 17, 0, 662 34, 13, 33, 2, 28, -8, -32, -24, -5, -29, 663 -3, 12, 0, 15, -11, 3, -3, -2, -24, -1, 664 }, { 665 -18, 17, 21, 25, -11, 19, 6, 3, 11, 0, 666 -7, 11, 13, 31, 1, 0, -9, -1, -5, -12, 667 18, 0, 31, 2, 13, 1, -30, -14, -7, -29, 668 -9, -18, 1, -10, -4, 18, 22, -3, 10, 2, 669 }, { 670 3, 5, 9, 7, -15, 1, -5, -13, -2, -12, 671 -5, -2, 21, 23, 2, 16, 0, -5, 6, -13, 672 23, -3, 32, -10, 15, -8, -44, -28, -9, -37, 673 2, -13, 9, 15, 12, 27, 7, 12, 0, 11, 674 }, { 675 -44, 6, -30, -8, 9, 10, 11, 14, 23, -5, 676 8, -4, 14, -12, 37, 14, 12, 26, 4, 16, 677 -8, 16, -9, 7, -6, 19, 12, 25, -5, 24, 678 -15, -13, -8, -36, -34, -31, -1, -18, -4, -18, 679 }, { 680 -22, -5, -42, -26, 6, -8, -1, -2, 9, -17, 681 10, -18, 21, -19, 39, 31, 23, 23, 16, 15, 682 -2, 12, -7, -6, -5, 9, -1, 10, -7, 16, 683 -4, -9, 0, -10, -17, -22, -16, -2, -14, -9, 684 }, { 685 -55, -1, -17, -6, 1, 16, 15, 35, 15, 2, 686 0, -4, 19, 8, 20, 13, 1, 14, -7, 3, 687 -18, 0, -10, -5, -19, 19, 0, 21, -8, 16, 688 -9, -39, 0, -36, -10, -7, 9, -4, 20, -5, 689 }, { 690 -33, -13, -29, -24, -1, -1, 2, 18, 0, -9, 691 3, -17, 27, 0, 21, 30, 12, 11, 5, 2, 692 -12, -4, -9, -19, -18, 9, -13, 6, -11, 8, 693 2, -35, 8, -10, 7, 1, -4, 11, 10, 2, 694 }, { 695 -36, 5, -24, 4, -7, 7, -6, 17, 14, 5, 696 22, 22, 35, 8, 46, 1, 17, 3, 0, -2, 697 2, 10, 5, 0, 14, 15, 2, 18, 2, 4, 698 -11, 7, -1, -36, -18, -32, -7, -27, -17, -20, 699 }, { 700 -14, -7, -36, -13, -10, -10, -18, 0, 0, -5, 701 25, 8, 43, 0, 48, 18, 27, 0, 12, -3, 702 7, 6, 7, -13, 15, 5, -11, 3, 0, -2, 703 0, 12, 6, -10, 0, -23, -22, -11, -26, -12, 704 }, { 705 -47, -3, -11, 6, -15, 13, -2, 38, 6, 13, 706 15, 22, 40, 28, 28, 0, 5, -8, -10, -15, 707 -7, -7, 4, -13, 1, 14, -9, 14, 0, -2, 708 -4, -18, 7, -36, 6, -8, 3, -13, 7, -8, 709 }, { 710 -25, -15, -22, -11, -18, -4, -15, 22, -8, 2, 711 17, 9, 48, 20, 30, 17, 16, -11, 1, -16, 712 -2, -10, 5, -26, 2, 4, -22, 0, -2, -10, 713 6, -13, 14, -10, 23, 0, -10, 2, -1, 0, 714 }, { 715 -57, 26, -22, 7, 14, 28, 14, 3, 35, 0, 716 -3, -1, 11, -16, 18, 10, 4, 31, 15, 28, 717 14, 23, 1, 21, -7, 2, -11, 1, -3, 1, 718 -18, -9, -10, -13, -49, -24, -8, -14, -2, -16, 719 }, { 720 -35, 14, -34, -10, 10, 10, 1, -12, 20, -12, 721 0, -15, 18, -24, 20, 27, 14, 28, 27, 27, 722 20, 19, 2, 8, -5, -7, -25, -13, -5, -5, 723 -6, -5, -2, 12, -31, -15, -23, 1, -12, -8, 724 }, { 725 -68, 18, -9, 9, 6, 35, 18, 25, 26, 7, 726 -10, -1, 16, 3, 1, 9, -6, 19, 4, 15, 727 4, 6, 0, 8, -20, 2, -23, -2, -7, -5, 728 -12, -35, -1, -13, -24, 0, 3, 0, 22, -4, 729 }, { 730 -46, 6, -21, -8, 2, 16, 5, 8, 11, -4, 731 -8, -15, 24, -4, 2, 26, 3, 16, 16, 14, 732 9, 2, 1, -4, -19, -7, -36, -17, -9, -13, 733 0, -31, 5, 12, -7, 8, -11, 15, 13, 4, 734 }, { 735 -49, 24, -16, 20, -2, 26, -2, 7, 25, 10, 736 11, 25, 32, 3, 27, -2, 8, 8, 11, 9, 737 24, 17, 16, 14, 13, -2, -20, -5, 4, -17, 738 -14, 12, -3, -13, -33, -25, -14, -23, -15, -19, 739 }, { 740 -27, 12, -28, 2, -6, 7, -15, -9, 11, -1, 741 13, 11, 40, -4, 29, 14, 19, 5, 23, 8, 742 30, 13, 17, 0, 14, -12, -34, -20, 2, -25, 743 -2, 16, 4, 12, -15, -16, -29, -7, -24, -10, 744 }, { 745 -60, 16, -3, 22, -10, 32, 0, 28, 17, 18, 746 3, 25, 37, 23, 10, -3, -2, -3, 0, -3, 747 14, 0, 14, 1, 0, -2, -32, -9, 1, -25, 748 -7, -13, 5, -13, -8, -1, -2, -8, 10, -6, 749 }, { 750 -38, 4, -15, 4, -14, 13, -12, 11, 2, 6, 751 6, 11, 45, 16, 11, 13, 7, -6, 12, -4, 752 20, -3, 16, -12, 1, -12, -46, -24, 0, -33, 753 3, -9, 12, 12, 8, 7, -17, 6, 0, 2 754 } 755}; 756 757const int8_t ff_cb2_vects[128][40]={ 758 { 759 73, -32, -60, -15, -26, 59, 2, -33, 30, -10, 760 -3, -17, 8, 30, -1, -26, -4, -22, 10, 16, 761 -36, -5, -11, 56, 37, 6, -10, -5, -13, -3, 762 6, -5, 11, 4, -19, -5, -16, 41, 24, 13, 763 }, { 764 4, -11, -37, 23, -5, 46, -2, -29, -5, -39, 765 -21, -9, 0, 49, 12, -9, -16, -26, 22, 15, 766 -45, -20, -5, 40, 22, 17, -26, 31, -14, 2, 767 -14, 10, 30, 20, -27, -9, -39, 39, 18, 5, 768 }, { 769 34, -25, -48, -28, -11, 34, -2, -41, 9, -7, 770 -17, 21, 20, 24, -17, -33, 0, -24, 10, 42, 771 3, -5, 10, 42, 11, 8, -3, 3, 16, 9, 772 22, -2, 0, -33, -10, 18, 7, 58, 10, 28, 773 }, { 774 -34, -4, -25, 10, 9, 21, -7, -36, -26, -36, 775 -35, 28, 12, 42, -3, -16, -12, -28, 21, 42, 776 -5, -21, 16, 26, -4, 19, -19, 39, 15, 15, 777 1, 13, 19, -17, -17, 14, -15, 55, 4, 19, 778 }, { 779 28, -20, -51, -14, -6, 7, 0, -26, 27, -4, 780 18, -40, -6, 16, -1, -15, 0, -55, -5, -16, 781 -19, 14, -3, 49, 14, 1, -22, -30, -12, 0, 782 24, 15, 9, -17, -45, -29, 4, 28, 51, 35, 783 }, { 784 -40, 0, -28, 24, 14, -5, -4, -21, -7, -33, 785 0, -32, -15, 35, 12, 1, -11, -58, 5, -16, 786 -28, 0, 1, 33, 0, 11, -39, 5, -14, 6, 787 3, 31, 28, -1, -53, -33, -19, 25, 46, 26, 788 }, { 789 -11, -14, -39, -27, 9, -17, -4, -33, 6, 0, 790 4, -1, 5, 10, -17, -22, 5, -57, -5, 9, 791 20, 13, 18, 35, -11, 3, -16, -22, 17, 13, 792 40, 19, -1, -55, -35, -5, 27, 44, 37, 49, 793 }, { 794 -80, 6, -16, 11, 30, -30, -9, -28, -28, -29, 795 -13, 6, -2, 28, -3, -5, -7, -60, 5, 9, 796 11, -1, 24, 19, -27, 13, -32, 13, 15, 19, 797 19, 35, 17, -39, -43, -9, 4, 42, 32, 41, 798 }, { 799 78, -21, -43, 4, -38, 17, 17, -5, 55, 24, 800 -15, -36, 14, 4, 24, -24, 12, 5, 17, 31, 801 -54, -5, -2, 27, 43, -12, 2, 9, -9, -15, 802 22, -3, 28, 21, -20, 3, 20, 28, 9, -5, 803 }, { 804 9, -1, -20, 43, -17, 3, 12, 0, 20, -4, 805 -33, -29, 6, 22, 38, -7, 0, 1, 29, 30, 806 -63, -21, 3, 11, 27, -1, -14, 45, -10, -9, 807 1, 12, 47, 37, -28, 0, -2, 26, 4, -13, 808 }, { 809 39, -14, -30, -8, -22, -8, 12, -12, 34, 27, 810 -29, 2, 26, -2, 8, -31, 16, 3, 17, 57, 811 -14, -6, 19, 13, 16, -10, 8, 17, 20, -2, 812 38, 0, 17, -16, -11, 27, 44, 45, -4, 8, 813 }, { 814 -29, 5, -7, 30, -1, -21, 7, -7, 0, 0, 815 -47, 9, 18, 15, 22, -14, 4, 0, 28, 57, 816 -23, -21, 25, -2, 1, 0, -7, 53, 19, 3, 817 17, 15, 36, 0, -19, 24, 21, 43, -9, 0, 818 }, { 819 33, -10, -34, 5, -17, -35, 15, 1, 53, 30, 820 6, -59, 0, -10, 24, -13, 17, -27, 1, -1, 821 -37, 13, 4, 20, 20, -18, -10, -16, -8, -11, 822 39, 18, 26, 0, -46, -20, 41, 15, 37, 15, 823 }, { 824 -35, 10, -11, 44, 3, -48, 10, 6, 17, 2, 825 -11, -51, -8, 8, 38, 3, 4, -31, 12, -2, 826 -46, -1, 10, 4, 5, -7, -26, 19, -10, -5, 827 18, 34, 45, 15, -54, -24, 18, 13, 31, 7, 828 }, { 829 -5, -3, -21, -7, -2, -60, 10, -5, 32, 34, 830 -7, -20, 11, -16, 8, -20, 21, -29, 1, 24, 831 2, 13, 27, 6, -5, -15, -3, -8, 21, 1, 832 55, 21, 15, -38, -37, 3, 65, 32, 23, 30, 833 }, { 834 -74, 17, 0, 31, 18, -73, 5, 0, -3, 5, 835 -25, -12, 3, 1, 22, -3, 9, -33, 12, 24, 836 -6, -2, 33, -9, -21, -5, -20, 27, 19, 7, 837 34, 37, 34, -22, -44, 0, 41, 29, 17, 21, 838 }, { 839 76, -35, -31, -28, -49, 43, -40, 0, 29, -14, 840 8, 5, 10, 18, -26, -46, 0, 7, 6, 3, 841 -25, -7, -2, 40, 28, 14, 18, -3, -27, -28, 842 -8, -45, -13, 34, -13, -27, -15, 31, 12, 3, 843 }, { 844 7, -15, -9, 9, -28, 29, -45, 5, -6, -43, 845 -9, 12, 2, 36, -12, -30, -11, 3, 17, 3, 846 -34, -22, 3, 24, 12, 24, 2, 32, -28, -22, 847 -29, -29, 5, 50, -21, -31, -38, 29, 7, -5, 848 }, { 849 36, -29, -19, -41, -34, 18, -45, -6, 8, -10, 850 -5, 43, 23, 11, -42, -53, 5, 5, 6, 30, 851 14, -8, 20, 26, 1, 16, 25, 4, 3, -15, 852 7, -41, -23, -3, -4, -3, 8, 48, -1, 17, 853 }, { 854 -32, -8, 3, -2, -13, 4, -50, -1, -27, -39, 855 -23, 51, 15, 30, -27, -37, -7, 1, 17, 29, 856 5, -23, 25, 10, -14, 26, 8, 41, 1, -9, 857 -13, -26, -5, 12, -12, -7, -14, 45, -6, 9, 858 }, { 859 31, -24, -23, -27, -29, -9, -43, 8, 26, -7, 860 30, -17, -4, 3, -26, -35, 5, -24, -10, -28, 861 -9, 12, 5, 33, 5, 8, 5, -29, -26, -24, 862 9, -23, -14, 12, -39, -52, 5, 18, 39, 24, 863 }, { 864 -37, -3, 0, 10, -7, -22, -48, 12, -8, -36, 865 12, -9, -12, 22, -12, -19, -6, -28, 0, -29, 866 -18, -3, 11, 17, -10, 18, -10, 7, -27, -18, 867 -11, -7, 3, 28, -47, -55, -18, 15, 34, 16, 868 }, { 869 -8, -17, -10, -40, -13, -34, -47, 0, 5, -4, 870 16, 21, 8, -2, -42, -43, 10, -26, -10, -2, 871 31, 11, 27, 19, -21, 10, 12, -20, 3, -11, 872 25, -20, -25, -25, -29, -28, 28, 34, 25, 38, 873 }, { 874 -77, 2, 11, -1, 7, -47, -52, 5, -29, -33, 875 -1, 28, 0, 15, -28, -26, -2, -30, 0, -2, 876 22, -4, 33, 3, -36, 21, -3, 15, 2, -5, 877 4, -4, -6, -9, -37, -31, 5, 32, 20, 30, 878 }, { 879 81, -25, -14, -8, -61, 0, -25, 28, 54, 20, 880 -3, -14, 17, -8, 0, -44, 16, 35, 13, 18, 881 -43, -7, 6, 11, 33, -4, 30, 11, -22, -40, 882 6, -43, 3, 50, -14, -18, 22, 18, -1, -16, 883 }, { 884 12, -4, 8, 29, -39, -12, -30, 33, 19, -8, 885 -21, -6, 8, 9, 13, -28, 4, 31, 24, 18, 886 -52, -23, 12, -4, 18, 5, 14, 47, -24, -34, 887 -14, -27, 22, 66, -22, -22, -1, 16, -6, -24, 888 }, { 889 41, -18, -2, -21, -45, -24, -30, 21, 33, 24, 890 -17, 24, 29, -15, -16, -51, 21, 33, 13, 45, 891 -3, -8, 28, -2, 7, -2, 37, 19, 7, -27, 892 22, -39, -7, 12, -5, 5, 45, 35, -15, -1, 893 }, { 894 -27, 1, 20, 17, -24, -38, -35, 26, -1, -4, 895 -35, 32, 21, 3, -2, -35, 8, 29, 24, 44, 896 -12, -24, 34, -18, -8, 7, 21, 55, 5, -21, 897 2, -23, 11, 28, -13, 1, 22, 33, -21, -10, 898 }, { 899 36, -13, -5, -7, -40, -51, -28, 36, 52, 27, 900 18, -36, 2, -22, 0, -33, 21, 2, -3, -13, 901 -26, 11, 14, 4, 10, -10, 18, -14, -22, -36, 902 24, -21, 1, 28, -40, -42, 42, 5, 25, 5, 903 }, { 904 -32, 6, 17, 31, -19, -65, -33, 41, 16, -1, 905 0, -29, -6, -4, 13, -17, 9, -1, 8, -14, 906 -35, -3, 19, -11, -4, 0, 1, 21, -23, -30, 907 3, -5, 20, 44, -48, -46, 19, 3, 20, -3, 908 }, { 909 -3, -7, 6, -20, -25, -77, -32, 29, 31, 30, 910 4, 2, 14, -29, -16, -40, 26, 0, -3, 12, 911 13, 10, 36, -9, -15, -8, 24, -6, 7, -22, 912 40, -17, -8, -9, -31, -18, 66, 22, 11, 19, 913 }, { 914 -72, 13, 29, 18, -4, -90, -37, 34, -4, 1, 915 -13, 9, 6, -11, -2, -24, 13, -3, 7, 11, 916 4, -4, 42, -25, -31, 1, 8, 29, 6, -17, 917 19, -2, 10, 6, -38, -22, 42, 19, 6, 11, 918 }, { 919 116, -20, -68, -30, -28, 83, 28, -18, 32, -22, 920 -13, -21, 5, 28, 5, -7, -24, -8, -22, 17, 921 -23, 30, -25, 45, 15, -9, -11, -18, 22, -10, 922 4, -2, 19, -12, 23, 3, -43, 2, 12, -4, 923 }, { 924 47, 0, -45, 7, -7, 69, 23, -13, -2, -51, 925 -32, -14, -3, 47, 19, 8, -37, -11, -10, 16, 926 -32, 15, -19, 29, 0, 1, -28, 18, 20, -4, 927 -16, 13, 38, 3, 15, 0, -66, 0, 7, -13, 928 }, { 929 77, -13, -56, -43, -13, 57, 23, -26, 11, -19, 930 -27, 16, 17, 22, -10, -15, -19, -10, -22, 43, 931 16, 30, -2, 31, -11, -6, -5, -9, 52, 2, 932 20, 0, 8, -50, 33, 27, -19, 19, -1, 9, 933 }, { 934 8, 6, -33, -4, 7, 44, 18, -21, -23, -48, 935 -46, 24, 9, 40, 3, 1, -32, -13, -11, 43, 936 7, 14, 3, 15, -26, 3, -21, 26, 50, 8, 937 0, 16, 27, -34, 25, 23, -43, 17, -6, 1, 938 }, { 939 71, -9, -59, -29, -8, 30, 26, -11, 30, -16, 940 8, -44, -9, 14, 5, 2, -19, -40, -38, -15, 941 -7, 50, -17, 38, -7, -14, -24, -43, 22, -6, 942 22, 19, 17, -34, -2, -20, -23, -10, 39, 16, 943 }, { 944 2, 11, -36, 9, 13, 17, 21, -6, -5, -45, 945 -10, -36, -18, 33, 19, 19, -31, -44, -27, -15, 946 -16, 34, -11, 22, -22, -4, -40, -7, 21, 0, 947 1, 35, 36, -18, -10, -24, -46, -12, 34, 8, 948 }, { 949 32, -2, -47, -42, 7, 5, 21, -18, 9, -12, 950 -5, -5, 2, 8, -10, -4, -14, -42, -38, 10, 951 33, 49, 5, 24, -33, -12, -17, -35, 52, 6, 952 38, 22, 7, -72, 7, 3, 0, 6, 25, 30, 953 }, { 954 -36, 18, -24, -3, 28, -7, 16, -13, -26, -41, 955 -24, 1, -5, 26, 3, 12, -27, -46, -27, 10, 956 24, 34, 10, 8, -49, -2, -34, 0, 51, 12, 957 17, 38, 25, -56, 0, 0, -22, 3, 20, 22, 958 }, { 959 121, -9, -50, -10, -40, 40, 43, 9, 58, 12, 960 -25, -41, 11, 2, 31, -5, -8, 19, -15, 32, 961 -41, 30, -16, 16, 20, -28, 0, -3, 26, -22, 962 19, 0, 36, 4, 22, 12, -6, -9, -1, -24, 963 }, { 964 52, 10, -27, 27, -18, 26, 38, 14, 23, -16, 965 -44, -33, 3, 20, 45, 10, -20, 15, -3, 31, 966 -50, 14, -10, 0, 5, -17, -15, 32, 24, -16, 967 -1, 15, 55, 20, 14, 8, -29, -12, -7, -32, 968 }, { 969 82, -3, -38, -23, -24, 15, 38, 2, 37, 15, 970 -39, -2, 23, -4, 15, -12, -3, 17, -15, 58, 971 -1, 29, 6, 2, -5, -26, 7, 4, 56, -9, 972 35, 3, 25, -33, 32, 36, 17, 7, -15, -9, 973 }, { 974 13, 17, -15, 15, -3, 1, 33, 7, 1, -12, 975 -58, 5, 15, 13, 29, 3, -16, 13, -4, 57, 976 -10, 13, 11, -13, -21, -15, -9, 40, 55, -3, 977 14, 19, 44, -17, 24, 32, -5, 4, -21, -18, 978 }, { 979 76, 1, -41, -9, -19, -12, 41, 17, 55, 18, 980 -3, -63, -3, -12, 30, 5, -3, -12, -31, 0, 981 -24, 49, -8, 9, -1, -33, -12, -29, 27, -18, 982 37, 21, 34, -17, -3, -11, 14, -23, 25, -2, 983 }, { 984 7, 22, -18, 29, 1, -25, 36, 21, 20, -9, 985 -22, -56, -11, 6, 45, 21, -15, -16, -20, -1, 986 -33, 34, -2, -6, -17, -23, -28, 6, 25, -12, 987 16, 37, 53, -1, -11, -15, -8, -25, 20, -11, 988 }, { 989 37, 8, -29, -22, -4, -37, 36, 9, 34, 22, 990 -17, -24, 8, -18, 15, -2, 1, -14, -31, 25, 991 15, 48, 13, -4, -28, -31, -5, -21, 57, -4, 992 53, 24, 23, -55, 6, 12, 37, -6, 11, 11, 993 }, { 994 -31, 28, -6, 16, 16, -50, 31, 14, 0, -6, 995 -36, -17, 0, 0, 29, 14, -11, -18, -20, 25, 996 6, 33, 19, -20, -43, -21, -21, 14, 55, 0, 997 32, 40, 42, -39, -1, 8, 14, -8, 6, 3, 998 }, { 999 119, -24, -39, -44, -51, 66, -14, 15, 31, -26, 1000 -1, 0, 7, 16, -19, -28, -19, 22, -26, 4, 1001 -13, 28, -16, 29, 5, -1, 16, -16, 8, -35, 1002 -10, -42, -4, 17, 29, -19, -42, -7, 0, -15, 1003 }, { 1004 50, -3, -16, -5, -30, 53, -19, 20, -3, -55, 1005 -19, 8, 0, 34, -5, -11, -32, 18, -15, 4, 1006 -22, 13, -10, 13, -9, 8, 0, 19, 7, -29, 1007 -31, -26, 13, 33, 21, -22, -65, -9, -4, -23, 1008 }, { 1009 79, -17, -27, -56, -36, 41, -19, 8, 10, -22, 1010 -15, 39, 20, 9, -35, -35, -15, 20, -26, 31, 1011 26, 27, 6, 15, -20, 0, 23, -8, 38, -22, 1012 5, -38, -15, -20, 39, 4, -18, 9, -13, -1, 1013 }, { 1014 10, 3, -4, -18, -15, 27, -24, 13, -24, -51, 1015 -34, 47, 12, 28, -21, -19, -27, 16, -15, 30, 1016 17, 12, 12, 0, -36, 10, 7, 27, 37, -16, 1017 -15, -22, 3, -4, 31, 1, -42, 7, -18, -9, 1018 }, { 1019 74, -12, -30, -42, -30, 14, -16, 23, 29, -19, 1020 20, -21, -7, 1, -19, -17, -14, -10, -43, -27, 1021 3, 48, -8, 22, -16, -7, 4, -42, 9, -31, 1022 6, -20, -6, -4, 3, -43, -22, -20, 28, 5, 1023 }, { 1024 5, 7, -7, -4, -9, 0, -21, 28, -6, -48, 1025 2, -14, -15, 20, -5, 0, -27, -14, -32, -28, 1026 -5, 32, -2, 6, -32, 3, -12, -5, 8, -25, 1027 -14, -4, 12, 11, -4, -47, -45, -22, 22, -2, 1028 }, { 1029 34, -6, -18, -55, -15, -11, -21, 16, 8, -16, 1030 6, 16, 5, -4, -35, -24, -10, -12, -43, -1, 1031 43, 47, 14, 8, -43, -5, 10, -34, 39, -18, 1032 22, -16, -17, -42, 13, -19, 1, -3, 14, 20, 1033 }, { 1034 -34, 14, 4, -17, 5, -24, -26, 20, -27, -45, 1035 -12, 24, -2, 13, -21, -8, -22, -16, -32, -2, 1036 34, 31, 20, -7, -58, 5, -5, 2, 38, -12, 1037 2, -1, 1, -26, 5, -23, -21, -6, 8, 11, 1038 }, { 1039 124, -13, -21, -23, -62, 23, 0, 43, 57, 8, 1040 -13, -18, 14, -10, 6, -26, -3, 49, -19, 19, 1041 -31, 27, -7, 0, 11, -20, 29, -1, 12, -47, 1042 4, -39, 11, 34, 28, -9, -5, -19, -13, -34, 1043 }, { 1044 55, 6, 1, 14, -41, 10, -4, 48, 22, -20, 1045 -31, -10, 5, 7, 20, -9, -16, 45, -8, 19, 1046 -40, 12, -1, -15, -4, -10, 12, 34, 11, -41, 1047 -16, -24, 30, 49, 20, -13, -28, -22, -18, -43, 1048 }, { 1049 84, -6, -9, -36, -47, -1, -4, 36, 36, 12, 1050 -27, 20, 26, -17, -9, -33, 1, 47, -19, 46, 1051 9, 27, 15, -13, -15, -18, 35, 6, 42, -33, 1052 20, -36, 1, -4, 38, 14, 18, -2, -27, -20, 1053 }, { 1054 15, 13, 13, 1, -26, -14, -9, 41, 1, -16, 1055 -46, 27, 18, 1, 4, -16, -11, 43, -8, 45, 1056 0, 11, 21, -29, -30, -8, 19, 42, 41, -28, 1057 0, -20, 20, 11, 30, 10, -4, -5, -32, -28, 1058 }, { 1059 79, -2, -12, -22, -42, -28, -1, 51, 54, 15, 1060 8, -41, 0, -24, 6, -15, 1, 17, -36, -12, 1061 -14, 47, 0, -6, -11, -26, 16, -27, 13, -43, 1062 22, -18, 10, 12, 2, -34, 15, -33, 13, -13, 1063 }, { 1064 10, 18, 10, 15, -21, -41, -6, 56, 19, -13, 1065 -9, -33, -9, -6, 20, 1, -11, 13, -24, -13, 1066 -23, 32, 6, -22, -26, -15, 0, 8, 12, -37, 1067 1, -2, 28, 27, -5, -37, -7, -35, 8, -21, 1068 }, { 1069 39, 4, 0, -35, -27, -53, -6, 44, 33, 18, 1070 -5, -2, 11, -31, -9, -22, 6, 15, -36, 13, 1071 25, 46, 23, -20, -37, -24, 23, -19, 43, -29, 1072 38, -14, 0, -26, 12, -10, 38, -16, 0, 0, 1073 }, { 1074 -29, 25, 22, 2, -6, -67, -11, 49, -1, -10, 1075 -24, 5, 3, -13, 4, -5, -6, 11, -25, 12, 1076 16, 31, 28, -36, -53, -13, 6, 16, 42, -24, 1077 17, 1, 18, -10, 4, -13, 15, -18, -5, -7, 1078 }, { 1079 29, -25, -22, -2, 6, 67, 11, -49, 1, 10, 1080 24, -5, -3, 13, -4, 5, 6, -11, 25, -12, 1081 -16, -31, -28, 36, 53, 13, -6, -16, -42, 24, 1082 -17, -1, -18, 10, -4, 13, -15, 18, 5, 7, 1083 }, { 1084 -39, -4, 0, 35, 27, 53, 6, -44, -33, -18, 1085 5, 2, -11, 31, 9, 22, -6, -15, 36, -13, 1086 -25, -46, -23, 20, 37, 24, -23, 19, -43, 29, 1087 -38, 14, 0, 26, -12, 10, -38, 16, 0, 0, 1088 }, { 1089 -10, -18, -10, -15, 21, 41, 6, -56, -19, 13, 1090 9, 33, 9, 6, -20, -1, 11, -13, 24, 13, 1091 23, -32, -6, 22, 26, 15, 0, -8, -12, 37, 1092 -1, 2, -28, -27, 5, 37, 7, 35, -8, 21, 1093 }, { 1094 -79, 2, 12, 22, 42, 28, 1, -51, -54, -15, 1095 -8, 41, 0, 24, -6, 15, -1, -17, 36, 12, 1096 14, -47, 0, 6, 11, 26, -16, 27, -13, 43, 1097 -22, 18, -10, -12, -2, 34, -15, 33, -13, 13, 1098 }, { 1099 -15, -13, -13, -1, 26, 14, 9, -41, -1, 16, 1100 46, -27, -18, -1, -4, 16, 11, -43, 8, -45, 1101 0, -11, -21, 29, 30, 8, -19, -42, -41, 28, 1102 0, 20, -20, -11, -30, -10, 4, 5, 32, 28, 1103 }, { 1104 -84, 6, 9, 36, 47, 1, 4, -36, -36, -12, 1105 27, -20, -26, 17, 9, 33, -1, -47, 19, -46, 1106 -9, -27, -15, 13, 15, 18, -35, -6, -42, 33, 1107 -20, 36, -1, 4, -38, -14, -18, 2, 27, 20, 1108 }, { 1109 -55, -6, -1, -14, 41, -10, 4, -48, -22, 20, 1110 31, 10, -5, -7, -20, 9, 16, -45, 8, -19, 1111 40, -12, 1, 15, 4, 10, -12, -34, -11, 41, 1112 16, 24, -30, -49, -20, 13, 28, 22, 18, 43, 1113 }, { 1114 -124, 13, 21, 23, 62, -23, 0, -43, -57, -8, 1115 13, 18, -14, 10, -6, 26, 3, -49, 19, -19, 1116 31, -27, 7, 0, -11, 20, -29, 1, -12, 47, 1117 -4, 39, -11, -34, -28, 9, 5, 19, 13, 34, 1118 }, { 1119 34, -14, -4, 17, -5, 24, 26, -20, 27, 45, 1120 12, -24, 2, -13, 21, 8, 22, 16, 32, 2, 1121 -34, -31, -20, 7, 58, -5, 5, -2, -38, 12, 1122 -2, 1, -1, 26, -5, 23, 21, 6, -8, -11, 1123 }, { 1124 -34, 6, 18, 55, 15, 11, 21, -16, -8, 16, 1125 -6, -16, -5, 4, 35, 24, 10, 12, 43, 1, 1126 -43, -47, -14, -8, 43, 5, -10, 34, -39, 18, 1127 -22, 16, 17, 42, -13, 19, -1, 3, -14, -20, 1128 }, { 1129 -5, -7, 7, 4, 9, 0, 21, -28, 6, 48, 1130 -2, 14, 15, -20, 5, 0, 27, 14, 32, 28, 1131 5, -32, 2, -6, 32, -3, 12, 5, -8, 25, 1132 14, 4, -12, -11, 4, 47, 45, 22, -22, 2, 1133 }, { 1134 -74, 12, 30, 42, 30, -14, 16, -23, -29, 19, 1135 -20, 21, 7, -1, 19, 17, 14, 10, 43, 27, 1136 -3, -48, 8, -22, 16, 7, -4, 42, -9, 31, 1137 -6, 20, 6, 4, -3, 43, 22, 20, -28, -5, 1138 }, { 1139 -10, -3, 4, 18, 15, -27, 24, -13, 24, 51, 1140 34, -47, -12, -28, 21, 19, 27, -16, 15, -30, 1141 -17, -12, -12, 0, 36, -10, -7, -27, -37, 16, 1142 15, 22, -3, 4, -31, -1, 42, -7, 18, 9, 1143 }, { 1144 -79, 17, 27, 56, 36, -41, 19, -8, -10, 22, 1145 15, -39, -20, -9, 35, 35, 15, -20, 26, -31, 1146 -26, -27, -6, -15, 20, 0, -23, 8, -38, 22, 1147 -5, 38, 15, 20, -39, -4, 18, -9, 13, 1, 1148 }, { 1149 -50, 3, 16, 5, 30, -53, 19, -20, 3, 55, 1150 19, -8, 0, -34, 5, 11, 32, -18, 15, -4, 1151 22, -13, 10, -13, 9, -8, 0, -19, -7, 29, 1152 31, 26, -13, -33, -21, 22, 65, 9, 4, 23, 1153 }, { 1154 -119, 24, 39, 44, 51, -66, 14, -15, -31, 26, 1155 1, 0, -7, -16, 19, 28, 19, -22, 26, -4, 1156 13, -28, 16, -29, -5, 1, -16, 16, -8, 35, 1157 10, 42, 4, -17, -29, 19, 42, 7, 0, 15, 1158 }, { 1159 31, -28, 6, -16, -16, 50, -31, -14, 0, 6, 1160 36, 17, 0, 0, -29, -14, 11, 18, 20, -25, 1161 -6, -33, -19, 20, 43, 21, 21, -14, -55, 0, 1162 -32, -40, -42, 39, 1, -8, -14, 8, -6, -3, 1163 }, { 1164 -37, -8, 29, 22, 4, 37, -36, -9, -34, -22, 1165 17, 24, -8, 18, -15, 2, -1, 14, 31, -25, 1166 -15, -48, -13, 4, 28, 31, 5, 21, -57, 4, 1167 -53, -24, -23, 55, -6, -12, -37, 6, -11, -11, 1168 }, { 1169 -7, -22, 18, -29, -1, 25, -36, -21, -20, 9, 1170 22, 56, 11, -6, -45, -21, 15, 16, 20, 1, 1171 33, -34, 2, 6, 17, 23, 28, -6, -25, 12, 1172 -16, -37, -53, 1, 11, 15, 8, 25, -20, 11, 1173 }, { 1174 -76, -1, 41, 9, 19, 12, -41, -17, -55, -18, 1175 3, 63, 3, 12, -30, -5, 3, 12, 31, 0, 1176 24, -49, 8, -9, 1, 33, 12, 29, -27, 18, 1177 -37, -21, -34, 17, 3, 11, -14, 23, -25, 2, 1178 }, { 1179 -13, -17, 15, -15, 3, -1, -33, -7, -1, 12, 1180 58, -5, -15, -13, -29, -3, 16, -13, 4, -57, 1181 10, -13, -11, 13, 21, 15, 9, -40, -55, 3, 1182 -14, -19, -44, 17, -24, -32, 5, -4, 21, 18, 1183 }, { 1184 -82, 3, 38, 23, 24, -15, -38, -2, -37, -15, 1185 39, 2, -23, 4, -15, 12, 3, -17, 15, -58, 1186 1, -29, -6, -2, 5, 26, -7, -4, -56, 9, 1187 -35, -3, -25, 33, -32, -36, -17, -7, 15, 9, 1188 }, { 1189 -52, -10, 27, -27, 18, -26, -38, -14, -23, 16, 1190 44, 33, -3, -20, -45, -10, 20, -15, 3, -31, 1191 50, -14, 10, 0, -5, 17, 15, -32, -24, 16, 1192 1, -15, -55, -20, -14, -8, 29, 12, 7, 32, 1193 }, { 1194 -121, 9, 50, 10, 40, -40, -43, -9, -58, -12, 1195 25, 41, -11, -2, -31, 5, 8, -19, 15, -32, 1196 41, -30, 16, -16, -20, 28, 0, 3, -26, 22, 1197 -19, 0, -36, -4, -22, -12, 6, 9, 1, 24, 1198 }, { 1199 36, -18, 24, 3, -28, 7, -16, 13, 26, 41, 1200 24, -1, 5, -26, -3, -12, 27, 46, 27, -10, 1201 -24, -34, -10, -8, 49, 2, 34, 0, -51, -12, 1202 -17, -38, -25, 56, 0, 0, 22, -3, -20, -22, 1203 }, { 1204 -32, 2, 47, 42, -7, -5, -21, 18, -9, 12, 1205 5, 5, -2, -8, 10, 4, 14, 42, 38, -10, 1206 -33, -49, -5, -24, 33, 12, 17, 35, -52, -6, 1207 -38, -22, -7, 72, -7, -3, 0, -6, -25, -30, 1208 }, { 1209 -2, -11, 36, -9, -13, -17, -21, 6, 5, 45, 1210 10, 36, 18, -33, -19, -19, 31, 44, 27, 15, 1211 16, -34, 11, -22, 22, 4, 40, 7, -21, 0, 1212 -1, -35, -36, 18, 10, 24, 46, 12, -34, -8, 1213 }, { 1214 -71, 9, 59, 29, 8, -30, -26, 11, -30, 16, 1215 -8, 44, 9, -14, -5, -2, 19, 40, 38, 15, 1216 7, -50, 17, -38, 7, 14, 24, 43, -22, 6, 1217 -22, -19, -17, 34, 2, 20, 23, 10, -39, -16, 1218 }, { 1219 -8, -6, 33, 4, -7, -44, -18, 21, 23, 48, 1220 46, -24, -9, -40, -3, -1, 32, 13, 11, -43, 1221 -7, -14, -3, -15, 26, -3, 21, -26, -50, -8, 1222 0, -16, -27, 34, -25, -23, 43, -17, 6, -1, 1223 }, { 1224 -77, 13, 56, 43, 13, -57, -23, 26, -11, 19, 1225 27, -16, -17, -22, 10, 15, 19, 10, 22, -43, 1226 -16, -30, 2, -31, 11, 6, 5, 9, -52, -2, 1227 -20, 0, -8, 50, -33, -27, 19, -19, 1, -9, 1228 }, { 1229 -47, 0, 45, -7, 7, -69, -23, 13, 2, 51, 1230 32, 14, 3, -47, -19, -8, 37, 11, 10, -16, 1231 32, -15, 19, -29, 0, -1, 28, -18, -20, 4, 1232 16, -13, -38, -3, -15, 0, 66, 0, -7, 13, 1233 }, { 1234 -116, 20, 68, 30, 28, -83, -28, 18, -32, 22, 1235 13, 21, -5, -28, -5, 7, 24, 8, 22, -17, 1236 23, -30, 25, -45, -15, 9, 11, 18, -22, 10, 1237 -4, 2, -19, 12, -23, -3, 43, -2, -12, 4, 1238 }, { 1239 72, -13, -29, -18, 4, 90, 37, -34, 4, -1, 1240 13, -9, -6, 11, 2, 24, -13, 3, -7, -11, 1241 -4, 4, -42, 25, 31, -1, -8, -29, -6, 17, 1242 -19, 2, -10, -6, 38, 22, -42, -19, -6, -11, 1243 }, { 1244 3, 7, -6, 20, 25, 77, 32, -29, -31, -30, 1245 -4, -2, -14, 29, 16, 40, -26, 0, 3, -12, 1246 -13, -10, -36, 9, 15, 8, -24, 6, -7, 22, 1247 -40, 17, 8, 9, 31, 18, -66, -22, -11, -19, 1248 }, { 1249 32, -6, -17, -31, 19, 65, 33, -41, -16, 1, 1250 0, 29, 6, 4, -13, 17, -9, 1, -8, 14, 1251 35, 3, -19, 11, 4, 0, -1, -21, 23, 30, 1252 -3, 5, -20, -44, 48, 46, -19, -3, -20, 3, 1253 }, { 1254 -36, 13, 5, 7, 40, 51, 28, -36, -52, -27, 1255 -18, 36, -2, 22, 0, 33, -21, -2, 3, 13, 1256 26, -11, -14, -4, -10, 10, -18, 14, 22, 36, 1257 -24, 21, -1, -28, 40, 42, -42, -5, -25, -5, 1258 }, { 1259 27, -1, -20, -17, 24, 38, 35, -26, 1, 4, 1260 35, -32, -21, -3, 2, 35, -8, -29, -24, -44, 1261 12, 24, -34, 18, 8, -7, -21, -55, -5, 21, 1262 -2, 23, -11, -28, 13, -1, -22, -33, 21, 10, 1263 }, { 1264 -41, 18, 2, 21, 45, 24, 30, -21, -33, -24, 1265 17, -24, -29, 15, 16, 51, -21, -33, -13, -45, 1266 3, 8, -28, 2, -7, 2, -37, -19, -7, 27, 1267 -22, 39, 7, -12, 5, -5, -45, -35, 15, 1, 1268 }, { 1269 -12, 4, -8, -29, 39, 12, 30, -33, -19, 8, 1270 21, 6, -8, -9, -13, 28, -4, -31, -24, -18, 1271 52, 23, -12, 4, -18, -5, -14, -47, 24, 34, 1272 14, 27, -22, -66, 22, 22, 1, -16, 6, 24, 1273 }, { 1274 -81, 25, 14, 8, 61, 0, 25, -28, -54, -20, 1275 3, 14, -17, 8, 0, 44, -16, -35, -13, -18, 1276 43, 7, -6, -11, -33, 4, -30, -11, 22, 40, 1277 -6, 43, -3, -50, 14, 18, -22, -18, 1, 16, 1278 }, { 1279 77, -2, -11, 1, -7, 47, 52, -5, 29, 33, 1280 1, -28, 0, -15, 28, 26, 2, 30, 0, 2, 1281 -22, 4, -33, -3, 36, -21, 3, -15, -2, 5, 1282 -4, 4, 6, 9, 37, 31, -5, -32, -20, -30, 1283 }, { 1284 8, 17, 10, 40, 13, 34, 47, 0, -5, 4, 1285 -16, -21, -8, 2, 42, 43, -10, 26, 10, 2, 1286 -31, -11, -27, -19, 21, -10, -12, 20, -3, 11, 1287 -25, 20, 25, 25, 29, 28, -28, -34, -25, -38, 1288 }, { 1289 37, 3, 0, -10, 7, 22, 48, -12, 8, 36, 1290 -12, 9, 12, -22, 12, 19, 6, 28, 0, 29, 1291 18, 3, -11, -17, 10, -18, 10, -7, 27, 18, 1292 11, 7, -3, -28, 47, 55, 18, -15, -34, -16, 1293 }, { 1294 -31, 24, 23, 27, 29, 9, 43, -8, -26, 7, 1295 -30, 17, 4, -3, 26, 35, -5, 24, 10, 28, 1296 9, -12, -5, -33, -5, -8, -5, 29, 26, 24, 1297 -9, 23, 14, -12, 39, 52, -5, -18, -39, -24, 1298 }, { 1299 32, 8, -3, 2, 13, -4, 50, 1, 27, 39, 1300 23, -51, -15, -30, 27, 37, 7, -1, -17, -29, 1301 -5, 23, -25, -10, 14, -26, -8, -41, -1, 9, 1302 13, 26, 5, -12, 12, 7, 14, -45, 6, -9, 1303 }, { 1304 -36, 29, 19, 41, 34, -18, 45, 6, -8, 10, 1305 5, -43, -23, -11, 42, 53, -5, -5, -6, -30, 1306 -14, 8, -20, -26, -1, -16, -25, -4, -3, 15, 1307 -7, 41, 23, 3, 4, 3, -8, -48, 1, -17, 1308 }, { 1309 -7, 15, 9, -9, 28, -29, 45, -5, 6, 43, 1310 9, -12, -2, -36, 12, 30, 11, -3, -17, -3, 1311 34, 22, -3, -24, -12, -24, -2, -32, 28, 22, 1312 29, 29, -5, -50, 21, 31, 38, -29, -7, 5, 1313 }, { 1314 -76, 35, 31, 28, 49, -43, 40, 0, -29, 14, 1315 -8, -5, -10, -18, 26, 46, 0, -7, -6, -3, 1316 25, 7, 2, -40, -28, -14, -18, 3, 27, 28, 1317 8, 45, 13, -34, 13, 27, 15, -31, -12, -3, 1318 }, { 1319 74, -17, 0, -31, -18, 73, -5, 0, 3, -5, 1320 25, 12, -3, -1, -22, 3, -9, 33, -12, -24, 1321 6, 2, -33, 9, 21, 5, 20, -27, -19, -7, 1322 -34, -37, -34, 22, 44, 0, -41, -29, -17, -21, 1323 }, { 1324 5, 3, 21, 7, 2, 60, -10, 5, -32, -34, 1325 7, 20, -11, 16, -8, 20, -21, 29, -1, -24, 1326 -2, -13, -27, -6, 5, 15, 3, 8, -21, -1, 1327 -55, -21, -15, 38, 37, -3, -65, -32, -23, -30, 1328 }, { 1329 35, -10, 11, -44, -3, 48, -10, -6, -17, -2, 1330 11, 51, 8, -8, -38, -3, -4, 31, -12, 2, 1331 46, 1, -10, -4, -5, 7, 26, -19, 10, 5, 1332 -18, -34, -45, -15, 54, 24, -18, -13, -31, -7, 1333 }, { 1334 -33, 10, 34, -5, 17, 35, -15, -1, -53, -30, 1335 -6, 59, 0, 10, -24, 13, -17, 27, -1, 1, 1336 37, -13, -4, -20, -20, 18, 10, 16, 8, 11, 1337 -39, -18, -26, 0, 46, 20, -41, -15, -37, -15, 1338 }, { 1339 29, -5, 7, -30, 1, 21, -7, 7, 0, 0, 1340 47, -9, -18, -15, -22, 14, -4, 0, -28, -57, 1341 23, 21, -25, 2, -1, 0, 7, -53, -19, -3, 1342 -17, -15, -36, 0, 19, -24, -21, -43, 9, 0, 1343 }, { 1344 -39, 14, 30, 8, 22, 8, -12, 12, -34, -27, 1345 29, -2, -26, 2, -8, 31, -16, -3, -17, -57, 1346 14, 6, -19, -13, -16, 10, -8, -17, -20, 2, 1347 -38, 0, -17, 16, 11, -27, -44, -45, 4, -8, 1348 }, { 1349 -9, 1, 20, -43, 17, -3, -12, 0, -20, 4, 1350 33, 29, -6, -22, -38, 7, 0, -1, -29, -30, 1351 63, 21, -3, -11, -27, 1, 14, -45, 10, 9, 1352 -1, -12, -47, -37, 28, 0, 2, -26, -4, 13, 1353 }, { 1354 -78, 21, 43, -4, 38, -17, -17, 5, -55, -24, 1355 15, 36, -14, -4, -24, 24, -12, -5, -17, -31, 1356 54, 5, 2, -27, -43, 12, -2, -9, 9, 15, 1357 -22, 3, -28, -21, 20, -3, -20, -28, -9, 5, 1358 }, { 1359 80, -6, 16, -11, -30, 30, 9, 28, 28, 29, 1360 13, -6, 2, -28, 3, 5, 7, 60, -5, -9, 1361 -11, 1, -24, -19, 27, -13, 32, -13, -15, -19, 1362 -19, -35, -17, 39, 43, 9, -4, -42, -32, -41, 1363 }, { 1364 11, 14, 39, 27, -9, 17, 4, 33, -6, 0, 1365 -4, 1, -5, -10, 17, 22, -5, 57, 5, -9, 1366 -20, -13, -18, -35, 11, -3, 16, 22, -17, -13, 1367 -40, -19, 1, 55, 35, 5, -27, -44, -37, -49, 1368 }, { 1369 40, 0, 28, -24, -14, 5, 4, 21, 7, 33, 1370 0, 32, 15, -35, -12, -1, 11, 58, -5, 16, 1371 28, 0, -1, -33, 0, -11, 39, -5, 14, -6, 1372 -3, -31, -28, 1, 53, 33, 19, -25, -46, -26, 1373 }, { 1374 -28, 20, 51, 14, 6, -7, 0, 26, -27, 4, 1375 -18, 40, 6, -16, 1, 15, 0, 55, 5, 16, 1376 19, -14, 3, -49, -14, -1, 22, 30, 12, 0, 1377 -24, -15, -9, 17, 45, 29, -4, -28, -51, -35, 1378 }, { 1379 34, 4, 25, -10, -9, -21, 7, 36, 26, 36, 1380 35, -28, -12, -42, 3, 16, 12, 28, -21, -42, 1381 5, 21, -16, -26, 4, -19, 19, -39, -15, -15, 1382 -1, -13, -19, 17, 17, -14, 15, -55, -4, -19, 1383 }, { 1384 -34, 25, 48, 28, 11, -34, 2, 41, -9, 7, 1385 17, -21, -20, -24, 17, 33, 0, 24, -10, -42, 1386 -3, 5, -10, -42, -11, -8, 3, -3, -16, -9, 1387 -22, 2, 0, 33, 10, -18, -7, -58, -10, -28, 1388 }, { 1389 -4, 11, 37, -23, 5, -46, 2, 29, 5, 39, 1390 21, 9, 0, -49, -12, 9, 16, 26, -22, -15, 1391 45, 20, 5, -40, -22, -17, 26, -31, 14, -2, 1392 14, -10, -30, -20, 27, 9, 39, -39, -18, -5, 1393 }, { 1394 -73, 32, 60, 15, 26, -59, -2, 33, -30, 10, 1395 3, 17, -8, -30, 1, 26, 4, 22, -10, -16, 1396 36, 5, 11, -56, -37, -6, 10, 5, 13, 3, 1397 -6, 5, -11, -4, 19, 5, 16, -41, -24, -13 1398 } 1399}; 1400 1401const uint16_t ff_cb1_base[128]={ 1402 19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671, 1403 20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411, 1404 20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387, 1405 21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852, 1406 19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086, 1407 21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159, 1408 19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004, 1409 21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781, 1410 19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556, 1411 18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770, 1412 17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138, 1413 16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675, 1414 20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477, 1415 19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389, 1416 17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363, 1417 16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657, 1418}; 1419 1420const uint16_t ff_cb2_base[128]={ 1421 12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053, 1422 12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268, 1423 11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109, 1424 11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405, 1425 10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818, 1426 10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226, 1427 10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053, 1428 10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198, 1429 14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155, 1430 15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446, 1431 13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443, 1432 12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230, 1433 12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449, 1434 13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982, 1435 12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410, 1436 12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174, 1437}; 1438 1439const int16_t ff_energy_tab[32]={ 1440 0, 16, 20, 25, 32, 41, 51, 65, 1441 81, 103, 129, 163, 205, 259, 326, 410, 1442 516, 650, 819, 1031, 1298, 1634, 2057, 2590, 1443 3261, 4105, 5168, 6507, 8192, 10313, 12983, 16345 1444}; 1445 1446static const int16_t lpc_refl_cb1[64]={ 1447 -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879, 1448 -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631, 1449 -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268, 1450 -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676, 1451 -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660, 1452 -1508, -1348, -1185, -994, -798, -600, -374, -110, 1453 152, 447, 720, 982, 1229, 1456, 1682, 1916, 1454 2130, 2353, 2595, 2853, 3118, 3363, 3588, 3814 1455}; 1456 1457static const int16_t lpc_refl_cb2[32]={ 1458 -3091, -2386, -1871, -1425, -1021, -649, -316, -20, 1459 267, 544, 810, 1065, 1305, 1534, 1756, 1970, 1460 2171, 2359, 2536, 2700, 2854, 2996, 3133, 3263, 1461 3386, 3499, 3603, 3701, 3789, 3870, 3947, 4020 1462}; 1463 1464static const int16_t lpc_refl_cb3[32]={ 1465 -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149, 1466 -1979, -1817, -1658, -1498, -1341, -1188, -1032, -876, 1467 -721, -561, -394, -228, -54, 119, 296, 484, 1468 683, 895, 1123, 1373, 1651, 1965, 2360, 2854 1469}; 1470 1471static const int16_t lpc_refl_cb4[16]={ 1472 -1845, -1057, -522, -77, 301, 647, 975, 1285, 1473 1582, 1873, 2163, 2452, 2735, 3017, 3299, 3569 1474}; 1475 1476static const int16_t lpc_refl_cb5[16]={ 1477 -2691, -2187, -1788, -1435, -1118, -837, -571, -316, 1478 -59, 201, 470, 759, 1077, 1457, 1908, 2495 1479}; 1480 1481static const int16_t lpc_refl_cb6[8]={ 1482 -1372, -474, 133, 632, 1100, 1571, 2075, 2672 1483}; 1484 1485static const int16_t lpc_refl_cb7[8]={ 1486 -2389, -1787, -1231, -717, -239, 234, 770, 1474 1487}; 1488 1489static const int16_t lpc_refl_cb8[8]={ 1490 -1569, -864, -296, 200, 670, 1151, 1709, 2385 1491}; 1492 1493static const int16_t lpc_refl_cb9[8]={ 1494 -2200, -1608, -1062, -569, -120, 338, 863, 1621 1495}; 1496 1497static const int16_t lpc_refl_cb10[4]={ 1498 -617, 190, 802, 1483 1499}; 1500 1501const int16_t * const ff_lpc_refl_cb[10]={ 1502 lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5, 1503 lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10 1504}; 1505 1506static void ff_add_wav(int16_t *dest, int n, int skip_first, int *m, const int16_t *s1, 1507 const int8_t *s2, const int8_t *s3) 1508{ 1509 int i; 1510 int v[3]; 1511 1512 v[0] = 0; 1513 for (i=!skip_first; i<3; i++) 1514 v[i] = (ff_gain_val_tab[n][i] * m[i]) >> ff_gain_exp_tab[n]; 1515 1516 if (v[0]) { 1517 for (i=0; i < BLOCKSIZE; i++) 1518 dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12; 1519 } else { 1520 for (i=0; i < BLOCKSIZE; i++) 1521 dest[i] = ( s2[i]*v[1] + s3[i]*v[2]) >> 12; 1522 } 1523} 1524 1525/** 1526 * Copy the last offset values of *source to *target. If those values are not 1527 * enough to fill the target buffer, fill it with another copy of those values. 1528 */ 1529void ff_copy_and_dup(int16_t *target, const int16_t *source, int offset) 1530{ 1531 source += BUFFERSIZE - offset; 1532 1533 memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target)); 1534 if (offset < BLOCKSIZE) 1535 memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target)); 1536} 1537 1538/** 1539 * Evaluate the reflection coefficients from the filter coefficients. 1540 * 1541 * @return 1 if one of the reflection coefficients is greater than 1542 * 4095, 0 if not. 1543 */ 1544int ff_eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx) 1545{ 1546 int b, i, j; 1547 int buffer1[LPC_ORDER]; 1548 int buffer2[LPC_ORDER]; 1549 int *bp1 = buffer1; 1550 int *bp2 = buffer2; 1551 1552 for (i=0; i < LPC_ORDER; i++) 1553 buffer2[i] = coefs[i]; 1554 1555 refl[LPC_ORDER-1] = bp2[LPC_ORDER-1]; 1556 1557 if ((unsigned) bp2[LPC_ORDER-1] + 0x1000 > 0x1fff) { 1558 av_log(avctx, AV_LOG_ERROR, "Overflow. Broken sample?\n"); 1559 return 1; 1560 } 1561 1562 for (i = LPC_ORDER-2; i >= 0; i--) { 1563 b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12); 1564 1565 if (!b) 1566 b = -2; 1567 1568 for (j=0; j <= i; j++) 1569 bp1[j] = ((bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12)) * (0x1000000 / b)) >> 12; 1570 1571 if ((unsigned) bp1[i] + 0x1000 > 0x1fff) 1572 return 1; 1573 1574 refl[i] = bp1[i]; 1575 1576 FFSWAP(int *, bp1, bp2); 1577 } 1578 return 0; 1579} 1580 1581/** 1582 * Evaluate the LPC filter coefficients from the reflection coefficients. 1583 * Does the inverse of the ff_eval_refl() function. 1584 */ 1585void ff_eval_coefs(int *coefs, const int *refl) 1586{ 1587 int buffer[LPC_ORDER]; 1588 int *b1 = buffer; 1589 int *b2 = coefs; 1590 int i, j; 1591 1592 for (i=0; i < LPC_ORDER; i++) { 1593 b1[i] = refl[i] << 4; 1594 1595 for (j=0; j < i; j++) 1596 b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j]; 1597 1598 FFSWAP(int *, b1, b2); 1599 } 1600 1601 for (i=0; i < LPC_ORDER; i++) 1602 coefs[i] >>= 4; 1603} 1604 1605void ff_int_to_int16(int16_t *out, const int *inp) 1606{ 1607 int i; 1608 1609 for (i = 0; i < LPC_ORDER; i++) 1610 *out++ = *inp++; 1611} 1612 1613/** 1614 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an 1615 * odd way to make the output identical to the binary decoder. 1616 */ 1617int ff_t_sqrt(unsigned int x) 1618{ 1619 int s = 2; 1620 while (x > 0xfff) { 1621 s++; 1622 x >>= 2; 1623 } 1624 1625 return ff_sqrt(x << 20) << s; 1626} 1627 1628unsigned int ff_rms(const int *data) 1629{ 1630 int i; 1631 unsigned int res = 0x10000; 1632 int b = LPC_ORDER; 1633 1634 for (i = 0; i < LPC_ORDER; i++) { 1635 res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12; 1636 1637 if (res == 0) 1638 return 0; 1639 1640 while (res <= 0x3fff) { 1641 b++; 1642 res <<= 2; 1643 } 1644 } 1645 1646 return ff_t_sqrt(res) >> b; 1647} 1648 1649int ff_interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy) 1650{ 1651 int work[LPC_ORDER]; 1652 int b = NBLOCKS - a; 1653 int i; 1654 1655 // Interpolate block coefficients from the this frame's forth block and 1656 // last frame's forth block. 1657 for (i = 0; i < LPC_ORDER; i++) 1658 out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2; 1659 1660 if (ff_eval_refl(work, out, ractx->avctx)) { 1661 // The interpolated coefficients are unstable, copy either new or old 1662 // coefficients. 1663 ff_int_to_int16(out, ractx->lpc_coef[copyold]); 1664 return ff_rescale_rms(ractx->lpc_refl_rms[copyold], energy); 1665 } else { 1666 return ff_rescale_rms(ff_rms(work), energy); 1667 } 1668} 1669 1670unsigned int ff_rescale_rms(unsigned int rms, unsigned int energy) 1671{ 1672 return (rms * energy) >> 10; 1673} 1674 1675/** inverse root mean square */ 1676int ff_irms(const int16_t *data) 1677{ 1678 unsigned int i, sum = 0; 1679 1680 for (i=0; i < BLOCKSIZE; i++) 1681 sum += data[i] * data[i]; 1682 1683 if (sum == 0) 1684 return 0; /* OOPS - division by zero */ 1685 1686 return 0x20000000 / (ff_t_sqrt(sum) >> 8); 1687} 1688 1689void ff_subblock_synthesis(RA144Context *ractx, const uint16_t *lpc_coefs, 1690 int cba_idx, int cb1_idx, int cb2_idx, 1691 int gval, int gain) 1692{ 1693 uint16_t buffer_a[BLOCKSIZE]; 1694 uint16_t *block; 1695 int m[3]; 1696 1697 if (cba_idx) { 1698 cba_idx += BLOCKSIZE/2 - 1; 1699 ff_copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx); 1700 m[0] = (ff_irms(buffer_a) * gval) >> 12; 1701 } else { 1702 m[0] = 0; 1703 } 1704 m[1] = (ff_cb1_base[cb1_idx] * gval) >> 8; 1705 m[2] = (ff_cb2_base[cb2_idx] * gval) >> 8; 1706 memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE, 1707 (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb)); 1708 1709 block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE; 1710 1711 ff_add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL, 1712 ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]); 1713 1714 memcpy(ractx->curr_sblock, ractx->curr_sblock + BLOCKSIZE, 1715 LPC_ORDER*sizeof(*ractx->curr_sblock)); 1716 1717 if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + LPC_ORDER, lpc_coefs, 1718 block, BLOCKSIZE, LPC_ORDER, 1, 0xfff)) 1719 memset(ractx->curr_sblock, 0, (LPC_ORDER+BLOCKSIZE)*sizeof(*ractx->curr_sblock)); 1720} 1721