Coverage Report

Created: 2026-05-16 07:49

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