Coverage Report

Created: 2026-02-14 06:59

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
670k
{
616
670k
    if (nb_words > s->input_size) {
617
3.43k
        av_log(s->avctx, AV_LOG_ERROR, "Packet too short\n");
618
3.43k
        return AVERROR_INVALIDDATA;
619
3.43k
    }
620
621
666k
    s->input      += nb_words * s->word_bytes;
622
666k
    s->input_size -= nb_words;
623
666k
    return 0;
624
670k
}
625
626
static int parse_key(DBEContext *s)
627
658k
{
628
658k
    if (s->key_present) {
629
619
        const uint8_t *key = s->input;
630
619
        int      ret = skip_input(s, 1);
631
619
        if (ret < 0)
632
199
            return ret;
633
420
        return AV_RB24(key) >> 24 - s->word_bits;
634
619
    }
635
657k
    return 0;
636
658k
}
637
638
static int parse_metadata_ext(DBEDecodeContext *s1)
639
163k
{
640
163k
    DBEContext *s = &s1->dectx;
641
163k
    if (s->metadata.mtd_ext_size)
642
626
        return skip_input(s, s->key_present + s->metadata.mtd_ext_size + 1);
643
162k
    return 0;
644
163k
}
645
646
static void unbias_exponents(DBEContext *s, DBEChannel *c, DBEGroup *g)
647
17.3k
{
648
17.3k
    int mstr_exp[MAX_MSTR_EXP];
649
17.3k
    int bias_exp[MAX_BIAS_EXP];
650
17.3k
    int i, j, k;
651
652
49.4k
    for (i = 0; i < c->nb_mstr_exp; i++)
653
32.1k
        mstr_exp[i] = get_bits(&s->gb, 2) * 6;
654
655
640k
    for (i = 0; i < g->nb_exponent; i++)
656
623k
        bias_exp[i] = get_bits(&s->gb, 5);
657
658
49.4k
    for (i = k = 0; i < c->nb_mstr_exp; i++)
659
655k
        for (j = 0; j < g->nb_bias_exp[i]; j++, k++)
660
623k
            c->exponents[g->exp_ofs + k] = mstr_exp[i] + bias_exp[k];
661
17.3k
}
662
663
static int parse_exponents(DBEContext *s, DBEChannel *c)
664
12.1k
{
665
12.1k
    DBEGroup *p, *g;
666
12.1k
    int i;
667
668
69.4k
    for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
669
57.3k
        c->exp_strategy[i] = !i || g->nb_exponent != p->nb_exponent || get_bits1(&s->gb);
670
57.3k
        if (c->exp_strategy[i]) {
671
17.3k
            unbias_exponents(s, c, g);
672
39.9k
        } else {
673
39.9k
            memcpy(c->exponents + g->exp_ofs,
674
39.9k
                   c->exponents + p->exp_ofs,
675
39.9k
                   g->nb_exponent * sizeof(c->exponents[0]));
676
39.9k
        }
677
57.3k
    }
678
679
12.1k
    return 0;
680
12.1k
}
681
682
static inline int log_add(int a, int b)
683
1.74M
{
684
1.74M
    int c = FFABS(a - b) >> 1;
685
1.74M
    return FFMAX(a, b) + log_add_tab[FFMIN(c, 211)];
686
1.74M
}
687
688
static void calc_lowcomp(int *msk_val)
689
8.53k
{
690
8.53k
    int lwc_val[17] = { 0 };
691
8.53k
    int i, j, k;
692
693
102k
    for (i = 0; i < 11; i++) {
694
93.9k
        int max_j = 0;
695
93.9k
        int max_v = INT_MIN;
696
93.9k
        int thr   = 0;
697
698
700k
        for (j = FFMAX(i - 3, 0), k = 0; j <= i + 3; j++, k++) {
699
606k
            int v = msk_val[j] + lwc_gain_tab[i][k];
700
606k
            if (v > max_v) {
701
289k
                max_j = j;
702
289k
                max_v = v;
703
289k
            }
704
606k
            thr = log_add(thr, v);
705
606k
        }
706
707
93.9k
        if (msk_val[i] < thr) {
708
53.4k
            for (j = FFMAX(max_j - 3, 0),
709
53.4k
                 k = FFMAX(3 - max_j, 0);
710
402k
                 j <= max_j + 3; j++, k++)
711
349k
                lwc_val[j] += lwc_adj_tab[k];
712
53.4k
        }
713
93.9k
    }
714
715
145k
    for (i = 0; i < 16; i++) {
716
136k
        int v = FFMAX(lwc_val[i], -512);
717
136k
        msk_val[i] = FFMAX(msk_val[i] + v, 0);
718
136k
    }
719
8.53k
}
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.5k
{
725
12.5k
    int msk_val[MAX_BIAS_EXP];
726
12.5k
    int psd_val[MAX_BIAS_EXP];
727
12.5k
    int fast_leak  = 0;
728
12.5k
    int slow_leak  = 0;
729
12.5k
    int dc_code    = dc_code_tab[fr_code - 1];
730
12.5k
    int ht_code    = ht_code_tab[fr_code - 1];
731
12.5k
    int fast_gain  = fast_gain_tab[fg_ofs];
732
12.5k
    int slow_decay = slow_decay_tab[dc_code][msk_mod];
733
12.5k
    int misc_decay = misc_decay_tab[nb_code][dc_code][msk_mod];
734
12.5k
    const uint16_t *slow_gain      = slow_gain_tab[nb_code][msk_mod];
735
12.5k
    const uint16_t *fast_decay     = fast_decay_tab[nb_code][dc_code][msk_mod];
736
12.5k
    const uint16_t *fast_gain_adj  = fast_gain_adj_tab[nb_code][dc_code];
737
12.5k
    const uint16_t *hearing_thresh = hearing_thresh_tab[nb_code][ht_code];
738
12.5k
    int i;
739
740
448k
    for (i = 0; i < nb_exponent; i++)
741
435k
        psd_val[i] = (48 - exp[i]) * 64;
742
743
12.5k
    fast_gain_adj += band_ofs_tab[nb_code][fg_spc];
744
448k
    for (i = 0; i < nb_exponent; i++) {
745
435k
        fast_leak = log_add(fast_leak  - fast_decay[i],
746
435k
                            psd_val[i] - fast_gain + fast_gain_adj[i]);
747
435k
        slow_leak = log_add(slow_leak  - slow_decay,
748
435k
                            psd_val[i] - slow_gain[i]);
749
435k
        msk_val[i] = FFMAX(fast_leak, slow_leak);
750
435k
    }
751
752
12.5k
    fast_leak = 0;
753
278k
    for (i = nb_exponent - 1; i > band_low_tab[nb_code]; i--) {
754
265k
        fast_leak = log_add(fast_leak - misc_decay, psd_val[i] - fast_gain);
755
265k
        msk_val[i] = FFMAX(msk_val[i], fast_leak);
756
265k
    }
757
758
448k
    for (i = 0; i < nb_exponent; i++)
759
435k
        msk_val[i] = FFMAX(msk_val[i], hearing_thresh[i]);
760
761
12.5k
    if (!nb_code)
762
8.53k
        calc_lowcomp(msk_val);
763
764
448k
    for (i = 0; i < nb_exponent; i++) {
765
435k
        int v = 16 * (snr_ofs - 64) + psd_val[i] - msk_val[i] >> 5;
766
435k
        bap[i] = bap_tab[av_clip_uintp2(v, 6)];
767
435k
    }
768
12.5k
}
769
770
static int parse_bit_alloc(DBEDecodeContext *s1, DBEChannel *c)
771
12.1k
{
772
12.1k
    DBEContext *s = &s1->dectx;
773
12.1k
    DBEGroup *p, *g;
774
12.1k
    int bap_strategy[MAX_GROUPS], fg_spc[MAX_GROUPS];
775
12.1k
    int fg_ofs[MAX_GROUPS], msk_mod[MAX_GROUPS];
776
12.1k
    int i, snr_ofs;
777
778
69.4k
    for (i = 0; i < c->nb_groups; i++) {
779
57.3k
        bap_strategy[i] = !i || get_bits1(&s->gb);
780
57.3k
        if (bap_strategy[i]) {
781
19.6k
             fg_spc[i] = get_bits(&s->gb, 2);
782
19.6k
             fg_ofs[i] = get_bits(&s->gb, 3);
783
19.6k
            msk_mod[i] = get_bits1(&s->gb);
784
37.7k
        } else {
785
37.7k
             fg_spc[i] =  fg_spc[i - 1];
786
37.7k
             fg_ofs[i] =  fg_ofs[i - 1];
787
37.7k
            msk_mod[i] = msk_mod[i - 1];
788
37.7k
        }
789
57.3k
    }
790
791
12.1k
    if (get_bits1(&s->gb)) {
792
885
        avpriv_report_missing_feature(s->avctx, "Delta bit allocation");
793
885
        return AVERROR_PATCHWELCOME;
794
885
    }
795
796
11.2k
    snr_ofs = get_bits(&s->gb, 8);
797
11.2k
    if (!snr_ofs) {
798
3.86k
        memset(c->bap, 0, sizeof(c->bap));
799
3.86k
        return 0;
800
3.86k
    }
801
802
45.8k
    for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
803
38.4k
        if (c->exp_strategy[i] || bap_strategy[i]) {
804
12.5k
            bit_allocate(g->nb_exponent, g->imdct_idx, s->metadata.fr_code,
805
12.5k
                         c->exponents + g->exp_ofs, c->bap + g->exp_ofs,
806
12.5k
                         fg_spc[i], fg_ofs[i], msk_mod[i], snr_ofs);
807
25.9k
        } else {
808
25.9k
            memcpy(c->bap + g->exp_ofs,
809
25.9k
                   c->bap + p->exp_ofs,
810
25.9k
                   g->nb_exponent * sizeof(c->bap[0]));
811
25.9k
        }
812
38.4k
    }
813
814
7.37k
    return 0;
815
11.2k
}
816
817
static int parse_indices(DBEContext *s, DBEChannel *c)
818
11.2k
{
819
11.2k
    DBEGroup *p, *g;
820
11.2k
    int i, j;
821
822
63.0k
    for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
823
52.3k
        if (get_bits1(&s->gb)) {
824
5.13k
            int start = get_bits(&s->gb, 6);
825
826
5.13k
            if (start > g->nb_exponent) {
827
527
                av_log(s->avctx, AV_LOG_ERROR, "Invalid start index\n");
828
527
                return AVERROR_INVALIDDATA;
829
527
            }
830
831
127k
            for (j = 0; j < start; j++)
832
123k
                c->idx[g->exp_ofs + j] = 0;
833
834
41.3k
            for (; j < g->nb_exponent; j++)
835
36.7k
                c->idx[g->exp_ofs + j] = get_bits(&s->gb, 2);
836
47.2k
        } else if (i && g->nb_exponent == p->nb_exponent) {
837
35.5k
            memcpy(c->idx + g->exp_ofs,
838
35.5k
                   c->idx + p->exp_ofs,
839
35.5k
                   g->nb_exponent * sizeof(c->idx[0]));
840
35.5k
        } else {
841
11.6k
            memset(c->idx + g->exp_ofs, 0, g->nb_exponent * sizeof(c->idx[0]));
842
11.6k
        }
843
52.3k
    }
844
845
10.7k
    return 0;
846
11.2k
}
847
848
static int parse_mantissas(DBEContext *s, DBEChannel *c)
849
10.7k
{
850
10.7k
    DBEGroup *g;
851
10.7k
    int i, j, k;
852
853
62.3k
    for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
854
51.5k
        float *mnt = c->mantissas + g->mnt_ofs;
855
856
1.86M
        for (j = 0; j < g->nb_exponent; j++) {
857
1.81M
            int bap     = c->bap[g->exp_ofs + j];
858
1.81M
            int idx     = c->idx[g->exp_ofs + j];
859
1.81M
            int size1   = mantissa_size1[bap][idx];
860
1.81M
            int count   = g->nb_mantissa[j];
861
1.81M
            float exp   = exponent_tab[c->exponents[g->exp_ofs + j]];
862
1.81M
            float scale = mantissa_tab1[size1][idx] * exp;
863
864
1.81M
            if (!size1) {
865
925k
                memset(mnt, 0, count * sizeof(*mnt));
866
925k
            } else if (idx) {
867
15.4k
                int values[100];
868
15.4k
                int escape = -(1 << size1 - 1);
869
870
80.3k
                for (k = 0; k < count; k++)
871
64.8k
                    values[k] = get_sbits(&s->gb, size1);
872
873
80.3k
                for (k = 0; k < count; k++) {
874
64.8k
                    if (values[k] != escape) {
875
52.5k
                        mnt[k] = values[k] * scale;
876
52.5k
                    } else {
877
12.3k
                        int size2 = mantissa_size2[bap][idx];
878
12.3k
                        int value = get_sbits(&s->gb, size2);
879
12.3k
                        float a = mantissa_tab2[size2][idx];
880
12.3k
                        float b = mantissa_tab3[size2][idx];
881
12.3k
                        if (value < 0)
882
11.3k
                            mnt[k] = ((value + 1) * a - b) * exp;
883
1.02k
                        else
884
1.02k
                            mnt[k] = (value * a + b) * exp;
885
12.3k
                    }
886
64.8k
                }
887
875k
            } else {
888
3.58M
                for (k = 0; k < count; k++)
889
2.71M
                    mnt[k] = get_sbits(&s->gb, size1) * scale;
890
875k
            }
891
892
1.81M
            mnt += count;
893
1.81M
        }
894
895
260k
        for (; j < g->nb_exponent + c->bw_code; j++) {
896
209k
            memset(mnt, 0, g->nb_mantissa[j] * sizeof(*mnt));
897
209k
            mnt += g->nb_mantissa[j];
898
209k
        }
899
51.5k
    }
900
901
10.7k
    return 0;
902
10.7k
}
903
904
static int parse_channel(DBEDecodeContext *s1, int ch, int seg_id)
905
14.1k
{
906
14.1k
    DBEContext *s = &s1->dectx;
907
14.1k
    DBEChannel *c = &s1->channels[seg_id][ch];
908
14.1k
    int i, ret;
909
910
14.1k
    if (s->metadata.rev_id[ch] > 1) {
911
1.59k
        avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s->metadata.rev_id[ch]);
912
1.59k
        return AVERROR_PATCHWELCOME;
913
1.59k
    }
914
915
12.5k
    if (ch == lfe_channel_tab[s->metadata.prog_conf]) {
916
2.66k
        c->gr_code = 3;
917
2.66k
        c->bw_code = 29;
918
9.89k
    } else {
919
9.89k
        c->gr_code = get_bits(&s->gb, 2);
920
9.89k
        c->bw_code = get_bits(&s->gb, 3);
921
9.89k
        if (c->gr_code == 3) {
922
434
            av_log(s->avctx, AV_LOG_ERROR, "Invalid group type code\n");
923
434
            return AVERROR_INVALIDDATA;
924
434
        }
925
9.89k
    }
926
927
12.1k
    c->nb_groups   = nb_groups_tab[c->gr_code];
928
12.1k
    c->nb_mstr_exp = nb_mstr_exp_tab[c->gr_code];
929
930
69.4k
    for (i = 0; i < c->nb_groups; i++) {
931
57.3k
        c->groups[i] = frm_ofs_tab[seg_id][c->gr_code][i];
932
57.3k
        if (c->nb_mstr_exp == 2) {
933
54.6k
            c->groups[i].nb_exponent    -= c->bw_code;
934
54.6k
            c->groups[i].nb_bias_exp[1] -= c->bw_code;
935
54.6k
        }
936
57.3k
    }
937
938
12.1k
    if ((ret = parse_exponents(s, c)) < 0)
939
0
        return ret;
940
12.1k
    if ((ret = parse_bit_alloc(s1, c)) < 0)
941
885
        return ret;
942
11.2k
    if ((ret = parse_indices(s, c)) < 0)
943
527
        return ret;
944
10.7k
    if ((ret = parse_mantissas(s, c)) < 0)
945
0
        return ret;
946
947
10.7k
    if (get_bits_left(&s->gb) < 0) {
948
6.09k
        av_log(s->avctx, AV_LOG_ERROR, "Read past end of channel %d\n", ch);
949
6.09k
        return AVERROR_INVALIDDATA;
950
6.09k
    }
951
952
4.62k
    return 0;
953
10.7k
}
954
955
static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id)
956
658k
{
957
658k
    DBEContext *s = &s1->dectx;
958
658k
    int ch, ret, key;
959
960
658k
    if ((key = parse_key(s)) < 0)
961
199
        return key;
962
963
2.01M
    for (ch = start; ch < end; ch++) {
964
1.36M
        if (!s->metadata.ch_size[ch]) {
965
1.34M
            s1->channels[seg_id][ch].nb_groups = 0;
966
1.34M
            continue;
967
1.34M
        }
968
16.8k
        ret = ff_dolby_e_convert_input(s, s->metadata.ch_size[ch], key);
969
16.8k
        if (ret < 0)
970
2.74k
            return ret;
971
14.1k
        if ((ret = parse_channel(s1, ch, seg_id)) < 0) {
972
9.53k
            if (s1->avctx->err_recognition & AV_EF_EXPLODE)
973
480
                return ret;
974
9.05k
            s1->channels[seg_id][ch].nb_groups = 0;
975
9.05k
        }
976
13.6k
        if ((ret = skip_input(s, s->metadata.ch_size[ch])) < 0)
977
0
            return ret;
978
13.6k
    }
979
980
654k
    return skip_input(s, 1);
981
657k
}
982
983
static int parse_meter(DBEDecodeContext *s1)
984
161k
{
985
161k
    DBEContext *s = &s1->dectx;
986
161k
    if (s->metadata.meter_size)
987
815
        return skip_input(s, s->key_present + s->metadata.meter_size + 1);
988
160k
    return 0;
989
161k
}
990
991
static void imdct_calc(DBEDecodeContext *s1, DBEGroup *g, float *result, float *values)
992
11.9k
{
993
11.9k
    AVTXContext *imdct = s1->imdct[g->imdct_phs == 1][g->imdct_idx];
994
11.9k
    av_tx_fn  imdct_fn = s1->imdct_fn[g->imdct_phs == 1][g->imdct_idx];
995
11.9k
    int n   = 1 << imdct_bits_tab[g->imdct_idx];
996
11.9k
    int n2  = n >> 1;
997
998
11.9k
    switch (g->imdct_phs) {
999
2.33k
    case 0:
1000
2.33k
        imdct_fn(imdct, result, values, sizeof(float));
1001
2.01M
        for (int i = 0; i < n2; i++)
1002
2.01M
            result[n2 + i] = result[n2 - i - 1];
1003
2.33k
        break;
1004
7.78k
    case 1:
1005
7.78k
        imdct_fn(imdct, result, values, sizeof(float));
1006
7.78k
        break;
1007
1.85k
    case 2:
1008
1.85k
        imdct_fn(imdct, result + n2, values, sizeof(float));
1009
1.26M
        for (int i = 0; i < n2; i++)
1010
1.26M
            result[i] = -result[n - i - 1];
1011
1.85k
        break;
1012
0
    default:
1013
0
        av_assert0(0);
1014
11.9k
    }
1015
11.9k
}
1016
1017
static void transform(DBEDecodeContext *s1, DBEChannel *c, float *history, float *output)
1018
1.33M
{
1019
1.33M
    LOCAL_ALIGNED_32(float, buffer, [2048]);
1020
1.33M
    LOCAL_ALIGNED_32(float, result, [1152]);
1021
1.33M
    DBEGroup *g;
1022
1.33M
    int i;
1023
1024
1.33M
    memset(result, 0, 1152 * sizeof(float));
1025
1.34M
    for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
1026
11.9k
        float *src = buffer + g->src_ofs;
1027
11.9k
        float *dst = result + g->dst_ofs;
1028
11.9k
        float *win = window + g->win_ofs;
1029
1030
11.9k
        imdct_calc(s1, g, buffer, c->mantissas + g->mnt_ofs);
1031
11.9k
        s1->fdsp->vector_fmul_add(dst, src, win, dst, g->win_len);
1032
11.9k
    }
1033
1034
342M
    for (i = 0; i < 256; i++)
1035
341M
        output[i] = history[i] + result[i];
1036
854M
    for (i = 256; i < 896; i++)
1037
853M
        output[i] = result[i];
1038
342M
    for (i = 0; i < 256; i++)
1039
341M
        history[i] = result[896 + i];
1040
1.33M
}
1041
1042
static void apply_gain(DBEDecodeContext *s, int begin, int end, float *output)
1043
666k
{
1044
666k
    if (begin == 960 && end == 960)
1045
860
        return;
1046
1047
665k
    if (begin == end) {
1048
353k
        s->fdsp->vector_fmul_scalar(output, output, gain_tab[end], FRAME_SAMPLES);
1049
353k
    } else {
1050
312k
        float a = gain_tab[begin] * (1.0f / (FRAME_SAMPLES - 1));
1051
312k
        float b = gain_tab[end  ] * (1.0f / (FRAME_SAMPLES - 1));
1052
312k
        int i;
1053
1054
560M
        for (i = 0; i < FRAME_SAMPLES; i++)
1055
560M
            output[i] *= a * (FRAME_SAMPLES - i - 1) + b * i;
1056
312k
    }
1057
665k
}
1058
1059
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
1060
161k
{
1061
161k
    const DolbyEHeaderInfo *const metadata = &s->dectx.metadata;
1062
161k
    const uint8_t *reorder;
1063
161k
    int ch, ret;
1064
1065
161k
    if (metadata->nb_channels == 4)
1066
155k
        reorder = ch_reorder_4;
1067
5.76k
    else if (metadata->nb_channels == 6)
1068
378
        reorder = ch_reorder_6;
1069
5.39k
    else if (metadata->nb_programs == 1 && metadata->output_channel_order == CHANNEL_ORDER_DEFAULT)
1070
1.57k
        reorder = ch_reorder_8;
1071
3.81k
    else
1072
3.81k
        reorder = ch_reorder_n;
1073
1074
161k
    frame->nb_samples = FRAME_SAMPLES;
1075
161k
    if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0)
1076
0
        return ret;
1077
1078
827k
    for (ch = 0; ch < metadata->nb_channels; ch++) {
1079
666k
        float *output = (float *)frame->extended_data[reorder[ch]];
1080
666k
        transform(s, &s->channels[0][ch], s->history[ch], output);
1081
666k
        transform(s, &s->channels[1][ch], s->history[ch], output + FRAME_SAMPLES / 2);
1082
666k
        apply_gain(s, metadata->begin_gain[ch], metadata->end_gain[ch], output);
1083
666k
    }
1084
1085
161k
    return 0;
1086
161k
}
1087
1088
static int dolby_e_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1089
                                int *got_frame_ptr, AVPacket *avpkt)
1090
279k
{
1091
279k
    DBEDecodeContext *s1 = avctx->priv_data;
1092
279k
    DBEContext *s = &s1->dectx;
1093
279k
    int i, j, ret;
1094
1095
279k
    if ((ret = ff_dolby_e_parse_header(s, avpkt->data, avpkt->size)) < 0)
1096
111k
        return ret;
1097
1098
167k
    if (s->metadata.nb_programs > 1 && !s->metadata.multi_prog_warned) {
1099
250
        av_log(avctx, AV_LOG_WARNING, "Stream has %d programs (configuration %d), "
1100
250
               "channels will be output in native order.\n",
1101
250
               s->metadata.nb_programs, s->metadata.prog_conf);
1102
250
        s->metadata.multi_prog_warned = 1;
1103
250
    }
1104
1105
167k
    av_channel_layout_uninit(&avctx->ch_layout);
1106
167k
    switch (s->metadata.nb_channels) {
1107
160k
    case 4:
1108
160k
        avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0;
1109
160k
        break;
1110
769
    case 6:
1111
769
        avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1;
1112
769
        break;
1113
6.74k
    case 8:
1114
6.74k
        avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1;
1115
6.74k
        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
167k
    }
1121
1122
167k
    avctx->sample_rate = s->metadata.sample_rate;
1123
167k
    avctx->sample_fmt  = AV_SAMPLE_FMT_FLTP;
1124
1125
167k
    i = s->metadata.nb_channels / 2;
1126
167k
    j = s->metadata.nb_channels;
1127
167k
    if ((ret = parse_audio(s1, 0, i, 0)) < 0)
1128
3.51k
        return ret;
1129
164k
    if ((ret = parse_audio(s1, i, j, 0)) < 0)
1130
648
        return ret;
1131
163k
    if ((ret = parse_metadata_ext(s1)) < 0)
1132
239
        return ret;
1133
163k
    if ((ret = parse_audio(s1, 0, i, 1)) < 0)
1134
716
        return ret;
1135
162k
    if ((ret = parse_audio(s1, i, j, 1)) < 0)
1136
1.19k
        return ret;
1137
161k
    if ((ret = parse_meter(s1)) < 0)
1138
345
        return ret;
1139
161k
    if ((ret = filter_frame(s1, frame)) < 0)
1140
0
        return ret;
1141
1142
161k
    *got_frame_ptr = 1;
1143
161k
    return avpkt->size;
1144
161k
}
1145
1146
static av_cold void dolby_e_flush(AVCodecContext *avctx)
1147
123k
{
1148
123k
    DBEDecodeContext *s = avctx->priv_data;
1149
1150
123k
    memset(s->history, 0, sizeof(s->history));
1151
123k
}
1152
1153
static av_cold int dolby_e_close(AVCodecContext *avctx)
1154
2.25k
{
1155
2.25k
    DBEDecodeContext *s = avctx->priv_data;
1156
1157
9.00k
    for (int i = 0; i < 3; i++) {
1158
6.75k
        av_tx_uninit(&s->imdct[0][i]);
1159
6.75k
        av_tx_uninit(&s->imdct[1][i]);
1160
6.75k
    }
1161
1162
2.25k
    av_freep(&s->fdsp);
1163
2.25k
    return 0;
1164
2.25k
}
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.25k
{
1255
2.25k
    static AVOnce init_once = AV_ONCE_INIT;
1256
2.25k
    DBEDecodeContext *s = avctx->priv_data;
1257
2.25k
    float scale = 2.0f;
1258
2.25k
    int ret;
1259
1260
2.25k
    if (ff_thread_once(&init_once, init_tables))
1261
0
        return AVERROR_UNKNOWN;
1262
1263
9.00k
    for (int i = 0; i < 3; i++) {
1264
6.75k
        if ((ret = av_tx_init(&s->imdct[0][i], &s->imdct_fn[0][i], AV_TX_FLOAT_MDCT,
1265
6.75k
                              1, 1 << imdct_bits_tab[i] - 1, &scale, 0)) < 0)
1266
0
            return ret;
1267
6.75k
        if ((ret = av_tx_init(&s->imdct[1][i], &s->imdct_fn[1][i], AV_TX_FLOAT_MDCT,
1268
6.75k
                              1, 1 << imdct_bits_tab[i] - 1, &scale, AV_TX_FULL_IMDCT)) < 0)
1269
0
            return ret;
1270
6.75k
    }
1271
1272
2.25k
    if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
1273
0
        return AVERROR(ENOMEM);
1274
1275
2.25k
    s->dectx.metadata.multi_prog_warned = s->dectx.metadata.output_channel_order == CHANNEL_ORDER_CODED;
1276
2.25k
    s->dectx.avctx = s->avctx = avctx;
1277
2.25k
    return 0;
1278
2.25k
}
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
};