2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
25 ** Commercial non-GPL licensing of this software is possible.
26 ** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
28 ** $Id: drm_dec.c,v 1.9 2007/11/01 12:33:30 menno Exp $
44 #define DECAY_CUTOFF 3
45 #define DECAY_SLOPE 0.05f
47 /* type definitaions */
48 typedef const int8_t (*drm_ps_huff_tab)[2];
51 /* binary search huffman tables */
52 static const int8_t f_huffman_sa[][2] =
54 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
55 { 2, 3 }, /* index 1: 2 bits: 1x */
56 { /*7*/ -8, 4 }, /* index 2: 3 bits: 10x */
57 { 5, 6 }, /* index 3: 3 bits: 11x */
58 { /*1*/ -14, /*-1*/ -16 }, /* index 4: 4 bits: 101x */
59 { /*-2*/ -17, 7 }, /* index 5: 4 bits: 110x */
60 { 8, 9 }, /* index 6: 4 bits: 111x */
61 { /*2*/ -13, /*-3*/ -18 }, /* index 7: 5 bits: 1101x */
62 { /*3*/ -12, 10 }, /* index 8: 5 bits: 1110x */
63 { 11, 12 }, /* index 9: 5 bits: 1111x */
64 { /*4*/ -11, /*5*/ -10 }, /* index 10: 6 bits: 11101x */
65 { /*-4*/ -19, /*-5*/ -20 }, /* index 11: 6 bits: 11110x */
66 { /*6*/ -9, 13 }, /* index 12: 6 bits: 11111x */
67 { /*-7*/ -22, /*-6*/ -21 } /* index 13: 7 bits: 111111x */
70 static const int8_t t_huffman_sa[][2] =
72 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
73 { 2, 3 }, /* index 1: 2 bits: 1x */
74 { /*-1*/ -16, /*1*/ -14 }, /* index 2: 3 bits: 10x */
75 { 4, 5 }, /* index 3: 3 bits: 11x */
76 { /*-2*/ -17, /*2*/ -13 }, /* index 4: 4 bits: 110x */
77 { 6, 7 }, /* index 5: 4 bits: 111x */
78 { /*-3*/ -18, /*3*/ -12 }, /* index 6: 5 bits: 1110x */
79 { 8, 9 }, /* index 7: 5 bits: 1111x */
80 { /*-4*/ -19, /*4*/ -11 }, /* index 8: 6 bits: 11110x */
81 { 10, 11 }, /* index 9: 6 bits: 11111x */
82 { /*-5*/ -20, /*5*/ -10 }, /* index 10: 7 bits: 111110x */
83 { /*-6*/ -21, 12 }, /* index 11: 7 bits: 111111x */
84 { /*-7*/ -22, 13 }, /* index 12: 8 bits: 1111111x */
85 { /*6*/ -9, /*7*/ -8 } /* index 13: 9 bits: 11111111x */
88 static const int8_t f_huffman_pan[][2] =
90 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
91 { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */
92 { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */
93 { 4, 5 }, /* index 3: 4 bits: 111x */
94 { /*-2*/ -17, /*2*/ -13 }, /* index 4: 5 bits: 1110x */
95 { 6, 7 }, /* index 5: 5 bits: 1111x */
96 { /*-3*/ -18, /*3*/ -12 }, /* index 6: 6 bits: 11110x */
97 { 8, 9 }, /* index 7: 6 bits: 11111x */
98 { /*-4*/ -19, /*4*/ -11 }, /* index 8: 7 bits: 111110x */
99 { 10, 11 }, /* index 9: 7 bits: 111111x */
100 { /*-5*/ -20, /*5*/ -10 }, /* index 10: 8 bits: 1111110x */
101 { 12, 13 }, /* index 11: 8 bits: 1111111x */
102 { /*-6*/ -21, /*6*/ -9 }, /* index 12: 9 bits: 11111110x */
103 { /*-7*/ -22, 14 }, /* index 13: 9 bits: 11111111x */
104 { /*7*/ -8, 15 }, /* index 14: 10 bits: 111111111x */
105 { 16, 17 }, /* index 15: 11 bits: 1111111111x */
106 { /*-8*/ -23, /*8*/ -7 }, /* index 16: 12 bits: 11111111110x */
107 { 18, 19 }, /* index 17: 12 bits: 11111111111x */
108 { /*-10*/ -25, 20 }, /* index 18: 13 bits: 111111111110x */
109 { 21, 22 }, /* index 19: 13 bits: 111111111111x */
110 { /*-9*/ -24, /*9*/ -6 }, /* index 20: 14 bits: 1111111111101x */
111 { /*10*/ -5, 23 }, /* index 21: 14 bits: 1111111111110x */
112 { 24, 25 }, /* index 22: 14 bits: 1111111111111x */
113 { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */
114 { /*11*/ -4, /*13*/ -2 }, /* index 24: 15 bits: 11111111111110x */
115 { 26, 27 }, /* index 25: 15 bits: 11111111111111x */
116 { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */
117 { /*12*/ -3, /*14*/ -1 } /* index 27: 16 bits: 111111111111111x */
120 static const int8_t t_huffman_pan[][2] =
122 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
123 { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */
124 { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */
125 { /*-2*/ -17, 4 }, /* index 3: 4 bits: 111x */
126 { /*2*/ -13, 5 }, /* index 4: 5 bits: 1111x */
127 { /*-3*/ -18, 6 }, /* index 5: 6 bits: 11111x */
128 { /*3*/ -12, 7 }, /* index 6: 7 bits: 111111x */
129 { /*-4*/ -19, 8 }, /* index 7: 8 bits: 1111111x */
130 { /*4*/ -11, 9 }, /* index 8: 9 bits: 11111111x */
131 { 10, 11 }, /* index 9: 10 bits: 111111111x */
132 { /*-5*/ -20, /*5*/ -10 }, /* index 10: 11 bits: 1111111110x */
133 { 12, 13 }, /* index 11: 11 bits: 1111111111x */
134 { /*-6*/ -21, /*6*/ -9 }, /* index 12: 12 bits: 11111111110x */
135 { 14, 15 }, /* index 13: 12 bits: 11111111111x */
136 { /*-7*/ -22, /*7*/ -8 }, /* index 14: 13 bits: 111111111110x */
137 { 16, 17 }, /* index 15: 13 bits: 111111111111x */
138 { /*-8*/ -23, /*8*/ -7 }, /* index 16: 14 bits: 1111111111110x */
139 { 18, 19 }, /* index 17: 14 bits: 1111111111111x */
140 { /*-10*/ -25, /*10*/ -5 }, /* index 18: 15 bits: 11111111111110x */
141 { 20, 21 }, /* index 19: 15 bits: 11111111111111x */
142 { /*-9*/ -24, /*9*/ -6 }, /* index 20: 16 bits: 111111111111110x */
143 { 22, 23 }, /* index 21: 16 bits: 111111111111111x */
144 { 24, 25 }, /* index 22: 17 bits: 1111111111111110x */
145 { 26, 27 }, /* index 23: 17 bits: 1111111111111111x */
146 { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */
147 { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */
148 { /*11*/ -4, /*12*/ -3 }, /* index 26: 18 bits: 11111111111111110x */
149 { /*13*/ -2, /*14*/ -1 } /* index 27: 18 bits: 11111111111111111x */
152 /* There are 3 classes in the standard but the last 2 are identical */
153 static const real_t sa_quant[8][2] =
155 { FRAC_CONST(0.0000), FRAC_CONST(0.0000) },
156 { FRAC_CONST(0.0501), FRAC_CONST(0.1778) },
157 { FRAC_CONST(0.0706), FRAC_CONST(0.2818) },
158 { FRAC_CONST(0.0995), FRAC_CONST(0.4467) },
159 { FRAC_CONST(0.1399), FRAC_CONST(0.5623) },
160 { FRAC_CONST(0.1957), FRAC_CONST(0.7079) },
161 { FRAC_CONST(0.2713), FRAC_CONST(0.8913) },
162 { FRAC_CONST(0.3699), FRAC_CONST(1.0000) },
165 /* We don't need the actual quantizer values */
167 static const real_t pan_quant[8][5] =
169 { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) },
170 { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) },
171 { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) },
172 { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) },
173 { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) },
174 { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) },
175 { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) },
176 { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) },
180 /* 2^(pan_quant[x][y] */
181 static const real_t pan_pow_2_pos[8][5] = {
182 { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000) },
183 { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312) },
184 { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016) },
185 { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565) },
186 { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337) },
187 { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994) },
188 { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876) },
189 { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140) }
192 /* 2^(-pan_quant[x][y] */
193 static const real_t pan_pow_2_neg[8][5] = {
194 { REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1) },
195 { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242) },
196 { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344) },
197 { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199) },
198 { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336) },
199 { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266) },
200 { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107) },
201 { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825) }
204 /* 2^(pan_quant[x][y]/30) */
205 static const real_t pan_pow_2_30_pos[8][5] = {
206 { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) },
207 { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) },
208 { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933), COEF_CONST(1.019373909), COEF_CONST(1.019373909) },
209 { COEF_CONST(1.011579706), COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) },
210 { COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) },
211 { COEF_CONST(1.019373909), COEF_CONST(1.03117796), COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263) },
212 { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) },
213 { COEF_CONST(1.03117796), COEF_CONST(1.055195268), COEF_CONST(1.0839263), COEF_CONST(1.113439626), COEF_CONST(1.143756546) }
216 /* 2^(-pan_quant[x][y]/30) */
217 static const real_t pan_pow_2_30_neg[8][5] = {
218 { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) },
219 { COEF_CONST(0.99616963), COEF_CONST(0.99616963), COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393) },
220 { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) },
221 { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) },
222 { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) },
223 { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) },
224 { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) },
225 { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) }
228 static const real_t g_decayslope[MAX_SA_BAND] = {
229 FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8),
230 FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5), FRAC_CONST(0.45),
231 FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1),
232 FRAC_CONST(0.05),FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0),
233 FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0),
234 FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0),
235 FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0)
238 static const real_t sa_sqrt_1_minus[8][2] = {
239 { FRAC_CONST(1), FRAC_CONST(1) },
240 { FRAC_CONST(0.998744206), FRAC_CONST(0.984066644) },
241 { FRAC_CONST(0.997504707), FRAC_CONST(0.959473168) },
242 { FRAC_CONST(0.995037562), FRAC_CONST(0.894683804) },
243 { FRAC_CONST(0.990165638), FRAC_CONST(0.826933317) },
244 { FRAC_CONST(0.980663811), FRAC_CONST(0.706312672) },
245 { FRAC_CONST(0.962494836), FRAC_CONST(0.45341406) },
246 { FRAC_CONST(0.929071574), FRAC_CONST(0) }
249 static const uint8_t sa_freq_scale[9] =
251 0, 1, 2, 3, 5, 7, 10, 13, 23
254 static const uint8_t pan_freq_scale[21] =
256 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
257 11, 12, 13, 14, 15, 18, 22, 26, 32, 64
260 static const uint8_t pan_quant_class[20] =
262 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
263 2, 2, 2, 2, 3, 3, 3, 4, 4, 4
266 /* Inverse mapping lookup */
267 static const uint8_t pan_inv_freq[64] = {
268 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
269 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
270 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
271 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
274 static const uint8_t sa_inv_freq[MAX_SA_BAND] = {
275 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6,
276 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
277 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
281 static const real_t filter_coeff[] =
283 FRAC_CONST(0.65143905754106),
284 FRAC_CONST(0.56471812200776),
285 FRAC_CONST(0.48954165955695)
288 static const uint8_t delay_length[3] =
293 static const real_t delay_fraction[] =
295 FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347)
298 static const real_t peak_decay = FRAC_CONST(0.76592833836465);
300 static const real_t smooth_coeff = FRAC_CONST(0.25);
302 /* Please note that these are the same tables as in plain PS */
303 static const complex_t Q_Fract_allpass_Qmf[][3] = {
304 { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } },
305 { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } },
306 { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } },
307 { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } },
308 { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } },
309 { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } },
310 { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } },
311 { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } },
312 { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } },
313 { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } },
314 { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } },
315 { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } },
316 { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } },
317 { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } },
318 { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } },
319 { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } },
320 { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } },
321 { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } },
322 { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } },
323 { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } },
324 { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } },
325 { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } },
326 { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } },
327 { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } },
328 { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } },
329 { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } },
330 { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } },
331 { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } },
332 { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } },
333 { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } },
334 { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } },
335 { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } },
336 { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } },
337 { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } },
338 { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } },
339 { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } },
340 { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } },
341 { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } },
342 { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } },
343 { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } },
344 { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } },
345 { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } },
346 { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } },
347 { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } },
348 { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } },
349 { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } },
350 { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } },
351 { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } },
352 { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } },
353 { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } },
354 { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } },
355 { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } },
356 { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } },
357 { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } },
358 { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } },
359 { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } },
360 { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } },
361 { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } },
362 { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } },
363 { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } },
364 { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } },
365 { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } },
366 { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } },
367 { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } }
370 static const complex_t Phi_Fract_Qmf[] = {
371 { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) },
372 { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) },
373 { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) },
374 { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) },
375 { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) },
376 { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) },
377 { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) },
378 { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) },
379 { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) },
380 { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) },
381 { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) },
382 { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) },
383 { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) },
384 { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) },
385 { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) },
386 { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) },
387 { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) },
388 { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) },
389 { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) },
390 { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) },
391 { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) },
392 { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) },
393 { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) },
394 { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) },
395 { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) },
396 { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) },
397 { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) },
398 { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) },
399 { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) },
400 { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) },
401 { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) },
402 { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) },
403 { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) },
404 { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) },
405 { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) },
406 { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) },
407 { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) },
408 { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) },
409 { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) },
410 { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) },
411 { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) },
412 { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) },
413 { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) },
414 { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) },
415 { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) },
416 { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) },
417 { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) },
418 { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) },
419 { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) },
420 { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) },
421 { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) },
422 { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) },
423 { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) },
424 { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) },
425 { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) },
426 { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) },
427 { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) },
428 { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) },
429 { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) },
430 { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) },
431 { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) },
432 { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) },
433 { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) },
434 { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) }
438 /* static function declarations */
439 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld);
440 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld);
441 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff);
444 uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
446 uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
448 ps->drm_ps_data_available = 1;
450 ps->bs_enable_sa = faad_get1bit(ld);
451 ps->bs_enable_pan = faad_get1bit(ld);
453 if (ps->bs_enable_sa)
455 drm_ps_sa_element(ps, ld);
458 if (ps->bs_enable_pan)
460 drm_ps_pan_element(ps, ld);
463 bits = (uint16_t)faad_get_processed_bits(ld) - bits;
468 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
470 drm_ps_huff_tab huff;
473 ps->bs_sa_dt_flag = faad_get1bit(ld);
474 if (ps->bs_sa_dt_flag)
481 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
483 ps->bs_sa_data[band] = huff_dec(ld, huff);
487 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
489 drm_ps_huff_tab huff;
492 ps->bs_pan_dt_flag = faad_get1bit(ld);
493 if (ps->bs_pan_dt_flag)
495 huff = t_huffman_pan;
497 huff = f_huffman_pan;
500 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
502 ps->bs_pan_data[band] = huff_dec(ld, huff);
506 /* binary search huffman decoding */
507 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
514 bit = (uint8_t)faad_get1bit(ld);
515 index = huff[index][bit];
522 static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
525 /* printf(" SAminclip %d", i); */
526 ps->sa_decode_error = 1;
529 /* printf(" SAmaxclip %d", i); */
530 ps->sa_decode_error = 1;
536 static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
539 /* printf(" PANminclip %d", i); */
540 ps->pan_decode_error = 1;
543 /* printf(" PANmaxclip %d", i); */
544 ps->pan_decode_error = 1;
550 static void drm_ps_delta_decode(drm_ps_info *ps)
554 if (ps->bs_enable_sa)
556 if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
558 /* wait until we get a DT frame */
559 ps->bs_enable_sa = 0;
560 } else if (ps->bs_sa_dt_flag) {
561 /* DT frame, we have a last frame, so we can decode */
562 ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
564 /* DF always decodable */
565 ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
568 for (band = 1; band < DRM_NUM_SA_BANDS; band++)
570 if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
572 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
573 } else if (!ps->bs_sa_dt_flag) {
574 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
579 /* An error during SA decoding implies PAN data will be undecodable, too */
580 /* Also, we don't like on/off switching in PS, so we force to last settings */
581 if (ps->sa_decode_error) {
582 ps->pan_decode_error = 1;
583 ps->bs_enable_pan = ps->g_last_had_pan;
584 ps->bs_enable_sa = ps->g_last_had_sa;
588 if (ps->bs_enable_sa)
590 if (ps->sa_decode_error) {
591 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
593 ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
596 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
598 ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
603 if (ps->bs_enable_pan)
605 if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
607 ps->bs_enable_pan = 0;
608 } else if (ps->bs_pan_dt_flag) {
609 ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
611 ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
614 for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
616 if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
618 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
619 } else if (!ps->bs_pan_dt_flag) {
620 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
624 if (ps->pan_decode_error) {
625 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
627 ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
630 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
632 ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
638 static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
641 complex_t qfrac, tmp0, tmp, in, R0;
646 real_t new_delay_slopes[NUM_OF_LINKS];
647 uint8_t temp_delay_ser[NUM_OF_LINKS];
650 uint32_t in_re, in_im;
653 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
655 /* set delay indices */
656 for (k = 0; k < NUM_OF_LINKS; k++)
657 temp_delay_ser[k] = ps->delay_buf_index_ser[k];
659 RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660 IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
662 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
664 const real_t gamma = REAL_CONST(1.5);
665 const real_t sigma = REAL_CONST(1.5625);
667 RE(in) = QMF_RE(X[s][b]);
668 IM(in) = QMF_IM(X[s][b]);
671 /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
672 * meaning that P will be scaled by 2^(-10) compared to floating point version
674 in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
675 in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
676 power = in_re*in_re + in_im*in_im;
678 power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
681 ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay);
682 if (ps->peakdecay_fast[b] < power)
683 ps->peakdecay_fast[b] = power;
685 peakdiff = ps->prev_peakdiff[b];
686 peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff);
687 ps->prev_peakdiff[b] = peakdiff;
689 nrg = ps->prev_nrg[b];
690 nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691 ps->prev_nrg[b] = nrg;
693 if (MUL_R(peakdiff, gamma) <= nrg) {
696 transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
699 for (k = 0; k < NUM_OF_LINKS; k++)
701 new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
704 RE(tmp0) = RE(ps->d_buff[0][b]);
705 IM(tmp0) = IM(ps->d_buff[0][b]);
707 RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
708 IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
710 RE(ps->d_buff[1][b]) = RE(in);
711 IM(ps->d_buff[1][b]) = IM(in);
713 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
718 for (k = 0; k < NUM_OF_LINKS; k++)
720 RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721 IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
723 RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
724 IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
726 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
728 RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729 IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
731 RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
732 IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
738 QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739 QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
741 for (k = 0; k < NUM_OF_LINKS; k++)
743 if (++temp_delay_ser[k] >= delay_length[k])
744 temp_delay_ser[k] = 0;
749 for (k = 0; k < NUM_OF_LINKS; k++)
750 ps->delay_buf_index_ser[k] = temp_delay_ser[k];
753 static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
755 uint8_t s, b, ifreq, qclass;
756 real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND];
757 real_t new_dir_map, new_sa_map;
759 if (ps->bs_enable_sa)
761 /* Instead of dequantization and mapping, we use an inverse mapping
762 to look up all the values we need */
763 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
765 const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
767 ifreq = sa_inv_freq[b];
770 sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
771 new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
773 k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
775 sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
776 new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
778 k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
782 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
784 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
786 QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
787 QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
788 QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]);
789 QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]);
791 sa_map[b] += k_sa_map[b];
792 sa_dir_map[b] += k_sa_dir_map[b];
794 for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
796 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
797 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
802 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
804 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
806 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
807 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
813 static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
815 uint8_t s, b, qclass, ifreq;
816 real_t tmp, coeff1, coeff2;
817 real_t pan_base[MAX_PAN_BAND];
818 real_t pan_delta[MAX_PAN_BAND];
819 qmf_t temp_l, temp_r;
821 if (ps->bs_enable_pan)
823 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
825 /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
826 inverse mapping 64->20 and look up the 2^G(x,y) values directly */
827 ifreq = pan_inv_freq[b];
828 qclass = pan_quant_class[ifreq];
830 if (ps->g_prev_pan_index[ifreq] >= 0)
832 pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
834 pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
837 /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
838 /* a en b can be negative so we may need to inverse parts */
839 if (ps->g_pan_index[ifreq] >= 0)
841 if (ps->g_prev_pan_index[ifreq] >= 0)
843 pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
844 pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
846 pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
847 pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
850 if (ps->g_prev_pan_index[ifreq] >= 0)
852 pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
853 pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
855 pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
856 pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
861 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
863 /* PAN always uses all 64 channels */
864 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
868 coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869 coeff1 = MUL_R(coeff2, tmp);
871 QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
872 QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
873 QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
874 QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
876 QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
877 QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
878 QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
879 QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
881 /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
882 /* ^^^^^^^^^^^^^^^ k times */
883 pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
889 drm_ps_info *drm_ps_init(void)
891 drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
893 memset(ps, 0, sizeof(drm_ps_info));
898 void drm_ps_free(drm_ps_info *ps)
903 /* main DRM PS decoding function */
904 uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64])
908 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
912 if (!ps->drm_ps_data_available && !guess)
914 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
915 memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
916 memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
920 /* if SBR CRC doesn't match out, we can assume decode errors to start with,
921 and we'll guess what the parameters should be */
924 ps->sa_decode_error = 0;
925 ps->pan_decode_error = 0;
926 drm_ps_delta_decode(ps);
929 ps->sa_decode_error = 1;
930 ps->pan_decode_error = 1;
931 /* don't even bother decoding */
934 ps->drm_ps_data_available = 0;
936 drm_calc_sa_side_signal(ps, X_left);
937 drm_add_ambiance(ps, X_left, X_right);
939 if (ps->bs_enable_sa)
941 ps->g_last_had_sa = 1;
943 memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
946 ps->g_last_had_sa = 0;
949 if (ps->bs_enable_pan)
951 drm_add_pan(ps, X_left, X_right);
953 ps->g_last_had_pan = 1;
955 memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
958 ps->g_last_had_pan = 0;