2 * Copyright (C) 2017 foo86
4 * This file is part of FFmpeg.
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.
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.
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
21 #ifndef AVCODEC_DOLBY_E_H
22 #define AVCODEC_DOLBY_E_H
24 #include "libavutil/float_dsp.h"
25 #include "libavutil/libm.h"
26 #include "libavutil/mem.h"
33 #define FRAME_SAMPLES 1792
35 #define MAX_PROG_CONF 23
36 #define MAX_PROGRAMS 8
37 #define MAX_CHANNELS 8
38 #define MAX_SEGMENTS 2
41 #define MAX_EXPONENTS 304
42 #define MAX_MANTISSAS 1024
44 #define MAX_MSTR_EXP 2
45 #define MAX_BIAS_EXP 50
47 typedef struct DBEGroup {
49 uint8_t nb_bias_exp[MAX_MSTR_EXP];
52 const uint8_t *nb_mantissa;
61 typedef struct DBEChannel {
67 DBEGroup groups[MAX_GROUPS];
69 int exp_strategy[MAX_GROUPS];
70 int exponents[MAX_EXPONENTS];
71 int bap[MAX_EXPONENTS];
72 int idx[MAX_EXPONENTS];
74 DECLARE_ALIGNED(32, float, mantissas)[MAX_MANTISSAS];
77 typedef struct DBEContext {
78 AVCodecContext *avctx;
95 int ch_size[MAX_CHANNELS];
99 int rev_id[MAX_CHANNELS];
100 int begin_gain[MAX_CHANNELS];
101 int end_gain[MAX_CHANNELS];
103 int multi_prog_warned;
105 DBEChannel channels[MAX_SEGMENTS][MAX_CHANNELS];
107 DECLARE_ALIGNED(32, float, history)[MAX_CHANNELS][256];
110 AVFloatDSPContext *fdsp;
112 uint8_t buffer[1024 * 3 + AV_INPUT_BUFFER_PADDING_SIZE];
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
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
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
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 };
133 static const uint16_t sample_rate_tab[16] = {
134 0, 42965, 43008, 44800, 53706, 53760
137 static const uint8_t nb_groups_tab[4] = { 1, 8, 7, 1 };
139 static const uint8_t nb_mstr_exp_tab[4] = { 2, 2, 2, 1 };
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,
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,
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,
160 static const uint8_t imdct_bits_tab[3] = { 8, 9, 11 };
162 static const DBEGroup grp_tab_0[1] = {
163 { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
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 },
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 },
187 static const DBEGroup grp_tab_3[1] = {
188 { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
191 static const DBEGroup grp_tab_4[1] = {
192 { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
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 },
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 },
216 static const DBEGroup grp_tab_7[1] = {
217 { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
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 }
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 },
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 },
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,
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,
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,
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,
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,
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,
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,
364 static const uint8_t dc_code_tab[5] = { 0, 0, 0, 1, 1 };
366 static const uint8_t ht_code_tab[5] = { 0, 0, 1, 2, 2 };
368 static const uint8_t band_ofs_tab[3][4] = {
369 { 12, 8, 4, 0 }, { 14, 10, 6, 0 }, { 12, 8, 4, 0 }
372 static const uint8_t band_low_tab[3] = { 9, 17, 24 };
374 static const uint16_t fast_gain_tab[8] = {
375 128, 256, 384, 512, 640, 768, 896, 1024
378 static const uint16_t slow_decay_tab[2][2] = { { 27, -1 }, { 32, 21 } };
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 } }
386 static const uint16_t fast_decay_tab[3][2][2][50] = {
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
458 static const uint16_t fast_gain_adj_tab[3][2][62] = {
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,
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,
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,
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,
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,
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,
504 static const uint16_t slow_gain_tab[3][2][50] = {
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,
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,
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,
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,
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,
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,
542 static const uint16_t hearing_thresh_tab[3][3][50] = {
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,
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,
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,
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,
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,
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,
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,
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,
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,
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 },
611 static const int16_t lwc_adj_tab[7] = {
612 -192, -320, -448, -512, -448, -320, -192,
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,
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,
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];
645 DECLARE_ALIGNED(32, static float, window)[3712];
647 static av_cold void init_tables(void)
651 for (i = 1; i < 17; i++)
652 mantissa_tab1[i][0] = 1.0f / (1 << i - 1);
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);
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);
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);
672 mantissa_tab3[1][3] = 0.6875f;
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);
679 for (i = 1; i < 1024; i++)
680 gain_tab[i] = exp2f((i - 960) / 64.0f);
683 ff_kbd_window_init(window, 3.0f, 128);
684 for (i = 0; i < 128; i++)
685 window[128 + i] = window[127 - i];
688 for (i = 0; i < 192; i++)
689 window[256 + i] = start_window[i];
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];
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];
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;
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];
717 for (i = 0; i < 192; i++)
718 window[2560 + i] = window[447 - i];
721 for (i = 0; i < 256; i++)
722 window[2752 + i] = window[703 - i];
725 for (i = 0; i < 256; i++)
726 window[3008 + i] = window[959 - i];
729 for (i = 0; i < 448; i++)
730 window[3264 + i] = window[1407 - i];