FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/ra144.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 95 100 95.0%
Functions: 11 11 100.0%
Branches: 48 52 92.3%

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