1 /*
2  * Copyright (C) 2017 foo86
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #ifndef AVCODEC_DOLBY_E_H
22 #define AVCODEC_DOLBY_E_H
23 
24 #include "libavutil/float_dsp.h"
25 #include "libavutil/libm.h"
26 #include "libavutil/mem.h"
27 
28 #include "internal.h"
29 #include "get_bits.h"
30 #include "kbdwin.h"
31 #include "fft.h"
32 
33 #define FRAME_SAMPLES   1792
34 
35 #define MAX_PROG_CONF   23
36 #define MAX_PROGRAMS    8
37 #define MAX_CHANNELS    8
38 #define MAX_SEGMENTS    2
39 
40 #define MAX_GROUPS      8
41 #define MAX_EXPONENTS   304
42 #define MAX_MANTISSAS   1024
43 
44 #define MAX_MSTR_EXP    2
45 #define MAX_BIAS_EXP    50
46 
47 typedef struct DBEGroup {
48     uint8_t         nb_exponent;
49     uint8_t         nb_bias_exp[MAX_MSTR_EXP];
50     uint16_t        exp_ofs;
51     uint16_t        mnt_ofs;
52     const uint8_t   *nb_mantissa;
53     uint8_t         imdct_idx;
54     uint8_t         imdct_phs;
55     uint16_t        win_len;
56     uint16_t        dst_ofs;
57     uint16_t        win_ofs;
58     uint16_t        src_ofs;
59 } DBEGroup;
60 
61 typedef struct DBEChannel {
62     int     gr_code;
63     int     bw_code;
64 
65     int         nb_groups;
66     int         nb_mstr_exp;
67     DBEGroup    groups[MAX_GROUPS];
68 
69     int     exp_strategy[MAX_GROUPS];
70     int     exponents[MAX_EXPONENTS];
71     int     bap[MAX_EXPONENTS];
72     int     idx[MAX_EXPONENTS];
73 
74     DECLARE_ALIGNED(32, float, mantissas)[MAX_MANTISSAS];
75 } DBEChannel;
76 
77 typedef struct DBEContext {
78     AVCodecContext  *avctx;
79     GetBitContext   gb;
80 
81     uint8_t     *input;
82     int         input_size;
83 
84     int         word_bits;
85     int         word_bytes;
86     int         key_present;
87 
88     int         prog_conf;
89     int         nb_channels;
90     int         nb_programs;
91 
92     int         fr_code;
93     int         fr_code_orig;
94 
95     int         ch_size[MAX_CHANNELS];
96     int         mtd_ext_size;
97     int         meter_size;
98 
99     int         rev_id[MAX_CHANNELS];
100     int         begin_gain[MAX_CHANNELS];
101     int         end_gain[MAX_CHANNELS];
102 
103     int         multi_prog_warned;
104 
105     DBEChannel  channels[MAX_SEGMENTS][MAX_CHANNELS];
106 
107     DECLARE_ALIGNED(32, float, history)[MAX_CHANNELS][256];
108 
109     FFTContext          imdct[3];
110     AVFloatDSPContext   *fdsp;
111 
112     uint8_t     buffer[1024 * 3 + AV_INPUT_BUFFER_PADDING_SIZE];
113 } DBEContext;
114 
115 static const uint8_t nb_programs_tab[MAX_PROG_CONF + 1] = {
116     2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 8, 1, 2, 3, 3, 4, 5, 6, 1, 2, 3, 4, 1, 1
117 };
118 
119 static const uint8_t nb_channels_tab[MAX_PROG_CONF + 1] = {
120     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 8, 8
121 };
122 
123 static const int8_t lfe_channel_tab[MAX_PROG_CONF + 1] = {
124      5,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4,
125     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  5, 5
126 };
127 
128 static const uint8_t ch_reorder_4[4] = { 0, 2, 1, 3 };
129 static const uint8_t ch_reorder_6[6] = { 0, 2, 4, 1, 3, 5 };
130 static const uint8_t ch_reorder_8[8] = { 0, 2, 6, 4, 1, 3, 7, 5 };
131 static const uint8_t ch_reorder_n[8] = { 0, 2, 4, 6, 1, 3, 5, 7 };
132 
133 static const uint16_t sample_rate_tab[16] = {
134     0, 42965, 43008, 44800, 53706, 53760
135 };
136 
137 static const uint8_t nb_groups_tab[4] = { 1, 8, 7, 1 };
138 
139 static const uint8_t nb_mstr_exp_tab[4] = { 2, 2, 2, 1 };
140 
141 static const uint8_t nb_mantissa_38[38] = {
142      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
143      2,  2,  2,  2,  2,  2,  3,  3,  3,  4,  4,  4,  5,  5,  6,  6,
144      7,  8,  9, 10, 11, 12,
145 };
146 
147 static const uint8_t nb_mantissa_44[44] = {
148      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,
149      2,  2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  5,  5,  6,  7,  7,
150      8,  9, 10, 11, 12, 13, 15, 16, 18, 20, 22, 25,
151 };
152 
153 static const uint8_t nb_mantissa_50[50] = {
154      1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  3,  3,  3,
155      3,  4,  4,  5,  5,  6,  6,  7,  8,  9,  9, 10, 12, 13, 14, 16,
156     18, 19, 22, 24, 27, 29, 32, 36, 40, 44, 49, 54, 60, 66, 74, 82,
157     90, 100,
158 };
159 
160 static const uint8_t imdct_bits_tab[3] = { 8, 9, 11 };
161 
162 static const DBEGroup grp_tab_0[1] = {
163     { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
164 };
165 
166 static const DBEGroup grp_tab_1[8] = {
167     { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 },
168     { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 },
169     { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 },
170     { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
171     { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
172     { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
173     { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 704, 0, 0 },
174     { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 1, 256, 832, 0, 0 },
175 };
176 
177 static const DBEGroup grp_tab_2[7] = {
178     { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 },
179     { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 },
180     { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 },
181     { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
182     { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
183     { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
184     { 44, { 19, 25 }, 228, 768, nb_mantissa_44, 1, 1, 448, 704, 960, 64 },
185 };
186 
187 static const DBEGroup grp_tab_3[1] = {
188     { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
189 };
190 
191 static const DBEGroup grp_tab_4[1] = {
192     { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
193 };
194 
195 static const DBEGroup grp_tab_5[8] = {
196     { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 1, 256, 64, 0, 0 },
197     { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 192, 0, 0 },
198     { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
199     { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
200     { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
201     { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 },
202     { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 },
203     { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 },
204 };
205 
206 static const DBEGroup grp_tab_6[7] = {
207     { 44, { 19, 25 }, 0, 0, nb_mantissa_44, 1, 1, 448, 0, 3264, 0 },
208     { 38, { 12, 26 }, 44, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
209     { 38, { 12, 26 }, 82, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
210     { 38, { 12, 26 }, 120, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
211     { 38, { 12, 26 }, 158, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 },
212     { 38, { 12, 26 }, 196, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 },
213     { 38, { 12, 26 }, 234, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 },
214 };
215 
216 static const DBEGroup grp_tab_7[1] = {
217     { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
218 };
219 
220 static const DBEGroup *const frm_ofs_tab[2][4] = {
221     { grp_tab_0, grp_tab_1, grp_tab_2, grp_tab_3 },
222     { grp_tab_4, grp_tab_5, grp_tab_6, grp_tab_7 }
223 };
224 
225 static const uint8_t mantissa_size1[16][4] = {
226     {  0,  0,  0,  0 }, {  2,  1,  1,  1 }, {  3,  2,  1,  1 }, {  4,  3,  2,  1 },
227     {  5,  4,  3,  2 }, {  6,  5,  4,  3 }, {  7,  6,  5,  4 }, {  8,  7,  6,  5 },
228     {  9,  8,  7,  6 }, { 10,  9,  8,  7 }, { 11, 10,  9,  8 }, { 12, 11, 10,  9 },
229     { 13, 12, 11, 10 }, { 14, 13, 12, 11 }, { 15, 14, 13, 12 }, { 16, 15, 14, 13 },
230 };
231 
232 static const uint8_t mantissa_size2[16][4] = {
233     {  0,  0,  0,  0 }, {  2,  1,  2,  2 }, {  3,  2,  3,  3 }, {  4,  3,  4,  4 },
234     {  5,  4,  5,  5 }, {  6,  5,  6,  6 }, {  7,  6,  7,  7 }, {  8,  7,  8,  8 },
235     {  9,  8,  9,  9 }, { 10,  9, 10, 10 }, { 11, 10, 11, 11 }, { 12, 11, 12, 12 },
236     { 13, 12, 13, 13 }, { 14, 13, 14, 14 }, { 15, 14, 15, 15 }, { 16, 15, 16, 16 },
237 };
238 
239 static const float start_window[192] = {
240     0.00161569379826, 0.00185748233347, 0.00198562758548, 0.00207834078104,
241     0.00215717748523, 0.00223067096393, 0.00230299213147, 0.00237651215396,
242     0.00245275561606, 0.00253281402069, 0.00261754673613, 0.00270768786168,
243     0.00280390761895, 0.00290684998656, 0.00301715751161, 0.00313548872798,
244     0.00326253122934, 0.00339901215995, 0.00354570716636, 0.00370344845023,
245     0.00387313232586, 0.00405572653911, 0.00425227750970, 0.00446391759265,
246     0.00469187240551, 0.00493746822816, 0.00520213944619, 0.00548743597507,
247     0.00579503056737, 0.00612672586953, 0.00648446105606, 0.00687031782873,
248     0.00728652552677, 0.00773546505205, 0.00821967127415, 0.00874183354619,
249     0.00930479393832, 0.00991154278653, 0.01056521116692, 0.01126905994567,
250     0.01202646513050, 0.01284089936559, 0.01371590957417, 0.01465509096066,
251     0.01566205783408, 0.01674041199523, 0.01789370972358, 0.01912542867865,
252     0.02043893626265, 0.02183746113793, 0.02332406961796, 0.02490164852364,
253     0.02657289580178, 0.02834031974193, 0.03020624702903, 0.03217283918354,
254     0.03424211623810, 0.03641598586180, 0.03869627565015, 0.04108476601498,
255     0.04358322107390, 0.04619341515939, 0.04891715301882, 0.05175628239149,
256 
257     0.05471237327267, 0.05778734733755, 0.06098291402413, 0.06430101352084,
258     0.06774345212186, 0.07131188644726, 0.07500780649199, 0.07883251748595,
259     0.08278712056651, 0.08687249228061, 0.09108926295730, 0.09543779401074,
260     0.09991815425851, 0.10453009536427, 0.10927302653894, 0.11414598865987,
261     0.11914762799220, 0.12427616972097, 0.12952939152560, 0.13490459744934,
262     0.14039859233595, 0.14600765712201, 0.15172752528722, 0.15755336077528,
263     0.16347973770491, 0.16950062219342, 0.17560935661442, 0.18179864660619,
264     0.18806055113821, 0.19438647593012, 0.20076717050010, 0.20719272909882,
265     0.21365259576030, 0.22013557367283, 0.22662983904194, 0.23312295958328,
266     0.23960191774666, 0.24605313873388, 0.25246252333253, 0.25881548554631,
267     0.26509699495987, 0.27129162373316, 0.27738359807707, 0.28335685401987,
268     0.28919509723179, 0.29488186663467, 0.30040060148455, 0.30573471157819,
269     0.31086765019993, 0.31578298939317, 0.32046449711227, 0.32489621578468,
270     0.32906254179156, 0.33294830535654, 0.33653885031840, 0.33982011325336,
271     0.34277870140679, 0.34540196889300, 0.34767809062480, 0.34959613344194,
272     0.35114612391958, 0.35231911235422, 0.35310723244504, 0.35350375621308,
273 
274     0.35350314372945, 0.35310108725579, 0.35229454943591, 0.35108179521634,
275     0.34946241721522, 0.34743735430290, 0.34500890320420, 0.34218072298001,
276     0.33895783229541, 0.33534659943168, 0.33135472505060, 0.32699121776996,
277     0.32226636266000, 0.31719168282019, 0.31177989424432, 0.30604485422875,
278     0.30000150362379, 0.29366580327088, 0.28705466500775, 0.28018587766131,
279     0.27307802848095, 0.26575042049535, 0.25822298630189, 0.25051619882000,
280     0.24265097955783, 0.23464860495522, 0.22653061137548, 0.21831869932335,
281     0.21003463746705, 0.20170016703857, 0.19333690717811, 0.18496626177620,
282     0.17660932835062, 0.16828680947474, 0.16001892724986, 0.15182534128597,
283     0.14372507062477, 0.13573642000364, 0.12787691082233, 0.12016321713317,
284     0.11261110693234, 0.10523538898282, 0.09804986534955, 0.09106728977263,
285     0.08429933194438, 0.07775654768810, 0.07144835495683, 0.06538301547324,
286     0.05956762170687, 0.05400808871425, 0.04870915012107, 0.04367435714993,
287     0.03890607899172, 0.03440550179663, 0.03017262174627, 0.02620622428513,
288     0.02250383492507, 0.01906161305732, 0.01587412848221, 0.01293388032354,
289     0.01023019677288, 0.00774641320626, 0.00545109736891, 0.00325868651263,
290 };
291 
292 static const float short_window2[192] = {
293     0.00018861094606, 0.00033433010202, 0.00050309624485, 0.00070306161748,
294     0.00093995174533, 0.00121913067128, 0.00154606505568, 0.00192647806126,
295     0.00236641248692, 0.00287225985240, 0.00345077377440, 0.00410907465023,
296     0.00485464855241, 0.00569534163219, 0.00663935063508, 0.00769520981249,
297     0.00887177436246, 0.01017820046395, 0.01162392194150, 0.01321862359335,
298     0.01497221122468, 0.01689477844427, 0.01899657030441, 0.02128794388846,
299     0.02377932597692, 0.02648116795039, 0.02940389811590, 0.03255787167130,
300     0.03595331854986, 0.03960028941437, 0.04350860009563, 0.04768777479454,
301     0.05214698838949, 0.05689500821121, 0.06194013566525, 0.06729014809766,
302     0.07295224131210, 0.07893297315602, 0.08523820859989, 0.09187306673620,
303     0.09884187012422, 0.10614809690222, 0.11379433608064, 0.12178224641797,
304     0.13011251926531, 0.13878484574660, 0.14779788861830, 0.15714925912610,
305     0.16683549914631, 0.17685206886673, 0.18719334022589, 0.19785259629099,
306     0.20882203671372, 0.22009278936030, 0.23165492816694, 0.24349749722585,
307     0.25560854105961, 0.26797514099368, 0.28058345748882, 0.29341877824732,
308     0.30646557185942, 0.31970754671026, 0.33312771482295, 0.34670846027024,
309 
310     0.36043161174692, 0.37427851885723, 0.38823013163645, 0.40226708279486,
311     0.41636977214436, 0.43051845264462, 0.44469331748632, 0.45887458761470,
312     0.47304259908636, 0.48717788964798, 0.50126128392546, 0.51527397661778,
313     0.52919761310050, 0.54301436685998, 0.55670701320069, 0.57025899869448,
314     0.58365450587230, 0.59687851269542, 0.60991684638414, 0.62275623122793,
315     0.63538433005035, 0.64778977905593, 0.65996221584264, 0.67189230042379,
316     0.68357172916486, 0.69499324160511, 0.70615062019861, 0.71703868307548,
317     0.72765326998919, 0.73799122168099, 0.74805035295521, 0.75782941981995,
318     0.76732808110520, 0.77654685502339, 0.78548707118622, 0.79415081863423,
319     0.80254089047207, 0.81066072573188, 0.81851434910893, 0.82610630922734,
320     0.83344161609862, 0.84052567843230, 0.84736424144524, 0.85396332579459,
321     0.86032916822973, 0.86646816451999, 0.87238681516918, 0.87809167437532,
322     0.88358930263537, 0.88888622333073, 0.89398888356256, 0.89890361943564,
323     0.90363662591861, 0.90819393133744, 0.91258137648979, 0.91680459830070,
324     0.92086901787718, 0.92477983276087, 0.92854201312583, 0.93216030163834,
325     0.93563921662343, 0.93898305819384, 0.94219591693690, 0.94528168477979,
326 
327     0.94823843319821, 0.95106834367330, 0.95377776558539, 0.95636718335775,
328     0.95883679961479, 0.96118650212341, 0.96341583179195, 0.96552395212906,
329     0.96750962060547, 0.96937116231768, 0.97110644638309, 0.97271286544154,
330     0.97418731862798, 0.97552619834964, 0.97672538116257, 0.97778022299974,
331     0.97868555895586, 0.97943570778357, 0.98002448120255, 0.98044519806866,
332     0.98069070339493, 0.98075339216123, 0.98062523779637, 0.98029782516478,
333     0.97976238784222, 0.97900984942031, 0.97803086854002, 0.97681588731895,
334     0.97535518280755, 0.97363892108474, 0.97165721358452, 0.96940017523145,
335     0.96685798395452, 0.96402094114589, 0.96087953263194, 0.95742448973047,
336     0.95364684997699, 0.94953801711660, 0.94508981997396, 0.94029456983253,
337     0.93514511597504, 0.92963489905951, 0.92375800202883, 0.91750919827624,
338     0.91088399681406, 0.90387868421832, 0.89649036314692, 0.88871698725397,
339     0.88055739234735, 0.87201132366062, 0.86307945913336, 0.85376342861693,
340     0.84406582894455, 0.83399023482637, 0.82354120554757, 0.81272428745995,
341     0.80154601230457, 0.79001389138101, 0.77813640562199, 0.76592299164227,
342     0.75338402384395, 0.74053079267526, 0.72737547915460, 0.71393112578527,
343 };
344 
345 static const float short_window3[64] = {
346     0.00326887936450, 0.00550242900936, 0.00786846643791, 0.01045683453520,
347     0.01330402120132, 0.01643221072863, 0.01985798040609, 0.02359509464766,
348     0.02765559221954, 0.03205025893128, 0.03678884369614, 0.04188015679495,
349     0.04733210987781, 0.05315172583924, 0.05934513287609, 0.06591755045290,
350     0.07287327156378, 0.08021564389822, 0.08794705152307, 0.09606889811179,
351     0.10458159240070, 0.11348453632940, 0.12277611617809, 0.13245369691511,
352     0.14251361989876, 0.15295120402567, 0.16376075037904, 0.17493555039885,
353     0.18646789757072, 0.19834910260891, 0.21056951208995, 0.22311853047787,
354     0.23598464546683, 0.24915545655419, 0.26261770674500, 0.27635731727778,
355     0.29035942525136, 0.30460842402318, 0.31908800624032, 0.33378120935681,
356     0.34867046348260, 0.36373764140285, 0.37896411059909, 0.39433078709788,
357     0.40981819096657, 0.42540650327031, 0.44107562429959, 0.45680523287270,
358     0.47257484651351, 0.48836388230077, 0.50415171818214, 0.51991775454258,
359     0.53564147581496, 0.55130251191887, 0.56688069931047, 0.58235614142007,
360     0.59770926827271, 0.61292089506118, 0.62797227945823, 0.64284517745255,
361     0.65752189749349, 0.67198535273209, 0.68621911114984, 0.70020744337099,
362 };
363 
364 static const uint8_t dc_code_tab[5] = { 0, 0, 0, 1, 1 };
365 
366 static const uint8_t ht_code_tab[5] = { 0, 0, 1, 2, 2 };
367 
368 static const uint8_t band_ofs_tab[3][4] = {
369     { 12, 8, 4, 0 }, { 14, 10, 6, 0 }, { 12, 8, 4, 0 }
370 };
371 
372 static const uint8_t band_low_tab[3] = { 9, 17, 24 };
373 
374 static const uint16_t fast_gain_tab[8] = {
375     128, 256, 384, 512, 640, 768, 896, 1024
376 };
377 
378 static const uint16_t slow_decay_tab[2][2] = { { 27, -1 }, { 32, 21 } };
379 
380 static const uint16_t misc_decay_tab[3][2][2] = {
381     { { 354, -1 }, { 425, 425 } },
382     { { 266, -1 }, { 320,  -1 } },
383     { { 213, -1 }, { 256,  -1 } }
384 };
385 
386 static const uint16_t fast_decay_tab[3][2][2][50] = {
387     {{{
388         142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
389         142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
390         142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
391         142, 142, 142, 142, 142, 142, 142, 142,
392     }, {
393          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
394          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
395          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
396          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
397     }}, {{
398         170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
399         170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
400         170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
401         170, 170, 170, 170, 170, 170, 170, 170,
402     }, {
403          64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
404          64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
405          64,  64,  64,  64,  64,  64,  64,  64,  64,  64,
406          64,  64,  64,  64,  64,  64,  64,  64,
407     }}}, {{{
408         266, 266, 106, 106, 106, 106, 106, 106, 106, 106,
409         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
410         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
411         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
412         106, 106, 106, 106,
413     }, {
414          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
415          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
416          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
417          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
418          -1,  -1,  -1,  -1,
419     }}, {{
420         319, 319, 128, 128, 128, 128, 128, 128, 128, 128,
421         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
422         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
423         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
424         128, 128, 128, 128,
425     }, {
426          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
427          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
428          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
429          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
430          -1,  -1,  -1,  -1,
431     }}}, {{{
432         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
433         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
434         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
435         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
436         106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
437     }, {
438          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
439          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
440          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
441          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
442          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
443     }}, {{
444         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
445         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
446         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
447         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
448         128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
449     }, {
450          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
451          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
452          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
453          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
454          -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
455     }}}
456 };
457 
458 static const uint16_t fast_gain_adj_tab[3][2][62] = {
459     {{
460           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
461           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
462           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
463           0,   1,   2,   4,   7,  11,  16,  29,  44,  59,
464          76,  94, 116, 142, 179, 221, 252, 285, 312, 334,
465     }, {
466           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
467           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
468           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
469           2,   5,   8,  10,  15,  28,  42,  57,  75,  93,
470         115, 140, 177, 219, 247, 280, 308, 330, 427, 533,
471     }}, {{
472           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
473           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
474           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
475           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
476           0,   2,   5,   8,  12,  21,  35,  51,  69,  89,
477         111, 138, 176, 220, 251, 284, 312, 334,
478     }, {
479           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
480           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
481           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
482           0,   0,   0,   0,   0,   0,   0,   0,   0,   2,
483           5,   8,  11,  18,  33,  49,  65,  84, 106, 132,
484         168, 214, 245, 279, 308, 329, 427, 533,
485     }}, {{
486           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
487           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
488           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
489           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
490           0,   0,   0,   0,   0,   1,   4,   7,  10,  17,
491          31,  47,  65,  84, 107, 134, 171, 215, 250, 283,
492         312, 334,
493     }, {
494           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
495           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
496           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
497           0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
498           0,   0,   0,   0,   3,   6,   9,  13,  27,  43,
499          60,  79, 100, 126, 160, 207, 242, 276, 307, 329,
500         427, 533,
501     }}
502 };
503 
504 static const uint16_t slow_gain_tab[3][2][50] = {
505     {{
506         3072, 3072, 3072, 3072, 3072, 3072, 1063, 1063, 1063, 1063,
507         1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
508         1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
509         1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
510     }, {
511         3072, 3072, 3072, 3072, 3072, 3072,  850,  850,  850,  850,
512          850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
513          850,  850,  850,  850,  850,  850,  850,  850,  850,  850,
514          850,  850,  850,  850,  850,  850,  850,  850,
515     }}, {{
516         3072, 1212, 1212, 1212,  999,  999,  999,  999,  999,  999,
517          999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
518          999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
519          999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
520          999,  999,  999,  999,
521     }, {
522           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
523           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
524           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
525           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
526           -1,   -1,   -1,   -1,
527     }}, {{
528         3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
529          999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
530          999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
531          999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
532          999,  999,  999,  999,  999,  999,  999,  999,  999,  999,
533     }, {
534           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
535           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
536           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
537           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
538           -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
539     }}
540 };
541 
542 static const uint16_t hearing_thresh_tab[3][3][50] = {
543     {{
544         1403, 1141, 1000,  959,  948,  957,  946,  925,  899,  871,
545          843,  815,  789,  766,  745,  727,  705,  687,  681,  686,
546          701,  725,  768,  854,  940, 1018, 1075, 1103, 1111, 1106,
547         1098, 1105, 1142, 1237, 1419, 1721, 2169, 2805,
548     }, {
549         1401, 1130,  995,  957,  947,  955,  941,  918,  890,  861,
550          831,  803,  777,  754,  734,  717,  698,  684,  682,  692,
551          712,  743,  798,  894,  976, 1045, 1091, 1109, 1110, 1102,
552         1098, 1116, 1174, 1300, 1526, 1884, 2401, 3072,
553     }, {
554         1393, 1086,  974,  949,  957,  941,  913,  878,  843,  808,
555          777,  750,  727,  708,  695,  686,  681,  689,  714,  752,
556          811,  888,  971, 1044, 1087, 1108, 1110, 1102, 1098, 1115,
557         1172, 1290, 1489, 1812, 2293, 2964, 3072, 3072,
558     }}, {{
559         1412, 1343, 1141, 1047, 1000,  974,  959,  951,  948,  947,
560          957,  953,  946,  936,  925,  906,  878,  850,  822,  795,
561          771,  745,  719,  700,  687,  681,  685,  701,  733,  784,
562          885,  977, 1047, 1092, 1110, 1108, 1099, 1102, 1138, 1233,
563         1413, 1711, 2157, 2797,
564     }, {
565         1412, 1336, 1130, 1040,  995,  970,  957,  950,  947,  947,
566          955,  950,  941,  930,  918,  897,  868,  838,  810,  783,
567          759,  734,  710,  693,  684,  681,  690,  712,  752,  823,
568          924, 1009, 1069, 1102, 1111, 1104, 1098, 1111, 1168, 1295,
569         1518, 1873, 2388, 3072,
570     }, {
571         1411, 1293, 1086, 1009,  974,  957,  949,  947,  957,  951,
572          941,  928,  913,  896,  878,  852,  817,  785,  756,  732,
573          713,  695,  683,  682,  689,  710,  746,  811,  906,  992,
574         1061, 1099, 1111, 1106, 1098, 1107, 1155, 1266, 1471, 1799,
575         2277, 2945, 3072, 3072,
576     }}, {{
577         1431, 1412, 1403, 1379, 1343, 1293, 1229, 1180, 1125, 1075,
578         1040, 1014,  996,  979,  965,  957,  951,  948,  947,  957,
579          951,  940,  924,  903,  877,  846,  815,  785,  753,  725,
580          702,  686,  681,  689,  714,  760,  847,  947, 1028, 1083,
581         1108, 1109, 1101, 1100, 1132, 1222, 1402, 1705, 2160, 2803,
582     }, {
583         1431, 1412, 1401, 1375, 1336, 1278, 1215, 1168, 1115, 1066,
584         1032, 1008,  991,  975,  962,  954,  950,  947,  947,  955,
585          948,  935,  916,  894,  866,  835,  803,  772,  742,  715,
586          695,  683,  683,  697,  729,  784,  887,  982, 1054, 1096,
587         1111, 1106, 1098, 1107, 1159, 1281, 1505, 1865, 2391, 3072,
588     }, {
589         1427, 1411, 1393, 1353, 1293, 1215, 1160, 1118, 1072, 1031,
590         1003,  984,  971,  960,  952,  948,  947,  957,  952,  941,
591          924,  902,  876,  847,  815,  781,  750,  723,  700,  685,
592          681,  691,  719,  766,  858,  958, 1039, 1089, 1109, 1108,
593         1099, 1102, 1141, 1245, 1442, 1766, 2250, 2930, 3072, 3072,
594     }}
595 };
596 
597 static const int16_t lwc_gain_tab[11][7] = {
598     {   -21,  -197,  -271,  -466, 32767, 32767, 32767 },
599     {  -197,   -29,  -244,  -271,  -540, 32767, 32767 },
600     {  -271,  -244,   -29,  -249,  -271,  -593, 32767 },
601     {  -466,  -271,  -249,   -29,  -251,  -271,  -632 },
602     {  -540,  -271,  -251,   -29,  -251,  -271,  -664 },
603     {  -593,  -271,  -251,   -29,  -252,  -271,  -690 },
604     {  -632,  -271,  -252,   -29,  -252,  -271,  -711 },
605     {  -664,  -271,  -252,   -29,  -252,  -271,  -730 },
606     {  -690,  -271,  -252,   -29,  -252,  -271,  -745 },
607     {  -711,  -271,  -252,   -29,  -253,  -271,  -759 },
608     {  -730,  -271,  -253,   -29,  -253,  -271,  -771 },
609 };
610 
611 static const int16_t lwc_adj_tab[7] = {
612     -192, -320, -448, -512, -448, -320, -192,
613 };
614 
615 static const uint8_t log_add_tab[212] = {
616     64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 52, 51, 50,
617     49, 48, 47, 47, 46, 45, 44, 44, 43, 42, 41, 41, 40, 39, 38, 38,
618     37, 36, 36, 35, 35, 34, 33, 33, 32, 32, 31, 30, 30, 29, 29, 28,
619     28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 21,
620     20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15,
621     15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11,
622     10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  8,  8,  8,  8,  8,  8,
623      7,  7,  7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,
624      5,  5,  5,  5,  5,  5,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
625      4,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  2,
626      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
627      2,  2,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
628      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
629      1,  1,  0,  0,
630 };
631 
632 static const uint8_t bap_tab[64] = {
633      0,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  3,  3,  3,  3,  4,
634      4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,
635      8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11, 12,
636     12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15,
637 };
638 
639 static float mantissa_tab1[17][4];
640 static float mantissa_tab2[17][4];
641 static float mantissa_tab3[17][4];
642 static float exponent_tab[50];
643 static float gain_tab[1024];
644 
645 DECLARE_ALIGNED(32, static float, window)[3712];
646 
647 #endif
648