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 |