FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dolby_e.c
Date: 2024-05-08 16:03:45
Exec Total Coverage
Lines: 346 417 83.0%
Functions: 22 23 95.7%
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 #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 5676 static int skip_input(DBEContext *s, int nb_words)
615 {
616
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5676 times.
5676 if (nb_words > s->input_size) {
617 av_log(s->avctx, AV_LOG_ERROR, "Packet too short\n");
618 return AVERROR_INVALIDDATA;
619 }
620
621 5676 s->input += nb_words * s->word_bytes;
622 5676 s->input_size -= nb_words;
623 5676 return 0;
624 }
625
626 1032 static int parse_key(DBEContext *s)
627 {
628
1/2
✓ Branch 0 taken 1032 times.
✗ Branch 1 not taken.
1032 if (s->key_present) {
629 1032 const uint8_t *key = s->input;
630 1032 int ret = skip_input(s, 1);
631
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1032 times.
1032 if (ret < 0)
632 return ret;
633 1032 return AV_RB24(key) >> 24 - s->word_bits;
634 }
635 return 0;
636 }
637
638 258 static int parse_metadata_ext(DBEDecodeContext *s1)
639 {
640 258 DBEContext *s = &s1->dectx;
641
1/2
✓ Branch 0 taken 258 times.
✗ Branch 1 not taken.
258 if (s->metadata.mtd_ext_size)
642 258 return skip_input(s, s->key_present + s->metadata.mtd_ext_size + 1);
643 return 0;
644 }
645
646 3124 static void unbias_exponents(DBEContext *s, DBEChannel *c, DBEGroup *g)
647 {
648 int mstr_exp[MAX_MSTR_EXP];
649 int bias_exp[MAX_BIAS_EXP];
650 int i, j, k;
651
652
2/2
✓ Branch 0 taken 5732 times.
✓ Branch 1 taken 3124 times.
8856 for (i = 0; i < c->nb_mstr_exp; i++)
653 5732 mstr_exp[i] = get_bits(&s->gb, 2) * 6;
654
655
2/2
✓ Branch 0 taken 140534 times.
✓ Branch 1 taken 3124 times.
143658 for (i = 0; i < g->nb_exponent; i++)
656 140534 bias_exp[i] = get_bits(&s->gb, 5);
657
658
2/2
✓ Branch 0 taken 5732 times.
✓ Branch 1 taken 3124 times.
8856 for (i = k = 0; i < c->nb_mstr_exp; i++)
659
2/2
✓ Branch 0 taken 140534 times.
✓ Branch 1 taken 5732 times.
146266 for (j = 0; j < g->nb_bias_exp[i]; j++, k++)
660 140534 c->exponents[g->exp_ofs + k] = mstr_exp[i] + bias_exp[k];
661 3124 }
662
663 3096 static int parse_exponents(DBEContext *s, DBEChannel *c)
664 {
665 DBEGroup *p, *g;
666 int i;
667
668
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++) {
669
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);
670
2/2
✓ Branch 0 taken 3124 times.
✓ Branch 1 taken 118 times.
3242 if (c->exp_strategy[i]) {
671 3124 unbias_exponents(s, c, g);
672 } else {
673 118 memcpy(c->exponents + g->exp_ofs,
674 118 c->exponents + p->exp_ofs,
675 118 g->nb_exponent * sizeof(c->exponents[0]));
676 }
677 }
678
679 3096 return 0;
680 }
681
682 349400 static inline int log_add(int a, int b)
683 {
684 349400 int c = FFABS(a - b) >> 1;
685 349400 return FFMAX(a, b) + log_add_tab[FFMIN(c, 211)];
686 }
687
688 43 static void calc_lowcomp(int *msk_val)
689 {
690 43 int lwc_val[17] = { 0 };
691 int i, j, k;
692
693
2/2
✓ Branch 0 taken 473 times.
✓ Branch 1 taken 43 times.
516 for (i = 0; i < 11; i++) {
694 473 int max_j = 0;
695 473 int max_v = INT_MIN;
696 473 int thr = 0;
697
698
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++) {
699 3053 int v = msk_val[j] + lwc_gain_tab[i][k];
700
2/2
✓ Branch 0 taken 1451 times.
✓ Branch 1 taken 1602 times.
3053 if (v > max_v) {
701 1451 max_j = j;
702 1451 max_v = v;
703 }
704 3053 thr = log_add(thr, v);
705 }
706
707
2/2
✓ Branch 0 taken 273 times.
✓ Branch 1 taken 200 times.
473 if (msk_val[i] < thr) {
708 273 for (j = FFMAX(max_j - 3, 0),
709 273 k = FFMAX(3 - max_j, 0);
710
2/2
✓ Branch 0 taken 1783 times.
✓ Branch 1 taken 273 times.
2056 j <= max_j + 3; j++, k++)
711 1783 lwc_val[j] += lwc_adj_tab[k];
712 }
713 }
714
715
2/2
✓ Branch 0 taken 688 times.
✓ Branch 1 taken 43 times.
731 for (i = 0; i < 16; i++) {
716 688 int v = FFMAX(lwc_val[i], -512);
717 688 msk_val[i] = FFMAX(msk_val[i] + v, 0);
718 }
719 43 }
720
721 3125 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 {
725 int msk_val[MAX_BIAS_EXP];
726 int psd_val[MAX_BIAS_EXP];
727 3125 int fast_leak = 0;
728 3125 int slow_leak = 0;
729 3125 int dc_code = dc_code_tab[fr_code - 1];
730 3125 int ht_code = ht_code_tab[fr_code - 1];
731 3125 int fast_gain = fast_gain_tab[fg_ofs];
732 3125 int slow_decay = slow_decay_tab[dc_code][msk_mod];
733 3125 int misc_decay = misc_decay_tab[nb_code][dc_code][msk_mod];
734 3125 const uint16_t *slow_gain = slow_gain_tab[nb_code][msk_mod];
735 3125 const uint16_t *fast_decay = fast_decay_tab[nb_code][dc_code][msk_mod];
736 3125 const uint16_t *fast_gain_adj = fast_gain_adj_tab[nb_code][dc_code];
737 3125 const uint16_t *hearing_thresh = hearing_thresh_tab[nb_code][ht_code];
738 int i;
739
740
2/2
✓ Branch 0 taken 140569 times.
✓ Branch 1 taken 3125 times.
143694 for (i = 0; i < nb_exponent; i++)
741 140569 psd_val[i] = (48 - exp[i]) * 64;
742
743 3125 fast_gain_adj += band_ofs_tab[nb_code][fg_spc];
744
2/2
✓ Branch 0 taken 140569 times.
✓ Branch 1 taken 3125 times.
143694 for (i = 0; i < nb_exponent; i++) {
745 140569 fast_leak = log_add(fast_leak - fast_decay[i],
746 140569 psd_val[i] - fast_gain + fast_gain_adj[i]);
747 140569 slow_leak = log_add(slow_leak - slow_decay,
748 140569 psd_val[i] - slow_gain[i]);
749 140569 msk_val[i] = FFMAX(fast_leak, slow_leak);
750 }
751
752 3125 fast_leak = 0;
753
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--) {
754 65209 fast_leak = log_add(fast_leak - misc_decay, psd_val[i] - fast_gain);
755 65209 msk_val[i] = FFMAX(msk_val[i], fast_leak);
756 }
757
758
2/2
✓ Branch 0 taken 140569 times.
✓ Branch 1 taken 3125 times.
143694 for (i = 0; i < nb_exponent; i++)
759 140569 msk_val[i] = FFMAX(msk_val[i], hearing_thresh[i]);
760
761
2/2
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 3082 times.
3125 if (!nb_code)
762 43 calc_lowcomp(msk_val);
763
764
2/2
✓ Branch 0 taken 140569 times.
✓ Branch 1 taken 3125 times.
143694 for (i = 0; i < nb_exponent; i++) {
765 140569 int v = 16 * (snr_ofs - 64) + psd_val[i] - msk_val[i] >> 5;
766 140569 bap[i] = bap_tab[av_clip_uintp2(v, 6)];
767 }
768 3125 }
769
770 3096 static int parse_bit_alloc(DBEDecodeContext *s1, DBEChannel *c)
771 {
772 3096 DBEContext *s = &s1->dectx;
773 DBEGroup *p, *g;
774 int bap_strategy[MAX_GROUPS], fg_spc[MAX_GROUPS];
775 int fg_ofs[MAX_GROUPS], msk_mod[MAX_GROUPS];
776 int i, snr_ofs;
777
778
2/2
✓ Branch 0 taken 3242 times.
✓ Branch 1 taken 3096 times.
6338 for (i = 0; i < c->nb_groups; i++) {
779
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);
780
2/2
✓ Branch 0 taken 3098 times.
✓ Branch 1 taken 144 times.
3242 if (bap_strategy[i]) {
781 3098 fg_spc[i] = get_bits(&s->gb, 2);
782 3098 fg_ofs[i] = get_bits(&s->gb, 3);
783 3098 msk_mod[i] = get_bits1(&s->gb);
784 } else {
785 144 fg_spc[i] = fg_spc[i - 1];
786 144 fg_ofs[i] = fg_ofs[i - 1];
787 144 msk_mod[i] = msk_mod[i - 1];
788 }
789 }
790
791
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if (get_bits1(&s->gb)) {
792 avpriv_report_missing_feature(s->avctx, "Delta bit allocation");
793 return AVERROR_PATCHWELCOME;
794 }
795
796 3096 snr_ofs = get_bits(&s->gb, 8);
797
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3096 times.
3096 if (!snr_ofs) {
798 memset(c->bap, 0, sizeof(c->bap));
799 return 0;
800 }
801
802
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++) {
803
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]) {
804 3125 bit_allocate(g->nb_exponent, g->imdct_idx, s->metadata.fr_code,
805 3125 c->exponents + g->exp_ofs, c->bap + g->exp_ofs,
806 fg_spc[i], fg_ofs[i], msk_mod[i], snr_ofs);
807 } else {
808 117 memcpy(c->bap + g->exp_ofs,
809 117 c->bap + p->exp_ofs,
810 117 g->nb_exponent * sizeof(c->bap[0]));
811 }
812 }
813
814 3096 return 0;
815 }
816
817 3096 static int parse_indices(DBEContext *s, DBEChannel *c)
818 {
819 DBEGroup *p, *g;
820 int i, j;
821
822
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++) {
823
2/2
✓ Branch 1 taken 3074 times.
✓ Branch 2 taken 168 times.
3242 if (get_bits1(&s->gb)) {
824 3074 int start = get_bits(&s->gb, 6);
825
826
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3074 times.
3074 if (start > g->nb_exponent) {
827 av_log(s->avctx, AV_LOG_ERROR, "Invalid start index\n");
828 return AVERROR_INVALIDDATA;
829 }
830
831
2/2
✓ Branch 0 taken 82713 times.
✓ Branch 1 taken 3074 times.
85787 for (j = 0; j < start; j++)
832 82713 c->idx[g->exp_ofs + j] = 0;
833
834
2/2
✓ Branch 0 taken 56023 times.
✓ Branch 1 taken 3074 times.
59097 for (; j < g->nb_exponent; j++)
835 56023 c->idx[g->exp_ofs + j] = get_bits(&s->gb, 2);
836
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) {
837 138 memcpy(c->idx + g->exp_ofs,
838 138 c->idx + p->exp_ofs,
839 138 g->nb_exponent * sizeof(c->idx[0]));
840 } else {
841 30 memset(c->idx + g->exp_ofs, 0, g->nb_exponent * sizeof(c->idx[0]));
842 }
843 }
844
845 3096 return 0;
846 }
847
848 3096 static int parse_mantissas(DBEContext *s, DBEChannel *c)
849 {
850 DBEGroup *g;
851 int i, j, k;
852
853
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++) {
854 3242 float *mnt = c->mantissas + g->mnt_ofs;
855
856
2/2
✓ Branch 0 taken 144664 times.
✓ Branch 1 taken 3242 times.
147906 for (j = 0; j < g->nb_exponent; j++) {
857 144664 int bap = c->bap[g->exp_ofs + j];
858 144664 int idx = c->idx[g->exp_ofs + j];
859 144664 int size1 = mantissa_size1[bap][idx];
860 144664 int count = g->nb_mantissa[j];
861 144664 float exp = exponent_tab[c->exponents[g->exp_ofs + j]];
862 144664 float scale = mantissa_tab1[size1][idx] * exp;
863
864
2/2
✓ Branch 0 taken 7050 times.
✓ Branch 1 taken 137614 times.
144664 if (!size1) {
865 7050 memset(mnt, 0, count * sizeof(*mnt));
866
2/2
✓ Branch 0 taken 37698 times.
✓ Branch 1 taken 99916 times.
137614 } else if (idx) {
867 int values[100];
868 37698 int escape = -(1 << size1 - 1);
869
870
2/2
✓ Branch 0 taken 1215688 times.
✓ Branch 1 taken 37698 times.
1253386 for (k = 0; k < count; k++)
871 1215688 values[k] = get_sbits(&s->gb, size1);
872
873
2/2
✓ Branch 0 taken 1215688 times.
✓ Branch 1 taken 37698 times.
1253386 for (k = 0; k < count; k++) {
874
2/2
✓ Branch 0 taken 1082370 times.
✓ Branch 1 taken 133318 times.
1215688 if (values[k] != escape) {
875 1082370 mnt[k] = values[k] * scale;
876 } else {
877 133318 int size2 = mantissa_size2[bap][idx];
878 133318 int value = get_sbits(&s->gb, size2);
879 133318 float a = mantissa_tab2[size2][idx];
880 133318 float b = mantissa_tab3[size2][idx];
881
2/2
✓ Branch 0 taken 66652 times.
✓ Branch 1 taken 66666 times.
133318 if (value < 0)
882 66652 mnt[k] = ((value + 1) * a - b) * exp;
883 else
884 66666 mnt[k] = (value * a + b) * exp;
885 }
886 }
887 } else {
888
2/2
✓ Branch 0 taken 816305 times.
✓ Branch 1 taken 99916 times.
916221 for (k = 0; k < count; k++)
889 816305 mnt[k] = get_sbits(&s->gb, size1) * scale;
890 }
891
892 144664 mnt += count;
893 }
894
895
2/2
✓ Branch 0 taken 15468 times.
✓ Branch 1 taken 3242 times.
18710 for (; j < g->nb_exponent + c->bw_code; j++) {
896 15468 memset(mnt, 0, g->nb_mantissa[j] * sizeof(*mnt));
897 15468 mnt += g->nb_mantissa[j];
898 }
899 }
900
901 3096 return 0;
902 }
903
904 3096 static int parse_channel(DBEDecodeContext *s1, int ch, int seg_id)
905 {
906 3096 DBEContext *s = &s1->dectx;
907 3096 DBEChannel *c = &s1->channels[seg_id][ch];
908 int i, ret;
909
910
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3096 times.
3096 if (s->metadata.rev_id[ch] > 1) {
911 avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s->metadata.rev_id[ch]);
912 return AVERROR_PATCHWELCOME;
913 }
914
915
2/2
✓ Branch 0 taken 516 times.
✓ Branch 1 taken 2580 times.
3096 if (ch == lfe_channel_tab[s->metadata.prog_conf]) {
916 516 c->gr_code = 3;
917 516 c->bw_code = 29;
918 } else {
919 2580 c->gr_code = get_bits(&s->gb, 2);
920 2580 c->bw_code = get_bits(&s->gb, 3);
921
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2580 times.
2580 if (c->gr_code == 3) {
922 av_log(s->avctx, AV_LOG_ERROR, "Invalid group type code\n");
923 return AVERROR_INVALIDDATA;
924 }
925 }
926
927 3096 c->nb_groups = nb_groups_tab[c->gr_code];
928 3096 c->nb_mstr_exp = nb_mstr_exp_tab[c->gr_code];
929
930
2/2
✓ Branch 0 taken 3242 times.
✓ Branch 1 taken 3096 times.
6338 for (i = 0; i < c->nb_groups; i++) {
931 3242 c->groups[i] = frm_ofs_tab[seg_id][c->gr_code][i];
932
2/2
✓ Branch 0 taken 2726 times.
✓ Branch 1 taken 516 times.
3242 if (c->nb_mstr_exp == 2) {
933 2726 c->groups[i].nb_exponent -= c->bw_code;
934 2726 c->groups[i].nb_bias_exp[1] -= c->bw_code;
935 }
936 }
937
938
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if ((ret = parse_exponents(s, c)) < 0)
939 return ret;
940
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if ((ret = parse_bit_alloc(s1, c)) < 0)
941 return ret;
942
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if ((ret = parse_indices(s, c)) < 0)
943 return ret;
944
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if ((ret = parse_mantissas(s, c)) < 0)
945 return ret;
946
947
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if (get_bits_left(&s->gb) < 0) {
948 av_log(s->avctx, AV_LOG_ERROR, "Read past end of channel %d\n", ch);
949 return AVERROR_INVALIDDATA;
950 }
951
952 3096 return 0;
953 }
954
955 1032 static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id)
956 {
957 1032 DBEContext *s = &s1->dectx;
958 int ch, ret, key;
959
960
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1032 times.
1032 if ((key = parse_key(s)) < 0)
961 return key;
962
963
2/2
✓ Branch 0 taken 3096 times.
✓ Branch 1 taken 1032 times.
4128 for (ch = start; ch < end; ch++) {
964
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3096 times.
3096 if (!s->metadata.ch_size[ch]) {
965 s1->channels[seg_id][ch].nb_groups = 0;
966 continue;
967 }
968 3096 ret = ff_dolby_e_convert_input(s, s->metadata.ch_size[ch], key);
969
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3096 times.
3096 if (ret < 0)
970 return ret;
971
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if ((ret = parse_channel(s1, ch, seg_id)) < 0) {
972 if (s1->avctx->err_recognition & AV_EF_EXPLODE)
973 return ret;
974 s1->channels[seg_id][ch].nb_groups = 0;
975 }
976
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3096 times.
3096 if ((ret = skip_input(s, s->metadata.ch_size[ch])) < 0)
977 return ret;
978 }
979
980 1032 return skip_input(s, 1);
981 }
982
983 258 static int parse_meter(DBEDecodeContext *s1)
984 {
985 258 DBEContext *s = &s1->dectx;
986
1/2
✓ Branch 0 taken 258 times.
✗ Branch 1 not taken.
258 if (s->metadata.meter_size)
987 258 return skip_input(s, s->key_present + s->metadata.meter_size + 1);
988 return 0;
989 }
990
991 3242 static void imdct_calc(DBEDecodeContext *s1, DBEGroup *g, float *result, float *values)
992 {
993 3242 AVTXContext *imdct = s1->imdct[g->imdct_phs == 1][g->imdct_idx];
994 3242 av_tx_fn imdct_fn = s1->imdct_fn[g->imdct_phs == 1][g->imdct_idx];
995 3242 int n = 1 << imdct_bits_tab[g->imdct_idx];
996 3242 int n2 = n >> 1;
997
998
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) {
999 1548 case 0:
1000 1548 imdct_fn(imdct, result, values, sizeof(float));
1001
2/2
✓ Branch 0 taken 1575296 times.
✓ Branch 1 taken 1548 times.
1576844 for (int i = 0; i < n2; i++)
1002 1575296 result[n2 + i] = result[n2 - i - 1];
1003 1548 break;
1004 146 case 1:
1005 146 imdct_fn(imdct, result, values, sizeof(float));
1006 146 break;
1007 1548 case 2:
1008 1548 imdct_fn(imdct, result + n2, values, sizeof(float));
1009
2/2
✓ Branch 0 taken 1575296 times.
✓ Branch 1 taken 1548 times.
1576844 for (int i = 0; i < n2; i++)
1010 1575296 result[i] = -result[n - i - 1];
1011 1548 break;
1012 default:
1013 av_assert0(0);
1014 }
1015 3242 }
1016
1017 3096 static void transform(DBEDecodeContext *s1, DBEChannel *c, float *history, float *output)
1018 {
1019 3096 LOCAL_ALIGNED_32(float, buffer, [2048]);
1020 3096 LOCAL_ALIGNED_32(float, result, [1152]);
1021 DBEGroup *g;
1022 int i;
1023
1024 3096 memset(result, 0, 1152 * sizeof(float));
1025
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++) {
1026 3242 float *src = buffer + g->src_ofs;
1027 3242 float *dst = result + g->dst_ofs;
1028 3242 float *win = window + g->win_ofs;
1029
1030 3242 imdct_calc(s1, g, buffer, c->mantissas + g->mnt_ofs);
1031 3242 s1->fdsp->vector_fmul_add(dst, src, win, dst, g->win_len);
1032 }
1033
1034
2/2
✓ Branch 0 taken 792576 times.
✓ Branch 1 taken 3096 times.
795672 for (i = 0; i < 256; i++)
1035 792576 output[i] = history[i] + result[i];
1036
2/2
✓ Branch 0 taken 1981440 times.
✓ Branch 1 taken 3096 times.
1984536 for (i = 256; i < 896; i++)
1037 1981440 output[i] = result[i];
1038
2/2
✓ Branch 0 taken 792576 times.
✓ Branch 1 taken 3096 times.
795672 for (i = 0; i < 256; i++)
1039 792576 history[i] = result[896 + i];
1040 3096 }
1041
1042 1548 static void apply_gain(DBEDecodeContext *s, int begin, int end, float *output)
1043 {
1044
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)
1045 1548 return;
1046
1047 if (begin == end) {
1048 s->fdsp->vector_fmul_scalar(output, output, gain_tab[end], FRAME_SAMPLES);
1049 } else {
1050 float a = gain_tab[begin] * (1.0f / (FRAME_SAMPLES - 1));
1051 float b = gain_tab[end ] * (1.0f / (FRAME_SAMPLES - 1));
1052 int i;
1053
1054 for (i = 0; i < FRAME_SAMPLES; i++)
1055 output[i] *= a * (FRAME_SAMPLES - i - 1) + b * i;
1056 }
1057 }
1058
1059 258 static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
1060 {
1061 258 const DolbyEHeaderInfo *const metadata = &s->dectx.metadata;
1062 const uint8_t *reorder;
1063 int ch, ret;
1064
1065
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 258 times.
258 if (metadata->nb_channels == 4)
1066 reorder = ch_reorder_4;
1067
1/2
✓ Branch 0 taken 258 times.
✗ Branch 1 not taken.
258 else if (metadata->nb_channels == 6)
1068 258 reorder = ch_reorder_6;
1069 else if (metadata->nb_programs == 1 && metadata->output_channel_order == CHANNEL_ORDER_DEFAULT)
1070 reorder = ch_reorder_8;
1071 else
1072 reorder = ch_reorder_n;
1073
1074 258 frame->nb_samples = FRAME_SAMPLES;
1075
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0)
1076 return ret;
1077
1078
2/2
✓ Branch 0 taken 1548 times.
✓ Branch 1 taken 258 times.
1806 for (ch = 0; ch < metadata->nb_channels; ch++) {
1079 1548 float *output = (float *)frame->extended_data[reorder[ch]];
1080 1548 transform(s, &s->channels[0][ch], s->history[ch], output);
1081 1548 transform(s, &s->channels[1][ch], s->history[ch], output + FRAME_SAMPLES / 2);
1082 1548 apply_gain(s, metadata->begin_gain[ch], metadata->end_gain[ch], output);
1083 }
1084
1085 258 return 0;
1086 }
1087
1088 258 static int dolby_e_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1089 int *got_frame_ptr, AVPacket *avpkt)
1090 {
1091 258 DBEDecodeContext *s1 = avctx->priv_data;
1092 258 DBEContext *s = &s1->dectx;
1093 int i, j, ret;
1094
1095
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)
1096 return ret;
1097
1098
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) {
1099 av_log(avctx, AV_LOG_WARNING, "Stream has %d programs (configuration %d), "
1100 "channels will be output in native order.\n",
1101 s->metadata.nb_programs, s->metadata.prog_conf);
1102 s->metadata.multi_prog_warned = 1;
1103 }
1104
1105 258 av_channel_layout_uninit(&avctx->ch_layout);
1106
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) {
1107 case 4:
1108 avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0;
1109 break;
1110 258 case 6:
1111 258 avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1;
1112 258 break;
1113 case 8:
1114 avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1;
1115 break;
1116 default:
1117 avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC;
1118 avctx->ch_layout.nb_channels = s->metadata.nb_channels;
1119 break;
1120 }
1121
1122 258 avctx->sample_rate = s->metadata.sample_rate;
1123 258 avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
1124
1125 258 i = s->metadata.nb_channels / 2;
1126 258 j = s->metadata.nb_channels;
1127
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = parse_audio(s1, 0, i, 0)) < 0)
1128 return ret;
1129
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = parse_audio(s1, i, j, 0)) < 0)
1130 return ret;
1131
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = parse_metadata_ext(s1)) < 0)
1132 return ret;
1133
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = parse_audio(s1, 0, i, 1)) < 0)
1134 return ret;
1135
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = parse_audio(s1, i, j, 1)) < 0)
1136 return ret;
1137
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = parse_meter(s1)) < 0)
1138 return ret;
1139
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 if ((ret = filter_frame(s1, frame)) < 0)
1140 return ret;
1141
1142 258 *got_frame_ptr = 1;
1143 258 return avpkt->size;
1144 }
1145
1146 static av_cold void dolby_e_flush(AVCodecContext *avctx)
1147 {
1148 DBEDecodeContext *s = avctx->priv_data;
1149
1150 memset(s->history, 0, sizeof(s->history));
1151 }
1152
1153 3 static av_cold int dolby_e_close(AVCodecContext *avctx)
1154 {
1155 3 DBEDecodeContext *s = avctx->priv_data;
1156
1157
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
12 for (int i = 0; i < 3; i++) {
1158 9 av_tx_uninit(&s->imdct[0][i]);
1159 9 av_tx_uninit(&s->imdct[1][i]);
1160 }
1161
1162 3 av_freep(&s->fdsp);
1163 3 return 0;
1164 }
1165
1166
1167 2 static av_cold void init_tables(void)
1168 {
1169 int i, j;
1170
1171
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 2 times.
34 for (i = 1; i < 17; i++)
1172 32 mantissa_tab1[i][0] = 1.0f / (1 << i - 1);
1173
1174
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 2 times.
30 for (i = 2; i < 16; i++) {
1175 28 mantissa_tab1[i][1] = 1.0f / ((1 << i) - 1);
1176 28 mantissa_tab1[i][2] = 0.5f / ((1 << i) - 1);
1177 28 mantissa_tab1[i][3] = 0.25f / ((1 << i) - 1);
1178 }
1179
1180 2 mantissa_tab1[i][1] = 0.5f / (1 << 15);
1181 2 mantissa_tab1[i][2] = 0.75f / (1 << 15);
1182 2 mantissa_tab1[i][3] = 0.875f / (1 << 15);
1183
1184
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 2 times.
34 for (i = 1; i < 17; i++) {
1185 32 mantissa_tab2[i][1] = mantissa_tab1[i][0] * 0.5f;
1186 32 mantissa_tab2[i][2] = mantissa_tab1[i][0] * 0.75f;
1187 32 mantissa_tab2[i][3] = mantissa_tab1[i][0] * 0.875f;
1188
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 32 times.
128 for (j = 1; j < 4; j++)
1189 96 mantissa_tab3[i][j] = 1.0f / (1 << i) + 1.0f / (1 << j) - 1.0f / (1 << i + j);
1190 }
1191
1192 2 mantissa_tab3[1][3] = 0.6875f;
1193
1194
2/2
✓ Branch 0 taken 50 times.
✓ Branch 1 taken 2 times.
52 for (i = 0; i < 25; i++) {
1195 50 exponent_tab[i * 2 ] = 1.0f / (1 << i);
1196 50 exponent_tab[i * 2 + 1] = M_SQRT1_2 / (1 << i);
1197 }
1198
1199
2/2
✓ Branch 0 taken 2046 times.
✓ Branch 1 taken 2 times.
2048 for (i = 1; i < 1024; i++)
1200 2046 gain_tab[i] = exp2f((i - 960) / 64.0f);
1201
1202 // short 1
1203 2 ff_kbd_window_init(window, 3.0f, 128);
1204
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 2 times.
258 for (i = 0; i < 128; i++)
1205 256 window[128 + i] = window[127 - i];
1206
1207 // start
1208
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 2 times.
386 for (i = 0; i < 192; i++)
1209 384 window[256 + i] = start_window[i];
1210
1211 // short 2
1212
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 2 times.
386 for (i = 0; i < 192; i++)
1213 384 window[448 + i] = short_window2[i];
1214
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 2 times.
130 for (i = 0; i < 64; i++)
1215 128 window[640 + i] = window[63 - i];
1216
1217 // short 3
1218
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 2 times.
130 for (i = 0; i < 64; i++)
1219 128 window[704 + i] = short_window3[i];
1220
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 2 times.
386 for (i = 0; i < 192; i++)
1221 384 window[768 + i] = window[64 + i];
1222
1223 // bridge
1224
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 2 times.
258 for (i = 0; i < 128; i++)
1225 256 window[960 + i] = window[i];
1226
2/2
✓ Branch 0 taken 128 times.
✓ Branch 1 taken 2 times.
130 for (i = 0; i < 64; i++)
1227 128 window[1088 + i] = 1.0f;
1228
1229 // long
1230 2 ff_kbd_window_init(window + 1408, 3.0f, 256);
1231
2/2
✓ Branch 0 taken 1280 times.
✓ Branch 1 taken 2 times.
1282 for (i = 0; i < 640; i++)
1232 1280 window[1664 + i] = 1.0f;
1233
2/2
✓ Branch 0 taken 512 times.
✓ Branch 1 taken 2 times.
514 for (i = 0; i < 256; i++)
1234 512 window[2304 + i] = window[1152 + i] = window[1663 - i];
1235
1236 // reverse start
1237
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 2 times.
386 for (i = 0; i < 192; i++)
1238 384 window[2560 + i] = window[447 - i];
1239
1240 // reverse short 2
1241
2/2
✓ Branch 0 taken 512 times.
✓ Branch 1 taken 2 times.
514 for (i = 0; i < 256; i++)
1242 512 window[2752 + i] = window[703 - i];
1243
1244 // reverse short 3
1245
2/2
✓ Branch 0 taken 512 times.
✓ Branch 1 taken 2 times.
514 for (i = 0; i < 256; i++)
1246 512 window[3008 + i] = window[959 - i];
1247
1248 // reverse bridge
1249
2/2
✓ Branch 0 taken 896 times.
✓ Branch 1 taken 2 times.
898 for (i = 0; i < 448; i++)
1250 896 window[3264 + i] = window[1407 - i];
1251 2 }
1252
1253 3 static av_cold int dolby_e_init(AVCodecContext *avctx)
1254 {
1255 static AVOnce init_once = AV_ONCE_INIT;
1256 3 DBEDecodeContext *s = avctx->priv_data;
1257 3 float scale = 2.0f;
1258 int ret;
1259
1260
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (ff_thread_once(&init_once, init_tables))
1261 return AVERROR_UNKNOWN;
1262
1263
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
12 for (int i = 0; i < 3; i++) {
1264
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 if ((ret = av_tx_init(&s->imdct[0][i], &s->imdct_fn[0][i], AV_TX_FLOAT_MDCT,
1265 9 1, 1 << imdct_bits_tab[i] - 1, &scale, 0)) < 0)
1266 return ret;
1267
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 if ((ret = av_tx_init(&s->imdct[1][i], &s->imdct_fn[1][i], AV_TX_FLOAT_MDCT,
1268 9 1, 1 << imdct_bits_tab[i] - 1, &scale, AV_TX_FULL_IMDCT)) < 0)
1269 return ret;
1270 }
1271
1272
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
1273 return AVERROR(ENOMEM);
1274
1275 3 s->dectx.metadata.multi_prog_warned = s->dectx.metadata.output_channel_order == CHANNEL_ORDER_CODED;
1276 3 s->dectx.avctx = s->avctx = avctx;
1277 3 return 0;
1278 }
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 .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE },
1314 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1315 };
1316