comparison ra144.c @ 11865:6111134a3d94 libavcodec

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