FFmpeg
Loading...
Searching...
No Matches
dolby_e.c
Go to the documentation of this file.
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
22#include "libavutil/float_dsp.h"
23#include "libavutil/thread.h"
24#include "libavutil/mem.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
48
49typedef struct DBEGroup {
50 uint8_t nb_exponent;
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
78
92
93static 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
98static const uint8_t ch_reorder_4[4] = { 0, 2, 1, 3 };
99static const uint8_t ch_reorder_6[6] = { 0, 2, 4, 1, 3, 5 };
100static const uint8_t ch_reorder_8[8] = { 0, 2, 6, 4, 1, 3, 7, 5 };
101static const uint8_t ch_reorder_n[8] = { 0, 2, 4, 6, 1, 3, 5, 7 };
102
103
104static const uint8_t nb_groups_tab[4] = { 1, 8, 7, 1 };
105
106static const uint8_t nb_mstr_exp_tab[4] = { 2, 2, 2, 1 };
107
108static 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
114static 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
120static 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
127static const uint8_t imdct_bits_tab[3] = { 8, 9, 11 };
128
129static const DBEGroup grp_tab_0[1] = {
130 { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
131};
132
133static 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
144static 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
154static const DBEGroup grp_tab_3[1] = {
155 { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 0, 1152, 0, 1408, 0 },
156};
157
158static const DBEGroup grp_tab_4[1] = {
159 { 50, { 27, 23 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
160};
161
162static 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
173static 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
183static const DBEGroup grp_tab_7[1] = {
184 { 21, { 21 }, 0, 0, nb_mantissa_50, 2, 2, 1152, 0, 1408, 896 },
185};
186
187static const DBEGroup *const frm_ofs_tab[2][4] = {
190};
191
192static 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
199static 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
206static 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
259static 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
312static 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
331static const uint8_t dc_code_tab[5] = { 0, 0, 0, 1, 1 };
332
333static const uint8_t ht_code_tab[5] = { 0, 0, 1, 2, 2 };
334
335static const uint8_t band_ofs_tab[3][4] = {
336 { 12, 8, 4, 0 }, { 14, 10, 6, 0 }, { 12, 8, 4, 0 }
337};
338
339static const uint8_t band_low_tab[3] = { 9, 17, 24 };
340
341static const uint16_t fast_gain_tab[8] = {
342 128, 256, 384, 512, 640, 768, 896, 1024
343};
344
345static const uint16_t slow_decay_tab[2][2] = { { 27, -1 }, { 32, 21 } };
346
347static 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
353static 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
425static 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
471static 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
509static 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
564static 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
578static const int16_t lwc_adj_tab[7] = {
579 -192, -320, -448, -512, -448, -320, -192,
580};
581
582static 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
599static 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
606static float mantissa_tab1[17][4];
607static float mantissa_tab2[17][4];
608static float mantissa_tab3[17][4];
609static float exponent_tab[50];
610static float gain_tab[1024];
611
612DECLARE_ALIGNED(32, static float, window)[3712];
613
614static int skip_input(DBEContext *s, int nb_words)
615{
616 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 s->input += nb_words * s->word_bytes;
622 s->input_size -= nb_words;
623 return 0;
624}
625
627{
628 if (s->key_present) {
629 const uint8_t *key = s->input;
630 int ret = skip_input(s, 1);
631 if (ret < 0)
632 return ret;
633 return AV_RB24(key) >> 24 - s->word_bits;
634 }
635 return 0;
636}
637
639{
640 DBEContext *s = &s1->dectx;
641 if (s->metadata.mtd_ext_size)
642 return skip_input(s, s->key_present + s->metadata.mtd_ext_size + 1);
643 return 0;
644}
645
647{
648 int mstr_exp[MAX_MSTR_EXP];
649 int bias_exp[MAX_BIAS_EXP];
650 int i, j, k;
651
652 for (i = 0; i < c->nb_mstr_exp; i++)
653 mstr_exp[i] = get_bits(&s->gb, 2) * 6;
654
655 for (i = 0; i < g->nb_exponent; i++)
656 bias_exp[i] = get_bits(&s->gb, 5);
657
658 for (i = k = 0; i < c->nb_mstr_exp; i++)
659 for (j = 0; j < g->nb_bias_exp[i]; j++, k++)
660 c->exponents[g->exp_ofs + k] = mstr_exp[i] + bias_exp[k];
661}
662
664{
665 DBEGroup *p, *g;
666 int i;
667
668 for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
669 c->exp_strategy[i] = !i || g->nb_exponent != p->nb_exponent || get_bits1(&s->gb);
670 if (c->exp_strategy[i]) {
672 } else {
673 memcpy(c->exponents + g->exp_ofs,
674 c->exponents + p->exp_ofs,
675 g->nb_exponent * sizeof(c->exponents[0]));
676 }
677 }
678
679 return 0;
680}
681
682static inline int log_add(int a, int b)
683{
684 int c = FFABS(a - b) >> 1;
685 return FFMAX(a, b) + log_add_tab[FFMIN(c, 211)];
686}
687
688static void calc_lowcomp(int *msk_val)
689{
690 int lwc_val[17] = { 0 };
691 int i, j, k;
692
693 for (i = 0; i < 11; i++) {
694 int max_j = 0;
695 int max_v = INT_MIN;
696 int thr = 0;
697
698 for (j = FFMAX(i - 3, 0), k = 0; j <= i + 3; j++, k++) {
699 int v = msk_val[j] + lwc_gain_tab[i][k];
700 if (v > max_v) {
701 max_j = j;
702 max_v = v;
703 }
704 thr = log_add(thr, v);
705 }
706
707 if (msk_val[i] < thr) {
708 for (j = FFMAX(max_j - 3, 0),
709 k = FFMAX(3 - max_j, 0);
710 j <= max_j + 3; j++, k++)
711 lwc_val[j] += lwc_adj_tab[k];
712 }
713 }
714
715 for (i = 0; i < 16; i++) {
716 int v = FFMAX(lwc_val[i], -512);
717 msk_val[i] = FFMAX(msk_val[i] + v, 0);
718 }
719}
720
721static 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 int fast_leak = 0;
728 int slow_leak = 0;
729 int dc_code = dc_code_tab[fr_code - 1];
730 int ht_code = ht_code_tab[fr_code - 1];
731 int fast_gain = fast_gain_tab[fg_ofs];
732 int slow_decay = slow_decay_tab[dc_code][msk_mod];
733 int misc_decay = misc_decay_tab[nb_code][dc_code][msk_mod];
734 const uint16_t *slow_gain = slow_gain_tab[nb_code][msk_mod];
735 const uint16_t *fast_decay = fast_decay_tab[nb_code][dc_code][msk_mod];
736 const uint16_t *fast_gain_adj = fast_gain_adj_tab[nb_code][dc_code];
737 const uint16_t *hearing_thresh = hearing_thresh_tab[nb_code][ht_code];
738 int i;
739
740 for (i = 0; i < nb_exponent; i++)
741 psd_val[i] = (48 - exp[i]) * 64;
742
743 fast_gain_adj += band_ofs_tab[nb_code][fg_spc];
744 for (i = 0; i < nb_exponent; i++) {
745 fast_leak = log_add(fast_leak - fast_decay[i],
746 psd_val[i] - fast_gain + fast_gain_adj[i]);
747 slow_leak = log_add(slow_leak - slow_decay,
748 psd_val[i] - slow_gain[i]);
749 msk_val[i] = FFMAX(fast_leak, slow_leak);
750 }
751
752 fast_leak = 0;
753 for (i = nb_exponent - 1; i > band_low_tab[nb_code]; i--) {
754 fast_leak = log_add(fast_leak - misc_decay, psd_val[i] - fast_gain);
755 msk_val[i] = FFMAX(msk_val[i], fast_leak);
756 }
757
758 for (i = 0; i < nb_exponent; i++)
759 msk_val[i] = FFMAX(msk_val[i], hearing_thresh[i]);
760
761 if (!nb_code)
762 calc_lowcomp(msk_val);
763
764 for (i = 0; i < nb_exponent; i++) {
765 int v = 16 * (snr_ofs - 64) + psd_val[i] - msk_val[i] >> 5;
766 bap[i] = bap_tab[av_clip_uintp2(v, 6)];
767 }
768}
769
771{
772 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 for (i = 0; i < c->nb_groups; i++) {
779 bap_strategy[i] = !i || get_bits1(&s->gb);
780 if (bap_strategy[i]) {
781 fg_spc[i] = get_bits(&s->gb, 2);
782 fg_ofs[i] = get_bits(&s->gb, 3);
783 msk_mod[i] = get_bits1(&s->gb);
784 } else {
785 fg_spc[i] = fg_spc[i - 1];
786 fg_ofs[i] = fg_ofs[i - 1];
787 msk_mod[i] = msk_mod[i - 1];
788 }
789 }
790
791 if (get_bits1(&s->gb)) {
792 avpriv_report_missing_feature(s->avctx, "Delta bit allocation");
794 }
795
796 snr_ofs = get_bits(&s->gb, 8);
797 if (!snr_ofs) {
798 memset(c->bap, 0, sizeof(c->bap));
799 return 0;
800 }
801
802 for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
803 if (c->exp_strategy[i] || bap_strategy[i]) {
804 bit_allocate(g->nb_exponent, g->imdct_idx, s->metadata.fr_code,
805 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 memcpy(c->bap + g->exp_ofs,
809 c->bap + p->exp_ofs,
810 g->nb_exponent * sizeof(c->bap[0]));
811 }
812 }
813
814 return 0;
815}
816
818{
819 DBEGroup *p, *g;
820 int i, j;
821
822 for (i = 0, p = NULL, g = c->groups; i < c->nb_groups; i++, p = g, g++) {
823 if (get_bits1(&s->gb)) {
824 int start = get_bits(&s->gb, 6);
825
826 if (start > g->nb_exponent) {
827 av_log(s->avctx, AV_LOG_ERROR, "Invalid start index\n");
828 return AVERROR_INVALIDDATA;
829 }
830
831 for (j = 0; j < start; j++)
832 c->idx[g->exp_ofs + j] = 0;
833
834 for (; j < g->nb_exponent; j++)
835 c->idx[g->exp_ofs + j] = get_bits(&s->gb, 2);
836 } else if (i && g->nb_exponent == p->nb_exponent) {
837 memcpy(c->idx + g->exp_ofs,
838 c->idx + p->exp_ofs,
839 g->nb_exponent * sizeof(c->idx[0]));
840 } else {
841 memset(c->idx + g->exp_ofs, 0, g->nb_exponent * sizeof(c->idx[0]));
842 }
843 }
844
845 return 0;
846}
847
848#define MIN_MANTISSAS 800
850{
851 DBEGroup *g;
852 int i, j, k;
853
854 for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
855 float *mnt = c->mantissas + g->mnt_ofs;
856
857 for (j = 0; j < g->nb_exponent; j++) {
858 int bap = c->bap[g->exp_ofs + j];
859 int idx = c->idx[g->exp_ofs + j];
860 int size1 = mantissa_size1[bap][idx];
861 int count = g->nb_mantissa[j];
862 float exp = exponent_tab[c->exponents[g->exp_ofs + j]];
863 float scale = mantissa_tab1[size1][idx] * exp;
864
865 if (!size1) {
866 memset(mnt, 0, count * sizeof(*mnt));
867 } else if (idx) {
868 int values[100];
869 int escape = -(1 << size1 - 1);
870
871 for (k = 0; k < count; k++)
872 values[k] = get_sbits(&s->gb, size1);
873
874 for (k = 0; k < count; k++) {
875 if (values[k] != escape) {
876 mnt[k] = values[k] * scale;
877 } else {
878 int size2 = mantissa_size2[bap][idx];
879 int value = get_sbits(&s->gb, size2);
880 float a = mantissa_tab2[size2][idx];
881 float b = mantissa_tab3[size2][idx];
882 if (value < 0)
883 mnt[k] = ((value + 1) * a - b) * exp;
884 else
885 mnt[k] = (value * a + b) * exp;
886 }
887 }
888 } else {
889 if (i == c->nb_groups - 1
890 && count * size1 > get_bits_left(&s->gb)
891 && get_bits_left(&s->gb) >= 0
892 && (int)(mnt - c->mantissas) >= MIN_MANTISSAS) {
893 av_log(s->avctx, AV_LOG_WARNING, "Truncated mantissas @%d, highest frequencies not recoverable\n", (int)(mnt - c->mantissas));
894 break;
895 }
896 for (k = 0; k < count; k++)
897 mnt[k] = get_sbits(&s->gb, size1) * scale;
898 }
899
900 mnt += count;
901 }
902
903 for (; j < g->nb_exponent + c->bw_code; j++) {
904 memset(mnt, 0, g->nb_mantissa[j] * sizeof(*mnt));
905 mnt += g->nb_mantissa[j];
906 }
907 }
908
909 return 0;
910}
911
912static int parse_channel(DBEDecodeContext *s1, int ch, int seg_id)
913{
914 DBEContext *s = &s1->dectx;
915 DBEChannel *c = &s1->channels[seg_id][ch];
916 int i, ret;
917
918 if (s->metadata.rev_id[ch] > 1) {
919 avpriv_report_missing_feature(s->avctx, "Encoder revision %d", s->metadata.rev_id[ch]);
921 }
922
923 if (ch == lfe_channel_tab[s->metadata.prog_conf]) {
924 c->gr_code = 3;
925 c->bw_code = 29;
926 } else {
927 c->gr_code = get_bits(&s->gb, 2);
928 c->bw_code = get_bits(&s->gb, 3);
929 if (c->gr_code == 3) {
930 av_log(s->avctx, AV_LOG_ERROR, "Invalid group type code\n");
931 return AVERROR_INVALIDDATA;
932 }
933 }
934
935 c->nb_groups = nb_groups_tab[c->gr_code];
936 c->nb_mstr_exp = nb_mstr_exp_tab[c->gr_code];
937
938 for (i = 0; i < c->nb_groups; i++) {
939 c->groups[i] = frm_ofs_tab[seg_id][c->gr_code][i];
940 if (c->nb_mstr_exp == 2) {
941 c->groups[i].nb_exponent -= c->bw_code;
942 c->groups[i].nb_bias_exp[1] -= c->bw_code;
943 }
944 }
945
946 if ((ret = parse_exponents(s, c)) < 0)
947 return ret;
948 if ((ret = parse_bit_alloc(s1, c)) < 0)
949 return ret;
950 if ((ret = parse_indices(s, c)) < 0)
951 return ret;
952 if ((ret = parse_mantissas(s, c)) < 0)
953 return ret;
954
955 if (get_bits_left(&s->gb) < 0) {
956 av_log(s->avctx, AV_LOG_ERROR, "Read past end of channel %d\n", ch);
957 return AVERROR_INVALIDDATA;
958 }
959
960 return 0;
961}
962
963static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id)
964{
965 DBEContext *s = &s1->dectx;
966 int ch, ret, key;
967
968 if ((key = parse_key(s)) < 0)
969 return key;
970
971 for (ch = start; ch < end; ch++) {
972 if (!s->metadata.ch_size[ch]) {
973 s1->channels[seg_id][ch].nb_groups = 0;
974 continue;
975 }
976 ret = ff_dolby_e_convert_input(s, s->metadata.ch_size[ch], key);
977 if (ret < 0)
978 return ret;
979 if ((ret = parse_channel(s1, ch, seg_id)) < 0) {
981 return ret;
982 s1->channels[seg_id][ch].nb_groups = 0;
983 }
984 if ((ret = skip_input(s, s->metadata.ch_size[ch])) < 0)
985 return ret;
986 }
987
988 return skip_input(s, 1);
989}
990
992{
993 DBEContext *s = &s1->dectx;
994 if (s->metadata.meter_size)
995 return skip_input(s, s->key_present + s->metadata.meter_size + 1);
996 return 0;
997}
998
999static void imdct_calc(DBEDecodeContext *s1, DBEGroup *g, float *result, float *values)
1000{
1001 AVTXContext *imdct = s1->imdct[g->imdct_phs == 1][g->imdct_idx];
1002 av_tx_fn imdct_fn = s1->imdct_fn[g->imdct_phs == 1][g->imdct_idx];
1003 int n = 1 << imdct_bits_tab[g->imdct_idx];
1004 int n2 = n >> 1;
1005
1006 switch (g->imdct_phs) {
1007 case 0:
1008 imdct_fn(imdct, result, values, sizeof(float));
1009 for (int i = 0; i < n2; i++)
1010 result[n2 + i] = result[n2 - i - 1];
1011 break;
1012 case 1:
1013 imdct_fn(imdct, result, values, sizeof(float));
1014 break;
1015 case 2:
1016 imdct_fn(imdct, result + n2, values, sizeof(float));
1017 for (int i = 0; i < n2; i++)
1018 result[i] = -result[n - i - 1];
1019 break;
1020 default:
1021 av_assert0(0);
1022 }
1023}
1024
1025static void transform(DBEDecodeContext *s1, DBEChannel *c, float *history, float *output)
1026{
1027 LOCAL_ALIGNED_32(float, buffer, [2048]);
1028 LOCAL_ALIGNED_32(float, result, [1152]);
1029 DBEGroup *g;
1030 int i;
1031
1032 memset(result, 0, 1152 * sizeof(float));
1033 for (i = 0, g = c->groups; i < c->nb_groups; i++, g++) {
1034 float *src = buffer + g->src_ofs;
1035 float *dst = result + g->dst_ofs;
1036 float *win = window + g->win_ofs;
1037
1038 imdct_calc(s1, g, buffer, c->mantissas + g->mnt_ofs);
1039 s1->fdsp->vector_fmul_add(dst, src, win, dst, g->win_len);
1040 }
1041
1042 for (i = 0; i < 256; i++)
1043 output[i] = history[i] + result[i];
1044 for (i = 256; i < 896; i++)
1045 output[i] = result[i];
1046 for (i = 0; i < 256; i++)
1047 history[i] = result[896 + i];
1048}
1049
1050static void apply_gain(DBEDecodeContext *s, int begin, int end, float *output)
1051{
1052 if (begin == 960 && end == 960)
1053 return;
1054
1055 if (begin == end) {
1056 s->fdsp->vector_fmul_scalar(output, output, gain_tab[end], FRAME_SAMPLES);
1057 } else {
1058 float a = gain_tab[begin] * (1.0f / (FRAME_SAMPLES - 1));
1059 float b = gain_tab[end ] * (1.0f / (FRAME_SAMPLES - 1));
1060 int i;
1061
1062 for (i = 0; i < FRAME_SAMPLES; i++)
1063 output[i] *= a * (FRAME_SAMPLES - i - 1) + b * i;
1064 }
1065}
1066
1068{
1069 const DolbyEHeaderInfo *const metadata = &s->dectx.metadata;
1070 const uint8_t *reorder;
1071 int ch, ret;
1072
1073 if (metadata->nb_channels == 4)
1074 reorder = ch_reorder_4;
1075 else if (metadata->nb_channels == 6)
1076 reorder = ch_reorder_6;
1077 else if (metadata->nb_programs == 1 && metadata->output_channel_order == CHANNEL_ORDER_DEFAULT)
1078 reorder = ch_reorder_8;
1079 else
1080 reorder = ch_reorder_n;
1081
1082 frame->nb_samples = FRAME_SAMPLES;
1083 if ((ret = ff_get_buffer(s->avctx, frame, 0)) < 0)
1084 return ret;
1085
1086 for (ch = 0; ch < metadata->nb_channels; ch++) {
1087 float *output = (float *)frame->extended_data[reorder[ch]];
1088 transform(s, &s->channels[0][ch], s->history[ch], output);
1089 transform(s, &s->channels[1][ch], s->history[ch], output + FRAME_SAMPLES / 2);
1090 apply_gain(s, metadata->begin_gain[ch], metadata->end_gain[ch], output);
1091 }
1092
1093 return 0;
1094}
1095
1097 int *got_frame_ptr, AVPacket *avpkt)
1098{
1099 DBEDecodeContext *s1 = avctx->priv_data;
1100 DBEContext *s = &s1->dectx;
1101 int i, j, ret;
1102
1103 if ((ret = ff_dolby_e_parse_header(s, avpkt->data, avpkt->size)) < 0)
1104 return ret;
1105
1106 if (s->metadata.nb_programs > 1 && !s->metadata.multi_prog_warned) {
1107 av_log(avctx, AV_LOG_WARNING, "Stream has %d programs (configuration %d), "
1108 "channels will be output in native order.\n",
1109 s->metadata.nb_programs, s->metadata.prog_conf);
1110 s->metadata.multi_prog_warned = 1;
1111 }
1112
1114 switch (s->metadata.nb_channels) {
1115 case 4:
1117 break;
1118 case 6:
1120 break;
1121 case 8:
1123 break;
1124 default:
1126 avctx->ch_layout.nb_channels = s->metadata.nb_channels;
1127 break;
1128 }
1129
1130 avctx->sample_rate = s->metadata.sample_rate;
1132
1133 i = s->metadata.nb_channels / 2;
1134 j = s->metadata.nb_channels;
1135 if ((ret = parse_audio(s1, 0, i, 0)) < 0)
1136 return ret;
1137 if ((ret = parse_audio(s1, i, j, 0)) < 0)
1138 return ret;
1139 if ((ret = parse_metadata_ext(s1)) < 0)
1140 return ret;
1141 if ((ret = parse_audio(s1, 0, i, 1)) < 0)
1142 return ret;
1143 if ((ret = parse_audio(s1, i, j, 1)) < 0)
1144 return ret;
1145 if ((ret = parse_meter(s1)) < 0)
1146 return ret;
1147 if ((ret = filter_frame(s1, frame)) < 0)
1148 return ret;
1149
1150 *got_frame_ptr = 1;
1151 return avpkt->size;
1152}
1153
1155{
1156 DBEDecodeContext *s = avctx->priv_data;
1157
1158 memset(s->history, 0, sizeof(s->history));
1159}
1160
1162{
1163 DBEDecodeContext *s = avctx->priv_data;
1164
1165 for (int i = 0; i < 3; i++) {
1166 av_tx_uninit(&s->imdct[0][i]);
1167 av_tx_uninit(&s->imdct[1][i]);
1168 }
1169
1170 av_freep(&s->fdsp);
1171 return 0;
1172}
1173
1174
1175static av_cold void init_tables(void)
1176{
1177 int i, j;
1178
1179 for (i = 1; i < 17; i++)
1180 mantissa_tab1[i][0] = 1.0f / (1 << i - 1);
1181
1182 for (i = 2; i < 16; i++) {
1183 mantissa_tab1[i][1] = 1.0f / ((1 << i) - 1);
1184 mantissa_tab1[i][2] = 0.5f / ((1 << i) - 1);
1185 mantissa_tab1[i][3] = 0.25f / ((1 << i) - 1);
1186 }
1187
1188 mantissa_tab1[i][1] = 0.5f / (1 << 15);
1189 mantissa_tab1[i][2] = 0.75f / (1 << 15);
1190 mantissa_tab1[i][3] = 0.875f / (1 << 15);
1191
1192 for (i = 1; i < 17; i++) {
1193 mantissa_tab2[i][1] = mantissa_tab1[i][0] * 0.5f;
1194 mantissa_tab2[i][2] = mantissa_tab1[i][0] * 0.75f;
1195 mantissa_tab2[i][3] = mantissa_tab1[i][0] * 0.875f;
1196 for (j = 1; j < 4; j++)
1197 mantissa_tab3[i][j] = 1.0f / (1 << i) + 1.0f / (1 << j) - 1.0f / (1 << i + j);
1198 }
1199
1200 mantissa_tab3[1][3] = 0.6875f;
1201
1202 for (i = 0; i < 25; i++) {
1203 exponent_tab[i * 2 ] = 1.0f / (1 << i);
1204 exponent_tab[i * 2 + 1] = M_SQRT1_2 / (1 << i);
1205 }
1206
1207 for (i = 1; i < 1024; i++)
1208 gain_tab[i] = exp2f((i - 960) / 64.0f);
1209
1210 // short 1
1211 ff_kbd_window_init(window, 3.0f, 128);
1212 for (i = 0; i < 128; i++)
1213 window[128 + i] = window[127 - i];
1214
1215 // start
1216 for (i = 0; i < 192; i++)
1217 window[256 + i] = start_window[i];
1218
1219 // short 2
1220 for (i = 0; i < 192; i++)
1221 window[448 + i] = short_window2[i];
1222 for (i = 0; i < 64; i++)
1223 window[640 + i] = window[63 - i];
1224
1225 // short 3
1226 for (i = 0; i < 64; i++)
1227 window[704 + i] = short_window3[i];
1228 for (i = 0; i < 192; i++)
1229 window[768 + i] = window[64 + i];
1230
1231 // bridge
1232 for (i = 0; i < 128; i++)
1233 window[960 + i] = window[i];
1234 for (i = 0; i < 64; i++)
1235 window[1088 + i] = 1.0f;
1236
1237 // long
1238 ff_kbd_window_init(window + 1408, 3.0f, 256);
1239 for (i = 0; i < 640; i++)
1240 window[1664 + i] = 1.0f;
1241 for (i = 0; i < 256; i++)
1242 window[2304 + i] = window[1152 + i] = window[1663 - i];
1243
1244 // reverse start
1245 for (i = 0; i < 192; i++)
1246 window[2560 + i] = window[447 - i];
1247
1248 // reverse short 2
1249 for (i = 0; i < 256; i++)
1250 window[2752 + i] = window[703 - i];
1251
1252 // reverse short 3
1253 for (i = 0; i < 256; i++)
1254 window[3008 + i] = window[959 - i];
1255
1256 // reverse bridge
1257 for (i = 0; i < 448; i++)
1258 window[3264 + i] = window[1407 - i];
1259}
1260
1262{
1263 static AVOnce init_once = AV_ONCE_INIT;
1264 DBEDecodeContext *s = avctx->priv_data;
1265 float scale = 2.0f;
1266 int ret;
1267
1268 if (ff_thread_once(&init_once, init_tables))
1269 return AVERROR_UNKNOWN;
1270
1271 for (int i = 0; i < 3; i++) {
1272 if ((ret = av_tx_init(&s->imdct[0][i], &s->imdct_fn[0][i], AV_TX_FLOAT_MDCT,
1273 1, 1 << imdct_bits_tab[i] - 1, &scale, 0)) < 0)
1274 return ret;
1275 if ((ret = av_tx_init(&s->imdct[1][i], &s->imdct_fn[1][i], AV_TX_FLOAT_MDCT,
1276 1, 1 << imdct_bits_tab[i] - 1, &scale, AV_TX_FULL_IMDCT)) < 0)
1277 return ret;
1278 }
1279
1280 if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
1281 return AVERROR(ENOMEM);
1282
1283 s->dectx.metadata.multi_prog_warned = s->dectx.metadata.output_channel_order == CHANNEL_ORDER_CODED;
1284 s->dectx.avctx = s->avctx = avctx;
1285 return 0;
1286}
1287
1288#define OFFSET(x) offsetof(DBEDecodeContext, x)
1289#define FLAGS (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM)
1290static const AVOption options[] = {
1291 { "channel_order", "Order in which the channels are to be exported",
1292 OFFSET(dectx.metadata.output_channel_order), AV_OPT_TYPE_INT,
1293 { .i64 = CHANNEL_ORDER_DEFAULT }, 0, 1, FLAGS, .unit = "channel_order" },
1294 { "default", "normal libavcodec channel order", 0, AV_OPT_TYPE_CONST,
1295 { .i64 = CHANNEL_ORDER_DEFAULT }, .flags = FLAGS, .unit = "channel_order" },
1296 { "coded", "order in which the channels are coded in the bitstream",
1297 0, AV_OPT_TYPE_CONST, { .i64 = CHANNEL_ORDER_CODED }, .flags = FLAGS, .unit = "channel_order" },
1298
1299 { NULL },
1300};
1301
1303 .class_name = "Dolby E decoder",
1304 .item_name = av_default_item_name,
1305 .option = options,
1306 .version = LIBAVUTIL_VERSION_INT,
1307};
1308
1310 .p.name = "dolby_e",
1311 CODEC_LONG_NAME("Dolby E"),
1312 .p.type = AVMEDIA_TYPE_AUDIO,
1313 .p.id = AV_CODEC_ID_DOLBY_E,
1314 .priv_data_size = sizeof(DBEDecodeContext),
1315 .p.priv_class = &dolby_e_decoder_class,
1316 .init = dolby_e_init,
1318 .close = dolby_e_close,
1319 .flush = dolby_e_flush,
1320 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1321 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1322};
#define MAX_CHANNELS
Definition aac.h:33
@ CHANNEL_ORDER_DEFAULT
Definition aacdec.h:62
@ CHANNEL_ORDER_CODED
Definition aacdec.h:63
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static float win(SuperEqualizerContext *s, float n, int N)
const FFCodec ff_dolby_e_decoder
Definition dolby_e.c:1309
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
static int FUNC metadata(CodedBitstreamContext *ctx, RWContext *rw, APVRawMetadata *current)
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
Public libavutil channel layout APIs header.
#define FLAGS
Definition cmdutils.c:598
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define av_clip_uintp2
Definition common.h:124
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition common.h:74
#define NULL
Definition coverity.c:32
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition decode.c:1777
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition defs.h:51
static AVFrame * frame
static void unbias_exponents(DBEContext *s, DBEChannel *c, DBEGroup *g)
Definition dolby_e.c:646
static const uint8_t mantissa_size2[16][4]
Definition dolby_e.c:199
static const uint8_t dc_code_tab[5]
Definition dolby_e.c:331
static const uint8_t ch_reorder_4[4]
Definition dolby_e.c:98
static const float start_window[192]
Definition dolby_e.c:206
static const DBEGroup grp_tab_5[8]
Definition dolby_e.c:162
static int parse_indices(DBEContext *s, DBEChannel *c)
Definition dolby_e.c:817
static const uint8_t ht_code_tab[5]
Definition dolby_e.c:333
static const uint16_t misc_decay_tab[3][2][2]
Definition dolby_e.c:347
static const uint16_t fast_decay_tab[3][2][2][50]
Definition dolby_e.c:353
static const uint8_t band_low_tab[3]
Definition dolby_e.c:339
static const uint8_t nb_mantissa_44[44]
Definition dolby_e.c:114
static void calc_lowcomp(int *msk_val)
Definition dolby_e.c:688
#define MAX_GROUPS
Definition dolby_e.c:37
#define MAX_EXPONENTS
Definition dolby_e.c:38
static av_cold int dolby_e_init(AVCodecContext *avctx)
Definition dolby_e.c:1261
static const DBEGroup grp_tab_4[1]
Definition dolby_e.c:158
static int parse_key(DBEContext *s)
Definition dolby_e.c:626
static const uint8_t band_ofs_tab[3][4]
Definition dolby_e.c:335
static const uint8_t ch_reorder_8[8]
Definition dolby_e.c:100
static const uint8_t nb_mstr_exp_tab[4]
Definition dolby_e.c:106
static const uint8_t imdct_bits_tab[3]
Definition dolby_e.c:127
#define MAX_MANTISSAS
Definition dolby_e.c:39
static const int8_t lfe_channel_tab[MAX_PROG_CONF+1]
Definition dolby_e.c:93
#define MAX_SEGMENTS
Definition dolby_e.c:35
static int parse_metadata_ext(DBEDecodeContext *s1)
Definition dolby_e.c:638
static const int16_t lwc_gain_tab[11][7]
Definition dolby_e.c:564
static const uint16_t slow_decay_tab[2][2]
Definition dolby_e.c:345
static const float short_window2[192]
Definition dolby_e.c:259
static int parse_mantissas(DBEContext *s, DBEChannel *c)
Definition dolby_e.c:849
static const DBEGroup grp_tab_3[1]
Definition dolby_e.c:154
static av_cold void init_tables(void)
Definition dolby_e.c:1175
static av_cold void dolby_e_flush(AVCodecContext *avctx)
Definition dolby_e.c:1154
static const AVClass dolby_e_decoder_class
Definition dolby_e.c:1302
static const uint8_t nb_groups_tab[4]
Definition dolby_e.c:104
static float exponent_tab[50]
Definition dolby_e.c:609
static void bit_allocate(int nb_exponent, int nb_code, int fr_code, int *exp, int *bap, int fg_spc, int fg_ofs, int msk_mod, int snr_ofs)
Definition dolby_e.c:721
static const int16_t lwc_adj_tab[7]
Definition dolby_e.c:578
static const uint16_t fast_gain_adj_tab[3][2][62]
Definition dolby_e.c:425
static const DBEGroup *const frm_ofs_tab[2][4]
Definition dolby_e.c:187
static const uint16_t fast_gain_tab[8]
Definition dolby_e.c:341
static int log_add(int a, int b)
Definition dolby_e.c:682
static const uint8_t nb_mantissa_38[38]
Definition dolby_e.c:108
static int parse_exponents(DBEContext *s, DBEChannel *c)
Definition dolby_e.c:663
static float mantissa_tab3[17][4]
Definition dolby_e.c:608
static void apply_gain(DBEDecodeContext *s, int begin, int end, float *output)
Definition dolby_e.c:1050
static int skip_input(DBEContext *s, int nb_words)
Definition dolby_e.c:614
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
static void imdct_calc(DBEDecodeContext *s1, DBEGroup *g, float *result, float *values)
Definition dolby_e.c:999
static const DBEGroup grp_tab_2[7]
Definition dolby_e.c:144
static const uint8_t bap_tab[64]
Definition dolby_e.c:599
static const uint8_t log_add_tab[212]
Definition dolby_e.c:582
static const DBEGroup grp_tab_0[1]
Definition dolby_e.c:129
static const DBEGroup grp_tab_1[8]
Definition dolby_e.c:133
static const uint8_t nb_mantissa_50[50]
Definition dolby_e.c:120
static av_cold int dolby_e_close(AVCodecContext *avctx)
Definition dolby_e.c:1161
static const DBEGroup grp_tab_6[7]
Definition dolby_e.c:173
static int parse_bit_alloc(DBEDecodeContext *s1, DBEChannel *c)
Definition dolby_e.c:770
static const uint8_t ch_reorder_n[8]
Definition dolby_e.c:101
static float gain_tab[1024]
Definition dolby_e.c:610
#define MAX_BIAS_EXP
Definition dolby_e.c:42
static const uint8_t mantissa_size1[16][4]
Definition dolby_e.c:192
static const uint8_t ch_reorder_6[6]
Definition dolby_e.c:99
#define OFFSET(x)
Definition dolby_e.c:1288
static float mantissa_tab1[17][4]
Definition dolby_e.c:606
static int dolby_e_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition dolby_e.c:1096
static int parse_channel(DBEDecodeContext *s1, int ch, int seg_id)
Definition dolby_e.c:912
static const float short_window3[64]
Definition dolby_e.c:312
#define MIN_MANTISSAS
Definition dolby_e.c:848
static float mantissa_tab2[17][4]
Definition dolby_e.c:607
static int parse_meter(DBEDecodeContext *s1)
Definition dolby_e.c:991
static const uint16_t hearing_thresh_tab[3][3][50]
Definition dolby_e.c:509
static const uint16_t slow_gain_tab[3][2][50]
Definition dolby_e.c:471
static int parse_audio(DBEDecodeContext *s1, int start, int end, int seg_id)
Definition dolby_e.c:963
static const DBEGroup grp_tab_7[1]
Definition dolby_e.c:183
#define MAX_MSTR_EXP
Definition dolby_e.c:41
DBEOutputChannelOrder
Definition dolby_e.c:44
#define MAX_PROG_CONF
Definition dolby_e.h:29
#define FRAME_SAMPLES
Definition dolby_e.h:27
int ff_dolby_e_parse_header(DBEContext *s, const uint8_t *buf, int buf_size)
Initialize DBEContext and parse Dolby E metadata.
int ff_dolby_e_convert_input(DBEContext *s, int nb_words, int key)
Use the provided key to transform the input into data (put into s->buffer) suitable for further proce...
double value
Definition eval.c:102
int8_t exp
Definition eval.c:76
const char * key
static SDL_Window * window
Definition ffplay.c:365
bitstream reader API header.
static int get_sbits(GetBitContext *s, int n)
Definition get_bits.h:322
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
Definition codec.h:94
@ AV_CODEC_ID_DOLBY_E
Definition codec_id.h:537
#define AV_CHANNEL_LAYOUT_4POINT0
#define AV_CHANNEL_LAYOUT_5POINT1
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
#define AV_CHANNEL_LAYOUT_7POINT1
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition error.h:73
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition samplefmt.h:66
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
int a
static const int8_t transform[32][32]
Definition dsp.c:27
#define b
Definition input.c:43
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
#define AV_RB24(x)
av_cold void ff_kbd_window_init(float *window, float alpha, int n)
Generate a Kaiser-Bessel Derived Window.
Definition kbdwin.c:54
#define av_cold
Definition attributes.h:117
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Definition float_dsp.c:135
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
#define exp2f(x)
Definition libm.h:295
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define M_SQRT1_2
Memory handling functions.
#define LOCAL_ALIGNED_32(t, v,...)
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
AVOptions.
An AVChannelLayout holds information about the channel layout of audio data.
enum AVChannelOrder order
Channel order used in this layout.
int nb_channels
Number of channels in this layout.
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
enum AVSampleFormat sample_fmt
audio sample format
Definition avcodec.h:1047
int sample_rate
samples per second
Definition avcodec.h:1040
void * priv_data
Definition avcodec.h:470
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition avcodec.h:1416
void(* vector_fmul_add)(float *dst, const float *src0, const float *src1, const float *src2, int len)
Calculate the entry wise product of two vectors of floats, add a third vector of floats and store the...
Definition float_dsp.h:137
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
int bw_code
Definition dolby_e.c:65
int exponents[MAX_EXPONENTS]
Definition dolby_e.c:72
float mantissas[MAX_MANTISSAS]
Definition dolby_e.c:76
int exp_strategy[MAX_GROUPS]
Definition dolby_e.c:71
int idx[MAX_EXPONENTS]
Definition dolby_e.c:74
DBEGroup groups[MAX_GROUPS]
Definition dolby_e.c:69
int bap[MAX_EXPONENTS]
Definition dolby_e.c:73
int gr_code
Definition dolby_e.c:64
int nb_mstr_exp
Definition dolby_e.c:68
int nb_groups
Definition dolby_e.c:67
Dolby E reading context used by decoder and parser.
Definition dolby_e.h:72
av_tx_fn imdct_fn[2][3]
Definition dolby_e.c:89
float history[MAX_CHANNELS][256]
Definition dolby_e.c:86
DBEChannel channels[MAX_SEGMENTS][MAX_CHANNELS]
Definition dolby_e.c:84
AVCodecContext * avctx
Definition dolby_e.c:81
DBEContext dectx
Definition dolby_e.c:82
AVFloatDSPContext * fdsp
Definition dolby_e.c:90
AVTXContext * imdct[2][3]
Definition dolby_e.c:88
uint8_t nb_exponent
Definition dolby_e.c:50
uint8_t imdct_idx
Definition dolby_e.c:55
uint16_t dst_ofs
Definition dolby_e.c:58
uint16_t win_ofs
Definition dolby_e.c:59
const uint8_t * nb_mantissa
Definition dolby_e.c:54
uint16_t src_ofs
Definition dolby_e.c:60
uint8_t nb_bias_exp[MAX_MSTR_EXP]
Definition dolby_e.c:51
uint8_t imdct_phs
Definition dolby_e.c:56
uint16_t mnt_ofs
Definition dolby_e.c:53
uint16_t win_len
Definition dolby_e.c:57
uint16_t exp_ofs
Definition dolby_e.c:52
Coded Dolby E header values up to end_gain element, plus derived values.
Definition dolby_e.h:37
#define av_freep(p)
#define av_log(a,...)
#define src
Definition vp8dsp.c:248
static char buffer[20]
Definition seek.c:32
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
Definition tx.c:295
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition tx.c:903
@ AV_TX_FULL_IMDCT
Performs a full inverse MDCT rather than leaving out samples that can be derived through symmetry.
Definition tx.h:175
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respectively.
Definition tx.h:68
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition tx.h:151
const char * g
Definition vf_curves.c:128
static double c[64]