FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dolby_e.c
Date: 2022-07-05 19:52:29
Exec Total Coverage
Lines: 341 411 83.0%
Branches: 196 250 78.4%

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