]> git.sesse.net Git - ffmpeg/blob - libavcodec/dolby_e.h
avcodec/snowdec: Check intra block dc differences.
[ffmpeg] / libavcodec / dolby_e.h
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 static av_cold void init_tables(void)
648 {
649     int i, j;
650
651     for (i = 1; i < 17; i++)
652         mantissa_tab1[i][0] = 1.0f / (1 << i - 1);
653
654     for (i = 2; i < 16; i++) {
655         mantissa_tab1[i][1] = 1.0f  / ((1 << i) - 1);
656         mantissa_tab1[i][2] = 0.5f  / ((1 << i) - 1);
657         mantissa_tab1[i][3] = 0.25f / ((1 << i) - 1);
658     }
659
660     mantissa_tab1[i][1] = 0.5f   / (1 << 15);
661     mantissa_tab1[i][2] = 0.75f  / (1 << 15);
662     mantissa_tab1[i][3] = 0.875f / (1 << 15);
663
664     for (i = 1; i < 17; i++) {
665         mantissa_tab2[i][1] = mantissa_tab1[i][0] * 0.5f;
666         mantissa_tab2[i][2] = mantissa_tab1[i][0] * 0.75f;
667         mantissa_tab2[i][3] = mantissa_tab1[i][0] * 0.875f;
668         for (j = 1; j < 4; j++)
669             mantissa_tab3[i][j] = 1.0f / (1 << i) + 1.0f / (1 << j) - 1.0f / (1 << i + j);
670     }
671
672     mantissa_tab3[1][3] = 0.6875f;
673
674     for (i = 0; i < 25; i++) {
675         exponent_tab[i * 2    ] = 1.0f      / (1 << i);
676         exponent_tab[i * 2 + 1] = M_SQRT1_2 / (1 << i);
677     }
678
679     for (i = 1; i < 1024; i++)
680         gain_tab[i] = exp2f((i - 960) / 64.0f);
681
682     // short 1
683     ff_kbd_window_init(window, 3.0f, 128);
684     for (i = 0; i < 128; i++)
685         window[128 + i] = window[127 - i];
686
687     // start
688     for (i = 0; i < 192; i++)
689         window[256 + i] = start_window[i];
690
691     // short 2
692     for (i = 0; i < 192; i++)
693         window[448 + i] = short_window2[i];
694     for (i = 0; i < 64; i++)
695         window[640 + i] = window[63 - i];
696
697     // short 3
698     for (i = 0; i < 64; i++)
699         window[704 + i] = short_window3[i];
700     for (i = 0; i < 192; i++)
701         window[768 + i] = window[64 + i];
702
703     // bridge
704     for (i = 0; i < 128; i++)
705         window[960 + i] = window[i];
706     for (i = 0; i < 64; i++)
707         window[1088 + i] = 1.0f;
708
709     // long
710     ff_kbd_window_init(window + 1408, 3.0f, 256);
711     for (i = 0; i < 640; i++)
712         window[1664 + i] = 1.0f;
713     for (i = 0; i < 256; i++)
714         window[2304 + i] = window[1152 + i] = window[1663 - i];
715
716     // reverse start
717     for (i = 0; i < 192; i++)
718         window[2560 + i] = window[447 - i];
719
720     // reverse short 2
721     for (i = 0; i < 256; i++)
722         window[2752 + i] = window[703 - i];
723
724     // reverse short 3
725     for (i = 0; i < 256; i++)
726         window[3008 + i] = window[959 - i];
727
728     // reverse bridge
729     for (i = 0; i < 448; i++)
730         window[3264 + i] = window[1407 - i];
731 }
732
733 #endif