dolby_e.h 29 KB

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