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