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