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