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 #include "libavutil/float_dsp.h"
22 #include "libavutil/thread.h"
23 #include "libavutil/mem.h"
24 #include "libavutil/mem_internal.h"
25
26 #include "internal.h"
27 #include "get_bits.h"
28 #include "dolby_e.h"
29 #include "kbdwin.h"
30 #include "fft.h"
31
32 #define MAX_SEGMENTS 2
33
34 #define MAX_GROUPS 8
35 #define MAX_EXPONENTS 304
36 #define MAX_MANTISSAS 1024
37
38 #define MAX_MSTR_EXP 2
39 #define MAX_BIAS_EXP 50
40
41 typedef struct DBEGroup {
42 uint8_t nb_exponent;
43 uint8_t nb_bias_exp[MAX_MSTR_EXP];
44 uint16_t exp_ofs;
45 uint16_t mnt_ofs;
46 const uint8_t *nb_mantissa;
47 uint8_t imdct_idx;
48 uint8_t imdct_phs;
49 uint16_t win_len;
50 uint16_t dst_ofs;
51 uint16_t win_ofs;
52 uint16_t src_ofs;
53 } DBEGroup;
54
55 typedef struct DBEChannel {
56 int gr_code;
57 int bw_code;
58
59 int nb_groups;
60 int nb_mstr_exp;
61 DBEGroup groups[MAX_GROUPS];
62
63 int exp_strategy[MAX_GROUPS];
64 int exponents[MAX_EXPONENTS];
65 int bap[MAX_EXPONENTS];
66 int idx[MAX_EXPONENTS];
67
68 DECLARE_ALIGNED(32, float, mantissas)[MAX_MANTISSAS];
69 } DBEChannel;
70
71 typedef struct DBEDecodeContext {
72 AVCodecContext *avctx;
73 DBEContext dectx;
74
75 DBEChannel channels[MAX_SEGMENTS][MAX_CHANNELS];
76
77 DECLARE_ALIGNED(32, float, history)[MAX_CHANNELS][256];
78
79 FFTContext imdct[3];
80 AVFloatDSPContext *fdsp;
81 } DBEDecodeContext;
82
83 static const int8_t lfe_channel_tab[MAX_PROG_CONF + 1] = {
84 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4,
85 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5
86 };
87
88 static const uint8_t ch_reorder_4[4] = { 0, 2, 1, 3 };
89 static const uint8_t ch_reorder_6[6] = { 0, 2, 4, 1, 3, 5 };
90 static const uint8_t ch_reorder_8[8] = { 0, 2, 6, 4, 1, 3, 7, 5 };
91 static const uint8_t ch_reorder_n[8] = { 0, 2, 4, 6, 1, 3, 5, 7 };
92
93
94 static const uint8_t nb_groups_tab[4] = { 1, 8, 7, 1 };
95
96 static const uint8_t nb_mstr_exp_tab[4] = { 2, 2, 2, 1 };
97
98 static const uint8_t nb_mantissa_38[38] = {
99 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
100 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6,
101 7, 8, 9, 10, 11, 12,
102 };
103
104 static const uint8_t nb_mantissa_44[44] = {
105 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
106 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 7, 7,
107 8, 9, 10, 11, 12, 13, 15, 16, 18, 20, 22, 25,
108 };
109
110 static const uint8_t nb_mantissa_50[50] = {
111 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3,
112 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 12, 13, 14, 16,
113 18, 19, 22, 24, 27, 29, 32, 36, 40, 44, 49, 54, 60, 66, 74, 82,
114 90, 100,
115 };
116
117 static const uint8_t imdct_bits_tab[3] = { 8, 9, 11 };
118
119 static const DBEGroup grp_tab_0[1] = {
120 { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
121 };
122
123 static const DBEGroup grp_tab_1[8] = {
124 { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 },
125 { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 },
126 { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 },
127 { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
128 { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
129 { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
130 { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 704, 0, 0 },
131 { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 1, 256, 832, 0, 0 },
132 };
133
134 static const DBEGroup grp_tab_2[7] = {
135 { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 0, 192, 0, 256, 0 },
136 { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 64, 448, 0 },
137 { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 192, 704, 0 },
138 { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
139 { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
140 { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
141 { 44, { 19, 25 }, 228, 768, nb_mantissa_44, 1, 1, 448, 704, 960, 64 },
142 };
143
144 static const DBEGroup grp_tab_3[1] = {
145 { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
146 };
147
148 static const DBEGroup grp_tab_4[1] = {
149 { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
150 };
151
152 static const DBEGroup grp_tab_5[8] = {
153 { 38, { 12, 26 }, 0, 0, nb_mantissa_38, 0, 1, 256, 64, 0, 0 },
154 { 38, { 12, 26 }, 38, 128, nb_mantissa_38, 0, 1, 256, 192, 0, 0 },
155 { 38, { 12, 26 }, 76, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
156 { 38, { 12, 26 }, 114, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
157 { 38, { 12, 26 }, 152, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
158 { 38, { 12, 26 }, 190, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 },
159 { 38, { 12, 26 }, 228, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 },
160 { 38, { 12, 26 }, 266, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 },
161 };
162
163 static const DBEGroup grp_tab_6[7] = {
164 { 44, { 19, 25 }, 0, 0, nb_mantissa_44, 1, 1, 448, 0, 3264, 0 },
165 { 38, { 12, 26 }, 44, 256, nb_mantissa_38, 0, 1, 256, 320, 0, 0 },
166 { 38, { 12, 26 }, 82, 384, nb_mantissa_38, 0, 1, 256, 448, 0, 0 },
167 { 38, { 12, 26 }, 120, 512, nb_mantissa_38, 0, 1, 256, 576, 0, 0 },
168 { 38, { 12, 26 }, 158, 640, nb_mantissa_38, 0, 1, 256, 704, 3008, 0 },
169 { 38, { 12, 26 }, 196, 768, nb_mantissa_38, 0, 1, 256, 832, 2752, 0 },
170 { 38, { 12, 26 }, 234, 896, nb_mantissa_38, 0, 2, 192, 960, 2560, 64 },
171 };
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
177 static const DBEGroup *const frm_ofs_tab[2][4] = {
178 { grp_tab_0, grp_tab_1, grp_tab_2, grp_tab_3 },
179 { grp_tab_4, grp_tab_5, grp_tab_6, grp_tab_7 }
180 };
181
182 static const uint8_t mantissa_size1[16][4] = {
183 { 0, 0, 0, 0 }, { 2, 1, 1, 1 }, { 3, 2, 1, 1 }, { 4, 3, 2, 1 },
184 { 5, 4, 3, 2 }, { 6, 5, 4, 3 }, { 7, 6, 5, 4 }, { 8, 7, 6, 5 },
185 { 9, 8, 7, 6 }, { 10, 9, 8, 7 }, { 11, 10, 9, 8 }, { 12, 11, 10, 9 },
186 { 13, 12, 11, 10 }, { 14, 13, 12, 11 }, { 15, 14, 13, 12 }, { 16, 15, 14, 13 },
187 };
188
189 static const uint8_t mantissa_size2[16][4] = {
190 { 0, 0, 0, 0 }, { 2, 1, 2, 2 }, { 3, 2, 3, 3 }, { 4, 3, 4, 4 },
191 { 5, 4, 5, 5 }, { 6, 5, 6, 6 }, { 7, 6, 7, 7 }, { 8, 7, 8, 8 },
192 { 9, 8, 9, 9 }, { 10, 9, 10, 10 }, { 11, 10, 11, 11 }, { 12, 11, 12, 12 },
193 { 13, 12, 13, 13 }, { 14, 13, 14, 14 }, { 15, 14, 15, 15 }, { 16, 15, 16, 16 },
194 };
195
196 static const float start_window[192] = {
197 0.00161569379826, 0.00185748233347, 0.00198562758548, 0.00207834078104,
198 0.00215717748523, 0.00223067096393, 0.00230299213147, 0.00237651215396,
199 0.00245275561606, 0.00253281402069, 0.00261754673613, 0.00270768786168,
200 0.00280390761895, 0.00290684998656, 0.00301715751161, 0.00313548872798,
201 0.00326253122934, 0.00339901215995, 0.00354570716636, 0.00370344845023,
202 0.00387313232586, 0.00405572653911, 0.00425227750970, 0.00446391759265,
203 0.00469187240551, 0.00493746822816, 0.00520213944619, 0.00548743597507,
204 0.00579503056737, 0.00612672586953, 0.00648446105606, 0.00687031782873,
205 0.00728652552677, 0.00773546505205, 0.00821967127415, 0.00874183354619,
206 0.00930479393832, 0.00991154278653, 0.01056521116692, 0.01126905994567,
207 0.01202646513050, 0.01284089936559, 0.01371590957417, 0.01465509096066,
208 0.01566205783408, 0.01674041199523, 0.01789370972358, 0.01912542867865,
209 0.02043893626265, 0.02183746113793, 0.02332406961796, 0.02490164852364,
210 0.02657289580178, 0.02834031974193, 0.03020624702903, 0.03217283918354,
211 0.03424211623810, 0.03641598586180, 0.03869627565015, 0.04108476601498,
212 0.04358322107390, 0.04619341515939, 0.04891715301882, 0.05175628239149,
213
214 0.05471237327267, 0.05778734733755, 0.06098291402413, 0.06430101352084,
215 0.06774345212186, 0.07131188644726, 0.07500780649199, 0.07883251748595,
216 0.08278712056651, 0.08687249228061, 0.09108926295730, 0.09543779401074,
217 0.09991815425851, 0.10453009536427, 0.10927302653894, 0.11414598865987,
218 0.11914762799220, 0.12427616972097, 0.12952939152560, 0.13490459744934,
219 0.14039859233595, 0.14600765712201, 0.15172752528722, 0.15755336077528,
220 0.16347973770491, 0.16950062219342, 0.17560935661442, 0.18179864660619,
221 0.18806055113821, 0.19438647593012, 0.20076717050010, 0.20719272909882,
222 0.21365259576030, 0.22013557367283, 0.22662983904194, 0.23312295958328,
223 0.23960191774666, 0.24605313873388, 0.25246252333253, 0.25881548554631,
224 0.26509699495987, 0.27129162373316, 0.27738359807707, 0.28335685401987,
225 0.28919509723179, 0.29488186663467, 0.30040060148455, 0.30573471157819,
226 0.31086765019993, 0.31578298939317, 0.32046449711227, 0.32489621578468,
227 0.32906254179156, 0.33294830535654, 0.33653885031840, 0.33982011325336,
228 0.34277870140679, 0.34540196889300, 0.34767809062480, 0.34959613344194,
229 0.35114612391958, 0.35231911235422, 0.35310723244504, 0.35350375621308,
230
231 0.35350314372945, 0.35310108725579, 0.35229454943591, 0.35108179521634,
232 0.34946241721522, 0.34743735430290, 0.34500890320420, 0.34218072298001,
233 0.33895783229541, 0.33534659943168, 0.33135472505060, 0.32699121776996,
234 0.32226636266000, 0.31719168282019, 0.31177989424432, 0.30604485422875,
235 0.30000150362379, 0.29366580327088, 0.28705466500775, 0.28018587766131,
236 0.27307802848095, 0.26575042049535, 0.25822298630189, 0.25051619882000,
237 0.24265097955783, 0.23464860495522, 0.22653061137548, 0.21831869932335,
238 0.21003463746705, 0.20170016703857, 0.19333690717811, 0.18496626177620,
239 0.17660932835062, 0.16828680947474, 0.16001892724986, 0.15182534128597,
240 0.14372507062477, 0.13573642000364, 0.12787691082233, 0.12016321713317,
241 0.11261110693234, 0.10523538898282, 0.09804986534955, 0.09106728977263,
242 0.08429933194438, 0.07775654768810, 0.07144835495683, 0.06538301547324,
243 0.05956762170687, 0.05400808871425, 0.04870915012107, 0.04367435714993,
244 0.03890607899172, 0.03440550179663, 0.03017262174627, 0.02620622428513,
245 0.02250383492507, 0.01906161305732, 0.01587412848221, 0.01293388032354,
246 0.01023019677288, 0.00774641320626, 0.00545109736891, 0.00325868651263,
247 };
248
249 static const float short_window2[192] = {
250 0.00018861094606, 0.00033433010202, 0.00050309624485, 0.00070306161748,
251 0.00093995174533, 0.00121913067128, 0.00154606505568, 0.00192647806126,
252 0.00236641248692, 0.00287225985240, 0.00345077377440, 0.00410907465023,
253 0.00485464855241, 0.00569534163219, 0.00663935063508, 0.00769520981249,
254 0.00887177436246, 0.01017820046395, 0.01162392194150, 0.01321862359335,
255 0.01497221122468, 0.01689477844427, 0.01899657030441, 0.02128794388846,
256 0.02377932597692, 0.02648116795039, 0.02940389811590, 0.03255787167130,
257 0.03595331854986, 0.03960028941437, 0.04350860009563, 0.04768777479454,
258 0.05214698838949, 0.05689500821121, 0.06194013566525, 0.06729014809766,
259 0.07295224131210, 0.07893297315602, 0.08523820859989, 0.09187306673620,
260 0.09884187012422, 0.10614809690222, 0.11379433608064, 0.12178224641797,
261 0.13011251926531, 0.13878484574660, 0.14779788861830, 0.15714925912610,
262 0.16683549914631, 0.17685206886673, 0.18719334022589, 0.19785259629099,
263 0.20882203671372, 0.22009278936030, 0.23165492816694, 0.24349749722585,
264 0.25560854105961, 0.26797514099368, 0.28058345748882, 0.29341877824732,
265 0.30646557185942, 0.31970754671026, 0.33312771482295, 0.34670846027024,
266
267 0.36043161174692, 0.37427851885723, 0.38823013163645, 0.40226708279486,
268 0.41636977214436, 0.43051845264462, 0.44469331748632, 0.45887458761470,
269 0.47304259908636, 0.48717788964798, 0.50126128392546, 0.51527397661778,
270 0.52919761310050, 0.54301436685998, 0.55670701320069, 0.57025899869448,
271 0.58365450587230, 0.59687851269542, 0.60991684638414, 0.62275623122793,
272 0.63538433005035, 0.64778977905593, 0.65996221584264, 0.67189230042379,
273 0.68357172916486, 0.69499324160511, 0.70615062019861, 0.71703868307548,
274 0.72765326998919, 0.73799122168099, 0.74805035295521, 0.75782941981995,
275 0.76732808110520, 0.77654685502339, 0.78548707118622, 0.79415081863423,
276 0.80254089047207, 0.81066072573188, 0.81851434910893, 0.82610630922734,
277 0.83344161609862, 0.84052567843230, 0.84736424144524, 0.85396332579459,
278 0.86032916822973, 0.86646816451999, 0.87238681516918, 0.87809167437532,
279 0.88358930263537, 0.88888622333073, 0.89398888356256, 0.89890361943564,
280 0.90363662591861, 0.90819393133744, 0.91258137648979, 0.91680459830070,
281 0.92086901787718, 0.92477983276087, 0.92854201312583, 0.93216030163834,
282 0.93563921662343, 0.93898305819384, 0.94219591693690, 0.94528168477979,
283
284 0.94823843319821, 0.95106834367330, 0.95377776558539, 0.95636718335775,
285 0.95883679961479, 0.96118650212341, 0.96341583179195, 0.96552395212906,
286 0.96750962060547, 0.96937116231768, 0.97110644638309, 0.97271286544154,
287 0.97418731862798, 0.97552619834964, 0.97672538116257, 0.97778022299974,
288 0.97868555895586, 0.97943570778357, 0.98002448120255, 0.98044519806866,
289 0.98069070339493, 0.98075339216123, 0.98062523779637, 0.98029782516478,
290 0.97976238784222, 0.97900984942031, 0.97803086854002, 0.97681588731895,
291 0.97535518280755, 0.97363892108474, 0.97165721358452, 0.96940017523145,
292 0.96685798395452, 0.96402094114589, 0.96087953263194, 0.95742448973047,
293 0.95364684997699, 0.94953801711660, 0.94508981997396, 0.94029456983253,
294 0.93514511597504, 0.92963489905951, 0.92375800202883, 0.91750919827624,
295 0.91088399681406, 0.90387868421832, 0.89649036314692, 0.88871698725397,
296 0.88055739234735, 0.87201132366062, 0.86307945913336, 0.85376342861693,
297 0.84406582894455, 0.83399023482637, 0.82354120554757, 0.81272428745995,
298 0.80154601230457, 0.79001389138101, 0.77813640562199, 0.76592299164227,
299 0.75338402384395, 0.74053079267526, 0.72737547915460, 0.71393112578527,
300 };
301
302 static const float short_window3[64] = {
303 0.00326887936450, 0.00550242900936, 0.00786846643791, 0.01045683453520,
304 0.01330402120132, 0.01643221072863, 0.01985798040609, 0.02359509464766,
305 0.02765559221954, 0.03205025893128, 0.03678884369614, 0.04188015679495,
306 0.04733210987781, 0.05315172583924, 0.05934513287609, 0.06591755045290,
307 0.07287327156378, 0.08021564389822, 0.08794705152307, 0.09606889811179,
308 0.10458159240070, 0.11348453632940, 0.12277611617809, 0.13245369691511,
309 0.14251361989876, 0.15295120402567, 0.16376075037904, 0.17493555039885,
310 0.18646789757072, 0.19834910260891, 0.21056951208995, 0.22311853047787,
311 0.23598464546683, 0.24915545655419, 0.26261770674500, 0.27635731727778,
312 0.29035942525136, 0.30460842402318, 0.31908800624032, 0.33378120935681,
313 0.34867046348260, 0.36373764140285, 0.37896411059909, 0.39433078709788,
314 0.40981819096657, 0.42540650327031, 0.44107562429959, 0.45680523287270,
315 0.47257484651351, 0.48836388230077, 0.50415171818214, 0.51991775454258,
316 0.53564147581496, 0.55130251191887, 0.56688069931047, 0.58235614142007,
317 0.59770926827271, 0.61292089506118, 0.62797227945823, 0.64284517745255,
318 0.65752189749349, 0.67198535273209, 0.68621911114984, 0.70020744337099,
319 };
320
321 static const uint8_t dc_code_tab[5] = { 0, 0, 0, 1, 1 };
322
323 static const uint8_t ht_code_tab[5] = { 0, 0, 1, 2, 2 };
324
325 static const uint8_t band_ofs_tab[3][4] = {
326 { 12, 8, 4, 0 }, { 14, 10, 6, 0 }, { 12, 8, 4, 0 }
327 };
328
329 static const uint8_t band_low_tab[3] = { 9, 17, 24 };
330
331 static const uint16_t fast_gain_tab[8] = {
332 128, 256, 384, 512, 640, 768, 896, 1024
333 };
334
335 static const uint16_t slow_decay_tab[2][2] = { { 27, -1 }, { 32, 21 } };
336
337 static const uint16_t misc_decay_tab[3][2][2] = {
338 { { 354, -1 }, { 425, 425 } },
339 { { 266, -1 }, { 320, -1 } },
340 { { 213, -1 }, { 256, -1 } }
341 };
342
343 static const uint16_t fast_decay_tab[3][2][2][50] = {
344 {{{
345 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
346 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
347 142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
348 142, 142, 142, 142, 142, 142, 142, 142,
349 }, {
350 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
351 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
352 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
353 -1, -1, -1, -1, -1, -1, -1, -1,
354 }}, {{
355 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
356 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
357 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
358 170, 170, 170, 170, 170, 170, 170, 170,
359 }, {
360 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
361 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
362 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
363 64, 64, 64, 64, 64, 64, 64, 64,
364 }}}, {{{
365 266, 266, 106, 106, 106, 106, 106, 106, 106, 106,
366 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
367 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
368 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
369 106, 106, 106, 106,
370 }, {
371 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
372 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
373 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
374 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
375 -1, -1, -1, -1,
376 }}, {{
377 319, 319, 128, 128, 128, 128, 128, 128, 128, 128,
378 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
379 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
380 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
381 128, 128, 128, 128,
382 }, {
383 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
384 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
385 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
386 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
387 -1, -1, -1, -1,
388 }}}, {{{
389 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
390 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
391 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
392 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
393 106, 106, 106, 106, 106, 106, 106, 106, 106, 106,
394 }, {
395 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
396 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
397 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
398 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
399 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
400 }}, {{
401 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
402 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
403 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
404 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
405 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
406 }, {
407 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
408 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
409 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
410 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
411 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
412 }}}
413 };
414
415 static const uint16_t fast_gain_adj_tab[3][2][62] = {
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, 1, 2, 4, 7, 11, 16, 29, 44, 59,
421 76, 94, 116, 142, 179, 221, 252, 285, 312, 334,
422 }, {
423 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
424 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
425 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
426 2, 5, 8, 10, 15, 28, 42, 57, 75, 93,
427 115, 140, 177, 219, 247, 280, 308, 330, 427, 533,
428 }}, {{
429 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
430 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
431 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
432 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
433 0, 2, 5, 8, 12, 21, 35, 51, 69, 89,
434 111, 138, 176, 220, 251, 284, 312, 334,
435 }, {
436 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
437 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
438 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
439 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
440 5, 8, 11, 18, 33, 49, 65, 84, 106, 132,
441 168, 214, 245, 279, 308, 329, 427, 533,
442 }}, {{
443 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
444 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
445 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
446 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
447 0, 0, 0, 0, 0, 1, 4, 7, 10, 17,
448 31, 47, 65, 84, 107, 134, 171, 215, 250, 283,
449 312, 334,
450 }, {
451 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
452 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
453 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
454 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
455 0, 0, 0, 0, 3, 6, 9, 13, 27, 43,
456 60, 79, 100, 126, 160, 207, 242, 276, 307, 329,
457 427, 533,
458 }}
459 };
460
461 static const uint16_t slow_gain_tab[3][2][50] = {
462 {{
463 3072, 3072, 3072, 3072, 3072, 3072, 1063, 1063, 1063, 1063,
464 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
465 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
466 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
467 }, {
468 3072, 3072, 3072, 3072, 3072, 3072, 850, 850, 850, 850,
469 850, 850, 850, 850, 850, 850, 850, 850, 850, 850,
470 850, 850, 850, 850, 850, 850, 850, 850, 850, 850,
471 850, 850, 850, 850, 850, 850, 850, 850,
472 }}, {{
473 3072, 1212, 1212, 1212, 999, 999, 999, 999, 999, 999,
474 999, 999, 999, 999, 999, 999, 999, 999, 999, 999,
475 999, 999, 999, 999, 999, 999, 999, 999, 999, 999,
476 999, 999, 999, 999, 999, 999, 999, 999, 999, 999,
477 999, 999, 999, 999,
478 }, {
479 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
480 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
481 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
482 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
483 -1, -1, -1, -1,
484 }}, {{
485 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072, 3072,
486 999, 999, 999, 999, 999, 999, 999, 999, 999, 999,
487 999, 999, 999, 999, 999, 999, 999, 999, 999, 999,
488 999, 999, 999, 999, 999, 999, 999, 999, 999, 999,
489 999, 999, 999, 999, 999, 999, 999, 999, 999, 999,
490 }, {
491 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
492 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
493 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
494 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
495 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
496 }}
497 };
498
499 static const uint16_t hearing_thresh_tab[3][3][50] = {
500 {{
501 1403, 1141, 1000, 959, 948, 957, 946, 925, 899, 871,
502 843, 815, 789, 766, 745, 727, 705, 687, 681, 686,
503 701, 725, 768, 854, 940, 1018, 1075, 1103, 1111, 1106,
504 1098, 1105, 1142, 1237, 1419, 1721, 2169, 2805,
505 }, {
506 1401, 1130, 995, 957, 947, 955, 941, 918, 890, 861,
507 831, 803, 777, 754, 734, 717, 698, 684, 682, 692,
508 712, 743, 798, 894, 976, 1045, 1091, 1109, 1110, 1102,
509 1098, 1116, 1174, 1300, 1526, 1884, 2401, 3072,
510 }, {
511 1393, 1086, 974, 949, 957, 941, 913, 878, 843, 808,
512 777, 750, 727, 708, 695, 686, 681, 689, 714, 752,
513 811, 888, 971, 1044, 1087, 1108, 1110, 1102, 1098, 1115,
514 1172, 1290, 1489, 1812, 2293, 2964, 3072, 3072,
515 }}, {{
516 1412, 1343, 1141, 1047, 1000, 974, 959, 951, 948, 947,
517 957, 953, 946, 936, 925, 906, 878, 850, 822, 795,
518 771, 745, 719, 700, 687, 681, 685, 701, 733, 784,
519 885, 977, 1047, 1092, 1110, 1108, 1099, 1102, 1138, 1233,
520 1413, 1711, 2157, 2797,
521 }, {
522 1412, 1336, 1130, 1040, 995, 970, 957, 950, 947, 947,
523 955, 950, 941, 930, 918, 897, 868, 838, 810, 783,
524 759, 734, 710, 693, 684, 681, 690, 712, 752, 823,
525 924, 1009, 1069, 1102, 1111, 1104, 1098, 1111, 1168, 1295,
526 1518, 1873, 2388, 3072,
527 }, {
528 1411, 1293, 1086, 1009, 974, 957, 949, 947, 957, 951,
529 941, 928, 913, 896, 878, 852, 817, 785, 756, 732,
530 713, 695, 683, 682, 689, 710, 746, 811, 906, 992,
531 1061, 1099, 1111, 1106, 1098, 1107, 1155, 1266, 1471, 1799,
532 2277, 2945, 3072, 3072,
533 }}, {{
534 1431, 1412, 1403, 1379, 1343, 1293, 1229, 1180, 1125, 1075,
535 1040, 1014, 996, 979, 965, 957, 951, 948, 947, 957,
536 951, 940, 924, 903, 877, 846, 815, 785, 753, 725,
537 702, 686, 681, 689, 714, 760, 847, 947, 1028, 1083,
538 1108, 1109, 1101, 1100, 1132, 1222, 1402, 1705, 2160, 2803,
539 }, {
540 1431, 1412, 1401, 1375, 1336, 1278, 1215, 1168, 1115, 1066,
541 1032, 1008, 991, 975, 962, 954, 950, 947, 947, 955,
542 948, 935, 916, 894, 866, 835, 803, 772, 742, 715,
543 695, 683, 683, 697, 729, 784, 887, 982, 1054, 1096,
544 1111, 1106, 1098, 1107, 1159, 1281, 1505, 1865, 2391, 3072,
545 }, {
546 1427, 1411, 1393, 1353, 1293, 1215, 1160, 1118, 1072, 1031,
547 1003, 984, 971, 960, 952, 948, 947, 957, 952, 941,
548 924, 902, 876, 847, 815, 781, 750, 723, 700, 685,
549 681, 691, 719, 766, 858, 958, 1039, 1089, 1109, 1108,
550 1099, 1102, 1141, 1245, 1442, 1766, 2250, 2930, 3072, 3072,
551 }}
552 };
553
554 static const int16_t lwc_gain_tab[11][7] = {
555 { -21, -197, -271, -466, 32767, 32767, 32767 },
556 { -197, -29, -244, -271, -540, 32767, 32767 },
557 { -271, -244, -29, -249, -271, -593, 32767 },
558 { -466, -271, -249, -29, -251, -271, -632 },
559 { -540, -271, -251, -29, -251, -271, -664 },
560 { -593, -271, -251, -29, -252, -271, -690 },
561 { -632, -271, -252, -29, -252, -271, -711 },
562 { -664, -271, -252, -29, -252, -271, -730 },
563 { -690, -271, -252, -29, -252, -271, -745 },
564 { -711, -271, -252, -29, -253, -271, -759 },
565 { -730, -271, -253, -29, -253, -271, -771 },
566 };
567
568 static const int16_t lwc_adj_tab[7] = {
569 -192, -320, -448, -512, -448, -320, -192,
570 };
571
572 static const uint8_t log_add_tab[212] = {
573 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 52, 51, 50,
574 49, 48, 47, 47, 46, 45, 44, 44, 43, 42, 41, 41, 40, 39, 38, 38,
575 37, 36, 36, 35, 35, 34, 33, 33, 32, 32, 31, 30, 30, 29, 29, 28,
576 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 21,
577 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15,
578 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11,
579 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8,
580 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5,
581 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
582 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
583 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
584 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
585 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
586 1, 1, 0, 0,
587 };
588
589 static const uint8_t bap_tab[64] = {
590 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4,
591 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8,
592 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12,
593 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15,
594 };
595
596 static float mantissa_tab1[17][4];
597 static float mantissa_tab2[17][4];
598 static float mantissa_tab3[17][4];
599 static float exponent_tab[50];
600 static float gain_tab[1024];
601
602 DECLARE_ALIGNED(32, static float, window)[3712];
603
skip_input(DBEContext * s,int nb_words)604 static int skip_input(DBEContext *s, int nb_words)
605 {
606 if (nb_words > s->input_size) {
607 av_log(s->avctx, AV_LOG_ERROR, "Packet too short\n");
608 return AVERROR_INVALIDDATA;
609 }
610
611 s->input += nb_words * s->word_bytes;
612 s->input_size -= nb_words;
613 return 0;
614 }
615
parse_key(DBEContext * s)616 static int parse_key(DBEContext *s)
617 {
618 if (s->key_present) {
619 const uint8_t *key = s->input;
620 int ret = skip_input(s, 1);
621 if (ret < 0)
622 return ret;
623 return AV_RB24(key) >> 24 - s->word_bits;
624 }
625 return 0;
626 }
627
parse_metadata_ext(DBEDecodeContext * s1)628 static int parse_metadata_ext(DBEDecodeContext *s1)
629 {
630 DBEContext *s = &s1->dectx;
631 if (s->metadata.mtd_ext_size)
632 return skip_input(s, s->key_present + s->metadata.mtd_ext_size + 1);
633 return 0;
634 }
635
unbias_exponents(DBEContext * s,DBEChannel * c,DBEGroup * g)636 static void unbias_exponents(DBEContext *s, DBEChannel *c, DBEGroup *g)
637 {
638 int mstr_exp[MAX_MSTR_EXP];
639 int bias_exp[MAX_BIAS_EXP];
640 int i, j, k;
641
642 for (i = 0; i < c->nb_mstr_exp; i++)
643 mstr_exp[i] = get_bits(&s->gb, 2) * 6;
644
645 for (i = 0; i < g->nb_exponent; i++)
646 bias_exp[i] = get_bits(&s->gb, 5);
647
648 for (i = k = 0; i < c->nb_mstr_exp; i++)
649 for (j = 0; j < g->nb_bias_exp[i]; j++, k++)
650 c->exponents[g->exp_ofs + k] = mstr_exp[i] + bias_exp[k];
651 }
652
parse_exponents(DBEContext * s,DBEChannel * c)653 static int parse_exponents(DBEContext *s, DBEChannel *c)
654 {
655 DBEGroup *p, *g;
656 int i;
657
658 for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
659 c->exp_strategy[i] = !i || g->nb_exponent != p->nb_exponent || get_bits1(&s->gb);
660 if (c->exp_strategy[i]) {
661 unbias_exponents(s, c, g);
662 } else {
663 memcpy(c->exponents + g->exp_ofs,
664 c->exponents + p->exp_ofs,
665 g->nb_exponent * sizeof(c->exponents[0]));
666 }
667 }
668
669 return 0;
670 }
671
log_add(int a,int b)672 static inline int log_add(int a, int b)
673 {
674 int c = FFABS(a - b) >> 1;
675 return FFMAX(a, b) + log_add_tab[FFMIN(c, 211)];
676 }
677
calc_lowcomp(int * msk_val)678 static void calc_lowcomp(int *msk_val)
679 {
680 int lwc_val[17] = { 0 };
681 int i, j, k;
682
683 for (i = 0; i < 11; i++) {
684 int max_j = 0;
685 int max_v = INT_MIN;
686 int thr = 0;
687
688 for (j = FFMAX(i - 3, 0), k = 0; j <= i + 3; j++, k++) {
689 int v = msk_val[j] + lwc_gain_tab[i][k];
690 if (v > max_v) {
691 max_j = j;
692 max_v = v;
693 }
694 thr = log_add(thr, v);
695 }
696
697 if (msk_val[i] < thr) {
698 for (j = FFMAX(max_j - 3, 0),
699 k = FFMAX(3 - max_j, 0);
700 j <= max_j + 3; j++, k++)
701 lwc_val[j] += lwc_adj_tab[k];
702 }
703 }
704
705 for (i = 0; i < 16; i++) {
706 int v = FFMAX(lwc_val[i], -512);
707 msk_val[i] = FFMAX(msk_val[i] + v, 0);
708 }
709 }
710
bit_allocate(int nb_exponent,int nb_code,int fr_code,int * exp,int * bap,int fg_spc,int fg_ofs,int msk_mod,int snr_ofs)711 static void bit_allocate(int nb_exponent, int nb_code, int fr_code,
712 int *exp, int *bap,
713 int fg_spc, int fg_ofs, int msk_mod, int snr_ofs)
714 {
715 int msk_val[MAX_BIAS_EXP];
716 int psd_val[MAX_BIAS_EXP];
717 int fast_leak = 0;
718 int slow_leak = 0;
719 int dc_code = dc_code_tab[fr_code - 1];
720 int ht_code = ht_code_tab[fr_code - 1];
721 int fast_gain = fast_gain_tab[fg_ofs];
722 int slow_decay = slow_decay_tab[dc_code][msk_mod];
723 int misc_decay = misc_decay_tab[nb_code][dc_code][msk_mod];
724 const uint16_t *slow_gain = slow_gain_tab[nb_code][msk_mod];
725 const uint16_t *fast_decay = fast_decay_tab[nb_code][dc_code][msk_mod];
726 const uint16_t *fast_gain_adj = fast_gain_adj_tab[nb_code][dc_code];
727 const uint16_t *hearing_thresh = hearing_thresh_tab[nb_code][ht_code];
728 int i;
729
730 for (i = 0; i < nb_exponent; i++)
731 psd_val[i] = (48 - exp[i]) * 64;
732
733 fast_gain_adj += band_ofs_tab[nb_code][fg_spc];
734 for (i = 0; i < nb_exponent; i++) {
735 fast_leak = log_add(fast_leak - fast_decay[i],
736 psd_val[i] - fast_gain + fast_gain_adj[i]);
737 slow_leak = log_add(slow_leak - slow_decay,
738 psd_val[i] - slow_gain[i]);
739 msk_val[i] = FFMAX(fast_leak, slow_leak);
740 }
741
742 fast_leak = 0;
743 for (i = nb_exponent - 1; i > band_low_tab[nb_code]; i--) {
744 fast_leak = log_add(fast_leak - misc_decay, psd_val[i] - fast_gain);
745 msk_val[i] = FFMAX(msk_val[i], fast_leak);
746 }
747
748 for (i = 0; i < nb_exponent; i++)
749 msk_val[i] = FFMAX(msk_val[i], hearing_thresh[i]);
750
751 if (!nb_code)
752 calc_lowcomp(msk_val);
753
754 for (i = 0; i < nb_exponent; i++) {
755 int v = 16 * (snr_ofs - 64) + psd_val[i] - msk_val[i] >> 5;
756 bap[i] = bap_tab[av_clip_uintp2(v, 6)];
757 }
758 }
759
parse_bit_alloc(DBEDecodeContext * s1,DBEChannel * c)760 static int parse_bit_alloc(DBEDecodeContext *s1, DBEChannel *c)
761 {
762 DBEContext *s = &s1->dectx;
763 DBEGroup *p, *g;
764 int bap_strategy[MAX_GROUPS], fg_spc[MAX_GROUPS];
765 int fg_ofs[MAX_GROUPS], msk_mod[MAX_GROUPS];
766 int i, snr_ofs;
767
768 for (i = 0; i < c->nb_groups; i++) {
769 bap_strategy[i] = !i || get_bits1(&s->gb);
770 if (bap_strategy[i]) {
771 fg_spc[i] = get_bits(&s->gb, 2);
772 fg_ofs[i] = get_bits(&s->gb, 3);
773 msk_mod[i] = get_bits1(&s->gb);
774 } else {
775 fg_spc[i] = fg_spc[i - 1];
776 fg_ofs[i] = fg_ofs[i - 1];
777 msk_mod[i] = msk_mod[i - 1];
778 }
779 }
780
781 if (get_bits1(&s->gb)) {
782 avpriv_report_missing_feature(s->avctx, "Delta bit allocation");
783 return AVERROR_PATCHWELCOME;
784 }
785
786 snr_ofs = get_bits(&s->gb, 8);
787 if (!snr_ofs) {
788 memset(c->bap, 0, sizeof(c->bap));
789 return 0;
790 }
791
792 for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
793 if (c->exp_strategy[i] || bap_strategy[i]) {
794 bit_allocate(g->nb_exponent, g->imdct_idx, s->metadata.fr_code,
795 c->exponents + g->exp_ofs, c->bap + g->exp_ofs,
796 fg_spc[i], fg_ofs[i], msk_mod[i], snr_ofs);
797 } else {
798 memcpy(c->bap + g->exp_ofs,
799 c->bap + p->exp_ofs,
800 g->nb_exponent * sizeof(c->bap[0]));
801 }
802 }
803
804 return 0;
805 }
806
parse_indices(DBEContext * s,DBEChannel * c)807 static int parse_indices(DBEContext *s, DBEChannel *c)
808 {
809 DBEGroup *p, *g;
810 int i, j;
811
812 for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
813 if (get_bits1(&s->gb)) {
814 int start = get_bits(&s->gb, 6);
815
816 if (start > g->nb_exponent) {
817 av_log(s->avctx, AV_LOG_ERROR, "Invalid start index\n");
818 return AVERROR_INVALIDDATA;
819 }
820
821 for (j = 0; j < start; j++)
822 c->idx[g->exp_ofs + j] = 0;
823
824 for (; j < g->nb_exponent; j++)
825 c->idx[g->exp_ofs + j] = get_bits(&s->gb, 2);
826 } else if (i && g->nb_exponent == p->nb_exponent) {
827 memcpy(c->idx + g->exp_ofs,
828 c->idx + p->exp_ofs,
829 g->nb_exponent * sizeof(c->idx[0]));
830 } else {
831 memset(c->idx + g->exp_ofs, 0, g->nb_exponent * sizeof(c->idx[0]));
832 }
833 }
834
835 return 0;
836 }
837
parse_mantissas(DBEContext * s,DBEChannel * c)838 static int parse_mantissas(DBEContext *s, DBEChannel *c)
839 {
840 DBEGroup *g;
841 int i, j, k;
842
843 for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
844 float *mnt = c->mantissas + g->mnt_ofs;
845
846 for (j = 0; j < g->nb_exponent; j++) {
847 int bap = c->bap[g->exp_ofs + j];
848 int idx = c->idx[g->exp_ofs + j];
849 int size1 = mantissa_size1[bap][idx];
850 int count = g->nb_mantissa[j];
851 float exp = exponent_tab[c->exponents[g->exp_ofs + j]];
852 float scale = mantissa_tab1[size1][idx] * exp;
853
854 if (!size1) {
855 memset(mnt, 0, count * sizeof(*mnt));
856 } else if (idx) {
857 int values[100];
858 int escape = -(1 << size1 - 1);
859
860 for (k = 0; k < count; k++)
861 values[k] = get_sbits(&s->gb, size1);
862
863 for (k = 0; k < count; k++) {
864 if (values[k] != escape) {
865 mnt[k] = values[k] * scale;
866 } else {
867 int size2 = mantissa_size2[bap][idx];
868 int value = get_sbits(&s->gb, size2);
869 float a = mantissa_tab2[size2][idx];
870 float b = mantissa_tab3[size2][idx];
871 if (value < 0)
872 mnt[k] = ((value + 1) * a - b) * exp;
873 else
874 mnt[k] = (value * a + b) * exp;
875 }
876 }
877 } else {
878 for (k = 0; k < count; k++)
879 mnt[k] = get_sbits(&s->gb, size1) * scale;
880 }
881
882 mnt += count;
883 }
884
885 for (; j < g->nb_exponent + c->bw_code; j++) {
886 memset(mnt, 0, g->nb_mantissa[j] * sizeof(*mnt));
887 mnt += g->nb_mantissa[j];
888 }
889 }
890
891 return 0;
892 }
893
parse_channel(DBEDecodeContext * s1,int ch,int seg_id)894 static int parse_channel(DBEDecodeContext *s1, int ch, int seg_id)
895 {
896 DBEContext *s = &s1->dectx;
897 DBEChannel *c = &s1->channels[seg_id][ch];
898 int i, ret;
899
900 if (s->metadata.rev_id[ch] > 1) {
901 avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s->metadata.rev_id[ch]);
902 return AVERROR_PATCHWELCOME;
903 }
904
905 if (ch == lfe_channel_tab[s->metadata.prog_conf]) {
906 c->gr_code = 3;
907 c->bw_code = 29;
908 } else {
909 c->gr_code = get_bits(&s->gb, 2);
910 c->bw_code = get_bits(&s->gb, 3);
911 if (c->gr_code == 3) {
912 av_log(s->avctx, AV_LOG_ERROR, "Invalid group type code\n");
913 return AVERROR_INVALIDDATA;
914 }
915 }
916
917 c->nb_groups = nb_groups_tab[c->gr_code];
918 c->nb_mstr_exp = nb_mstr_exp_tab[c->gr_code];
919
920 for (i = 0; i < c->nb_groups; i++) {
921 c->groups[i] = frm_ofs_tab[seg_id][c->gr_code][i];
922 if (c->nb_mstr_exp == 2) {
923 c->groups[i].nb_exponent -= c->bw_code;
924 c->groups[i].nb_bias_exp[1] -= c->bw_code;
925 }
926 }
927
928 if ((ret = parse_exponents(s, c)) < 0)
929 return ret;
930 if ((ret = parse_bit_alloc(s1, c)) < 0)
931 return ret;
932 if ((ret = parse_indices(s, c)) < 0)
933 return ret;
934 if ((ret = parse_mantissas(s, c)) < 0)
935 return ret;
936
937 if (get_bits_left(&s->gb) < 0) {
938 av_log(s->avctx, AV_LOG_ERROR, "Read past end of channel %d\n", ch);
939 return AVERROR_INVALIDDATA;
940 }
941
942 return 0;
943 }
944
parse_audio(DBEDecodeContext * s1,int start,int end,int seg_id)945 static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id)
946 {
947 DBEContext *s = &s1->dectx;
948 int ch, ret, key;
949
950 if ((key = parse_key(s)) < 0)
951 return key;
952
953 for (ch = start; ch < end; ch++) {
954 if (!s->metadata.ch_size[ch]) {
955 s1->channels[seg_id][ch].nb_groups = 0;
956 continue;
957 }
958 ret = ff_dolby_e_convert_input(s, s->metadata.ch_size[ch], key);
959 if (ret < 0)
960 return ret;
961 if ((ret = parse_channel(s1, ch, seg_id)) < 0) {
962 if (s1->avctx->err_recognition & AV_EF_EXPLODE)
963 return ret;
964 s1->channels[seg_id][ch].nb_groups = 0;
965 }
966 if ((ret = skip_input(s, s->metadata.ch_size[ch])) < 0)
967 return ret;
968 }
969
970 return skip_input(s, 1);
971 }
972
parse_meter(DBEDecodeContext * s1)973 static int parse_meter(DBEDecodeContext *s1)
974 {
975 DBEContext *s = &s1->dectx;
976 if (s->metadata.meter_size)
977 return skip_input(s, s->key_present + s->metadata.meter_size + 1);
978 return 0;
979 }
980
imdct_calc(DBEDecodeContext * s1,DBEGroup * g,float * result,float * values)981 static void imdct_calc(DBEDecodeContext *s1, DBEGroup *g, float *result, float *values)
982 {
983 FFTContext *imdct = &s1->imdct[g->imdct_idx];
984 int n = 1 << imdct_bits_tab[g->imdct_idx];
985 int n2 = n >> 1;
986 int i;
987
988 switch (g->imdct_phs) {
989 case 0:
990 imdct->imdct_half(imdct, result, values);
991 for (i = 0; i < n2; i++)
992 result[n2 + i] = result[n2 - i - 1];
993 break;
994 case 1:
995 imdct->imdct_calc(imdct, result, values);
996 break;
997 case 2:
998 imdct->imdct_half(imdct, result + n2, values);
999 for (i = 0; i < n2; i++)
1000 result[i] = -result[n - i - 1];
1001 break;
1002 default:
1003 av_assert0(0);
1004 }
1005 }
1006
transform(DBEDecodeContext * s1,DBEChannel * c,float * history,float * output)1007 static void transform(DBEDecodeContext *s1, DBEChannel *c, float *history, float *output)
1008 {
1009 LOCAL_ALIGNED_32(float, buffer, [2048]);
1010 LOCAL_ALIGNED_32(float, result, [1152]);
1011 DBEGroup *g;
1012 int i;
1013
1014 memset(result, 0, 1152 * sizeof(float));
1015 for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
1016 float *src = buffer + g->src_ofs;
1017 float *dst = result + g->dst_ofs;
1018 float *win = window + g->win_ofs;
1019
1020 imdct_calc(s1, g, buffer, c->mantissas + g->mnt_ofs);
1021 s1->fdsp->vector_fmul_add(dst, src, win, dst, g->win_len);
1022 }
1023
1024 for (i = 0; i < 256; i++)
1025 output[i] = history[i] + result[i];
1026 for (i = 256; i < 896; i++)
1027 output[i] = result[i];
1028 for (i = 0; i < 256; i++)
1029 history[i] = result[896 + i];
1030 }
1031
apply_gain(DBEDecodeContext * s,int begin,int end,float * output)1032 static void apply_gain(DBEDecodeContext *s, int begin, int end, float *output)
1033 {
1034 if (begin == 960 && end == 960)
1035 return;
1036
1037 if (begin == end) {
1038 s->fdsp->vector_fmul_scalar(output, output, gain_tab[end], FRAME_SAMPLES);
1039 } else {
1040 float a = gain_tab[begin] * (1.0f / (FRAME_SAMPLES - 1));
1041 float b = gain_tab[end ] * (1.0f / (FRAME_SAMPLES - 1));
1042 int i;
1043
1044 for (i = 0; i < FRAME_SAMPLES; i++)
1045 output[i] *= a * (FRAME_SAMPLES - i - 1) + b * i;
1046 }
1047 }
1048
filter_frame(DBEDecodeContext * s,AVFrame * frame)1049 static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
1050 {
1051 const DolbyEHeaderInfo *const metadata = &s->dectx.metadata;
1052 const uint8_t *reorder;
1053 int ch, ret;
1054
1055 if (metadata->nb_channels == 4)
1056 reorder = ch_reorder_4;
1057 else if (metadata->nb_channels == 6)
1058 reorder = ch_reorder_6;
1059 else if (metadata->nb_programs == 1 && !(s->avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE))
1060 reorder = ch_reorder_8;
1061 else
1062 reorder = ch_reorder_n;
1063
1064 frame->nb_samples = FRAME_SAMPLES;
1065 if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0)
1066 return ret;
1067
1068 for (ch = 0; ch < metadata->nb_channels; ch++) {
1069 float *output = (float *)frame->extended_data[reorder[ch]];
1070 transform(s, &s->channels[0][ch], s->history[ch], output);
1071 transform(s, &s->channels[1][ch], s->history[ch], output + FRAME_SAMPLES / 2);
1072 apply_gain(s, metadata->begin_gain[ch], metadata->end_gain[ch], output);
1073 }
1074
1075 return 0;
1076 }
1077
dolby_e_decode_frame(AVCodecContext * avctx,void * data,int * got_frame_ptr,AVPacket * avpkt)1078 static int dolby_e_decode_frame(AVCodecContext *avctx, void *data,
1079 int *got_frame_ptr, AVPacket *avpkt)
1080 {
1081 DBEDecodeContext *s1 = avctx->priv_data;
1082 DBEContext *s = &s1->dectx;
1083 int i, j, ret;
1084
1085 if ((ret = ff_dolby_e_parse_header(s, avpkt->data, avpkt->size)) < 0)
1086 return ret;
1087
1088 if (s->metadata.nb_programs > 1 && !s->metadata.multi_prog_warned) {
1089 av_log(avctx, AV_LOG_WARNING, "Stream has %d programs (configuration %d), "
1090 "channels will be output in native order.\n",
1091 s->metadata.nb_programs, s->metadata.prog_conf);
1092 s->metadata.multi_prog_warned = 1;
1093 }
1094
1095 switch (s->metadata.nb_channels) {
1096 case 4:
1097 avctx->channel_layout = AV_CH_LAYOUT_4POINT0;
1098 break;
1099 case 6:
1100 avctx->channel_layout = AV_CH_LAYOUT_5POINT1;
1101 break;
1102 case 8:
1103 avctx->channel_layout = AV_CH_LAYOUT_7POINT1;
1104 break;
1105 }
1106
1107 avctx->channels = s->metadata.nb_channels;
1108 avctx->sample_rate = s->metadata.sample_rate;
1109 avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
1110
1111 i = s->metadata.nb_channels / 2;
1112 j = s->metadata.nb_channels;
1113 if ((ret = parse_audio(s1, 0, i, 0)) < 0)
1114 return ret;
1115 if ((ret = parse_audio(s1, i, j, 0)) < 0)
1116 return ret;
1117 if ((ret = parse_metadata_ext(s1)) < 0)
1118 return ret;
1119 if ((ret = parse_audio(s1, 0, i, 1)) < 0)
1120 return ret;
1121 if ((ret = parse_audio(s1, i, j, 1)) < 0)
1122 return ret;
1123 if ((ret = parse_meter(s1)) < 0)
1124 return ret;
1125 if ((ret = filter_frame(s1, data)) < 0)
1126 return ret;
1127
1128 *got_frame_ptr = 1;
1129 return avpkt->size;
1130 }
1131
dolby_e_flush(AVCodecContext * avctx)1132 static av_cold void dolby_e_flush(AVCodecContext *avctx)
1133 {
1134 DBEDecodeContext *s = avctx->priv_data;
1135
1136 memset(s->history, 0, sizeof(s->history));
1137 }
1138
dolby_e_close(AVCodecContext * avctx)1139 static av_cold int dolby_e_close(AVCodecContext *avctx)
1140 {
1141 DBEDecodeContext *s = avctx->priv_data;
1142 int i;
1143
1144 for (i = 0; i < 3; i++)
1145 ff_mdct_end(&s->imdct[i]);
1146
1147 av_freep(&s->fdsp);
1148 return 0;
1149 }
1150
1151
init_tables(void)1152 static av_cold void init_tables(void)
1153 {
1154 int i, j;
1155
1156 for (i = 1; i < 17; i++)
1157 mantissa_tab1[i][0] = 1.0f / (1 << i - 1);
1158
1159 for (i = 2; i < 16; i++) {
1160 mantissa_tab1[i][1] = 1.0f / ((1 << i) - 1);
1161 mantissa_tab1[i][2] = 0.5f / ((1 << i) - 1);
1162 mantissa_tab1[i][3] = 0.25f / ((1 << i) - 1);
1163 }
1164
1165 mantissa_tab1[i][1] = 0.5f / (1 << 15);
1166 mantissa_tab1[i][2] = 0.75f / (1 << 15);
1167 mantissa_tab1[i][3] = 0.875f / (1 << 15);
1168
1169 for (i = 1; i < 17; i++) {
1170 mantissa_tab2[i][1] = mantissa_tab1[i][0] * 0.5f;
1171 mantissa_tab2[i][2] = mantissa_tab1[i][0] * 0.75f;
1172 mantissa_tab2[i][3] = mantissa_tab1[i][0] * 0.875f;
1173 for (j = 1; j < 4; j++)
1174 mantissa_tab3[i][j] = 1.0f / (1 << i) + 1.0f / (1 << j) - 1.0f / (1 << i + j);
1175 }
1176
1177 mantissa_tab3[1][3] = 0.6875f;
1178
1179 for (i = 0; i < 25; i++) {
1180 exponent_tab[i * 2 ] = 1.0f / (1 << i);
1181 exponent_tab[i * 2 + 1] = M_SQRT1_2 / (1 << i);
1182 }
1183
1184 for (i = 1; i < 1024; i++)
1185 gain_tab[i] = exp2f((i - 960) / 64.0f);
1186
1187 // short 1
1188 ff_kbd_window_init(window, 3.0f, 128);
1189 for (i = 0; i < 128; i++)
1190 window[128 + i] = window[127 - i];
1191
1192 // start
1193 for (i = 0; i < 192; i++)
1194 window[256 + i] = start_window[i];
1195
1196 // short 2
1197 for (i = 0; i < 192; i++)
1198 window[448 + i] = short_window2[i];
1199 for (i = 0; i < 64; i++)
1200 window[640 + i] = window[63 - i];
1201
1202 // short 3
1203 for (i = 0; i < 64; i++)
1204 window[704 + i] = short_window3[i];
1205 for (i = 0; i < 192; i++)
1206 window[768 + i] = window[64 + i];
1207
1208 // bridge
1209 for (i = 0; i < 128; i++)
1210 window[960 + i] = window[i];
1211 for (i = 0; i < 64; i++)
1212 window[1088 + i] = 1.0f;
1213
1214 // long
1215 ff_kbd_window_init(window + 1408, 3.0f, 256);
1216 for (i = 0; i < 640; i++)
1217 window[1664 + i] = 1.0f;
1218 for (i = 0; i < 256; i++)
1219 window[2304 + i] = window[1152 + i] = window[1663 - i];
1220
1221 // reverse start
1222 for (i = 0; i < 192; i++)
1223 window[2560 + i] = window[447 - i];
1224
1225 // reverse short 2
1226 for (i = 0; i < 256; i++)
1227 window[2752 + i] = window[703 - i];
1228
1229 // reverse short 3
1230 for (i = 0; i < 256; i++)
1231 window[3008 + i] = window[959 - i];
1232
1233 // reverse bridge
1234 for (i = 0; i < 448; i++)
1235 window[3264 + i] = window[1407 - i];
1236 }
1237
dolby_e_init(AVCodecContext * avctx)1238 static av_cold int dolby_e_init(AVCodecContext *avctx)
1239 {
1240 static AVOnce init_once = AV_ONCE_INIT;
1241 DBEDecodeContext *s = avctx->priv_data;
1242 int i;
1243
1244 if (ff_thread_once(&init_once, init_tables))
1245 return AVERROR_UNKNOWN;
1246
1247 for (i = 0; i < 3; i++)
1248 if (ff_mdct_init(&s->imdct[i], imdct_bits_tab[i], 1, 2.0) < 0)
1249 return AVERROR(ENOMEM);
1250
1251 if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
1252 return AVERROR(ENOMEM);
1253
1254 s->dectx.metadata.multi_prog_warned = !!(avctx->request_channel_layout & AV_CH_LAYOUT_NATIVE);
1255 s->dectx.avctx = s->avctx = avctx;
1256 return 0;
1257 }
1258
1259 AVCodec ff_dolby_e_decoder = {
1260 .name = "dolby_e",
1261 .long_name = NULL_IF_CONFIG_SMALL("Dolby E"),
1262 .type = AVMEDIA_TYPE_AUDIO,
1263 .id = AV_CODEC_ID_DOLBY_E,
1264 .priv_data_size = sizeof(DBEDecodeContext),
1265 .init = dolby_e_init,
1266 .decode = dolby_e_decode_frame,
1267 .close = dolby_e_close,
1268 .flush = dolby_e_flush,
1269 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1270 .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE },
1271 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
1272 };
1273