Use proper length specifiers in mp_msg calls, fixes the warnings:
[mplayer/greg.git] / libfaad2 / drm_dec.c
blob8bf905169d89a7ecadb7237271630191216d2882
1 /*
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
4 **
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.
9 **
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
20 ** forbidden.
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
25 ** $Id$
26 **/
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include <math.h>
32 #include "common.h"
34 #ifdef DRM
36 #include "sbr_dec.h"
37 #include "drm_dec.h"
38 #include "bits.h"
40 /* constants */
41 #define DECAY_CUTOFF 3
42 #define DECAY_SLOPE 0.05f
44 /* type definitaions */
45 typedef const int8_t (*drm_ps_huff_tab)[2];
48 /* binary search huffman tables */
49 static const int8_t f_huffman_sa[][2] =
51 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
52 { 2, 3 }, /* index 1: 2 bits: 1x */
53 { /*7*/ -8, 4 }, /* index 2: 3 bits: 10x */
54 { 5, 6 }, /* index 3: 3 bits: 11x */
55 { /*1*/ -14, /*-1*/ -16 }, /* index 4: 4 bits: 101x */
56 { /*-2*/ -17, 7 }, /* index 5: 4 bits: 110x */
57 { 8, 9 }, /* index 6: 4 bits: 111x */
58 { /*2*/ -13, /*-3*/ -18 }, /* index 7: 5 bits: 1101x */
59 { /*3*/ -12, 10 }, /* index 8: 5 bits: 1110x */
60 { 11, 12 }, /* index 9: 5 bits: 1111x */
61 { /*4*/ -11, /*5*/ -10 }, /* index 10: 6 bits: 11101x */
62 { /*-4*/ -19, /*-5*/ -20 }, /* index 11: 6 bits: 11110x */
63 { /*6*/ -9, 13 }, /* index 12: 6 bits: 11111x */
64 { /*-7*/ -22, /*-6*/ -21 } /* index 13: 7 bits: 111111x */
67 static const int8_t t_huffman_sa[][2] =
69 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
70 { 2, 3 }, /* index 1: 2 bits: 1x */
71 { /*-1*/ -16, /*1*/ -14 }, /* index 2: 3 bits: 10x */
72 { 4, 5 }, /* index 3: 3 bits: 11x */
73 { /*-2*/ -17, /*2*/ -13 }, /* index 4: 4 bits: 110x */
74 { 6, 7 }, /* index 5: 4 bits: 111x */
75 { /*-3*/ -18, /*3*/ -12 }, /* index 6: 5 bits: 1110x */
76 { 8, 9 }, /* index 7: 5 bits: 1111x */
77 { /*-4*/ -19, /*4*/ -11 }, /* index 8: 6 bits: 11110x */
78 { 10, 11 }, /* index 9: 6 bits: 11111x */
79 { /*-5*/ -20, /*5*/ -10 }, /* index 10: 7 bits: 111110x */
80 { /*-6*/ -21, 12 }, /* index 11: 7 bits: 111111x */
81 { /*-7*/ -22, 13 }, /* index 12: 8 bits: 1111111x */
82 { /*6*/ -9, /*7*/ -8 } /* index 13: 9 bits: 11111111x */
85 static const int8_t f_huffman_pan[][2] =
87 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
88 { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */
89 { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */
90 { 4, 5 }, /* index 3: 4 bits: 111x */
91 { /*-2*/ -17, /*2*/ -13 }, /* index 4: 5 bits: 1110x */
92 { 6, 7 }, /* index 5: 5 bits: 1111x */
93 { /*-3*/ -18, /*3*/ -12 }, /* index 6: 6 bits: 11110x */
94 { 8, 9 }, /* index 7: 6 bits: 11111x */
95 { /*-4*/ -19, /*4*/ -11 }, /* index 8: 7 bits: 111110x */
96 { 10, 11 }, /* index 9: 7 bits: 111111x */
97 { /*-5*/ -20, /*5*/ -10 }, /* index 10: 8 bits: 1111110x */
98 { 12, 13 }, /* index 11: 8 bits: 1111111x */
99 { /*-6*/ -21, /*6*/ -9 }, /* index 12: 9 bits: 11111110x */
100 { /*-7*/ -22, 14 }, /* index 13: 9 bits: 11111111x */
101 { /*7*/ -8, 15 }, /* index 14: 10 bits: 111111111x */
102 { 16, 17 }, /* index 15: 11 bits: 1111111111x */
103 { /*-8*/ -23, /*8*/ -7 }, /* index 16: 12 bits: 11111111110x */
104 { 18, 19 }, /* index 17: 12 bits: 11111111111x */
105 { /*-10*/ -25, 20 }, /* index 18: 13 bits: 111111111110x */
106 { 21, 22 }, /* index 19: 13 bits: 111111111111x */
107 { /*-9*/ -24, /*9*/ -6 }, /* index 20: 14 bits: 1111111111101x */
108 { /*10*/ -5, 23 }, /* index 21: 14 bits: 1111111111110x */
109 { 24, 25 }, /* index 22: 14 bits: 1111111111111x */
110 { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */
111 { /*11*/ -4, /*13*/ -2 }, /* index 24: 15 bits: 11111111111110x */
112 { 26, 27 }, /* index 25: 15 bits: 11111111111111x */
113 { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */
114 { /*12*/ -3, /*14*/ -1 } /* index 27: 16 bits: 111111111111111x */
117 static const int8_t t_huffman_pan[][2] =
119 { /*0*/ -15, 1 }, /* index 0: 1 bits: x */
120 { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */
121 { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */
122 { /*-2*/ -17, 4 }, /* index 3: 4 bits: 111x */
123 { /*2*/ -13, 5 }, /* index 4: 5 bits: 1111x */
124 { /*-3*/ -18, 6 }, /* index 5: 6 bits: 11111x */
125 { /*3*/ -12, 7 }, /* index 6: 7 bits: 111111x */
126 { /*-4*/ -19, 8 }, /* index 7: 8 bits: 1111111x */
127 { /*4*/ -11, 9 }, /* index 8: 9 bits: 11111111x */
128 { 10, 11 }, /* index 9: 10 bits: 111111111x */
129 { /*-5*/ -20, /*5*/ -10 }, /* index 10: 11 bits: 1111111110x */
130 { 12, 13 }, /* index 11: 11 bits: 1111111111x */
131 { /*-6*/ -21, /*6*/ -9 }, /* index 12: 12 bits: 11111111110x */
132 { 14, 15 }, /* index 13: 12 bits: 11111111111x */
133 { /*-7*/ -22, /*7*/ -8 }, /* index 14: 13 bits: 111111111110x */
134 { 16, 17 }, /* index 15: 13 bits: 111111111111x */
135 { /*-8*/ -23, /*8*/ -7 }, /* index 16: 14 bits: 1111111111110x */
136 { 18, 19 }, /* index 17: 14 bits: 1111111111111x */
137 { /*-10*/ -25, /*10*/ -5 }, /* index 18: 15 bits: 11111111111110x */
138 { 20, 21 }, /* index 19: 15 bits: 11111111111111x */
139 { /*-9*/ -24, /*9*/ -6 }, /* index 20: 16 bits: 111111111111110x */
140 { 22, 23 }, /* index 21: 16 bits: 111111111111111x */
141 { 24, 25 }, /* index 22: 17 bits: 1111111111111110x */
142 { 26, 27 }, /* index 23: 17 bits: 1111111111111111x */
143 { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */
144 { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */
145 { /*11*/ -4, /*12*/ -3 }, /* index 26: 18 bits: 11111111111111110x */
146 { /*13*/ -2, /*14*/ -1 } /* index 27: 18 bits: 11111111111111111x */
149 /* There are 3 classes in the standard but the last 2 are identical */
150 static const real_t sa_quant[8][2] =
152 { FRAC_CONST(0.0000), FRAC_CONST(0.0000) },
153 { FRAC_CONST(0.0501), FRAC_CONST(0.1778) },
154 { FRAC_CONST(0.0706), FRAC_CONST(0.2818) },
155 { FRAC_CONST(0.0995), FRAC_CONST(0.4467) },
156 { FRAC_CONST(0.1399), FRAC_CONST(0.5623) },
157 { FRAC_CONST(0.1957), FRAC_CONST(0.7079) },
158 { FRAC_CONST(0.2713), FRAC_CONST(0.8913) },
159 { FRAC_CONST(0.3699), FRAC_CONST(1.0000) },
162 /* We don't need the actual quantizer values */
163 #if 0
164 static const real_t pan_quant[8][5] =
166 { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) },
167 { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) },
168 { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) },
169 { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) },
170 { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) },
171 { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) },
172 { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) },
173 { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) },
175 #endif
177 /* 2^(pan_quant[x][y] */
178 static const real_t pan_pow_2_pos[8][5] = {
179 { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000) },
180 { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312) },
181 { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016) },
182 { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565) },
183 { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337) },
184 { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994) },
185 { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876) },
186 { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140) }
189 /* 2^(-pan_quant[x][y] */
190 static const real_t pan_pow_2_neg[8][5] = {
191 { REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1) },
192 { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242) },
193 { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344) },
194 { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199) },
195 { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336) },
196 { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266) },
197 { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107) },
198 { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825) }
201 /* 2^(pan_quant[x][y]/30) */
202 static const real_t pan_pow_2_30_pos[8][5] = {
203 { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) },
204 { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) },
205 { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933), COEF_CONST(1.019373909), COEF_CONST(1.019373909) },
206 { COEF_CONST(1.011579706), COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) },
207 { COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) },
208 { COEF_CONST(1.019373909), COEF_CONST(1.03117796), COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263) },
209 { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) },
210 { COEF_CONST(1.03117796), COEF_CONST(1.055195268), COEF_CONST(1.0839263), COEF_CONST(1.113439626), COEF_CONST(1.143756546) }
213 /* 2^(-pan_quant[x][y]/30) */
214 static const real_t pan_pow_2_30_neg[8][5] = {
215 { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) },
216 { COEF_CONST(0.99616963), COEF_CONST(0.99616963), COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393) },
217 { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) },
218 { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) },
219 { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) },
220 { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) },
221 { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) },
222 { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) }
225 static const real_t g_decayslope[MAX_SA_BAND] = {
226 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),
227 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),
228 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),
229 FRAC_CONST(0.05),FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0),
230 FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0),
231 FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0),
232 FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0)
235 static const real_t sa_sqrt_1_minus[8][2] = {
236 { FRAC_CONST(1), FRAC_CONST(1) },
237 { FRAC_CONST(0.998744206), FRAC_CONST(0.984066644) },
238 { FRAC_CONST(0.997504707), FRAC_CONST(0.959473168) },
239 { FRAC_CONST(0.995037562), FRAC_CONST(0.894683804) },
240 { FRAC_CONST(0.990165638), FRAC_CONST(0.826933317) },
241 { FRAC_CONST(0.980663811), FRAC_CONST(0.706312672) },
242 { FRAC_CONST(0.962494836), FRAC_CONST(0.45341406) },
243 { FRAC_CONST(0.929071574), FRAC_CONST(0) }
246 static const uint8_t sa_freq_scale[9][2] =
248 { 0, 0},
249 { 1, 1},
250 { 2, 2},
251 { 3, 3},
252 { 5, 5},
253 { 7, 7},
254 {10,10},
255 {13,13},
256 {46,23}
259 static const uint8_t pan_freq_scale[21] =
261 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
262 11, 12, 13, 14, 15, 18, 22, 26, 32, 64
265 static const uint8_t pan_quant_class[20] =
267 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
268 2, 2, 2, 2, 3, 3, 3, 4, 4, 4
271 /* Inverse mapping lookup */
272 static const uint8_t pan_inv_freq[64] = {
273 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
274 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
275 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
276 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
279 static const uint8_t sa_inv_freq[MAX_SA_BAND] = {
280 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6,
281 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
282 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
283 7, 7, 7, 7, 7, 7, 7
286 static const real_t filter_coeff[] =
288 FRAC_CONST(0.65143905754106),
289 FRAC_CONST(0.56471812200776),
290 FRAC_CONST(0.48954165955695)
293 static const uint8_t delay_length[][2] =
295 { 1, 3 }, { 2, 4 }, { 3, 5 }
298 static const real_t delay_fraction[] =
300 FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347)
303 static const real_t peak_decay[2] =
305 FRAC_CONST(0.58664621951003), FRAC_CONST(0.76592833836465)
308 static const real_t smooth_coeff[2] =
310 FRAC_CONST(0.6), FRAC_CONST(0.25)
313 /* Please note that these are the same tables as in plain PS */
314 static const complex_t Q_Fract_allpass_Qmf[][3] = {
315 { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } },
316 { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } },
317 { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } },
318 { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } },
319 { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } },
320 { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } },
321 { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } },
322 { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } },
323 { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } },
324 { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } },
325 { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } },
326 { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } },
327 { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } },
328 { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } },
329 { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } },
330 { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } },
331 { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } },
332 { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } },
333 { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } },
334 { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } },
335 { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } },
336 { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } },
337 { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } },
338 { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } },
339 { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } },
340 { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } },
341 { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } },
342 { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } },
343 { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } },
344 { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } },
345 { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } },
346 { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } },
347 { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } },
348 { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } },
349 { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } },
350 { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } },
351 { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } },
352 { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } },
353 { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } },
354 { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } },
355 { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } },
356 { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } },
357 { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } },
358 { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } },
359 { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } },
360 { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } },
361 { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } },
362 { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } },
363 { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } },
364 { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } },
365 { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } },
366 { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } },
367 { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } },
368 { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } },
369 { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } },
370 { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } },
371 { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } },
372 { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } },
373 { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } },
374 { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } },
375 { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } },
376 { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } },
377 { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } },
378 { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } }
381 static const complex_t Phi_Fract_Qmf[] = {
382 { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) },
383 { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) },
384 { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) },
385 { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) },
386 { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) },
387 { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) },
388 { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) },
389 { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) },
390 { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) },
391 { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) },
392 { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) },
393 { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) },
394 { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) },
395 { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) },
396 { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) },
397 { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) },
398 { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) },
399 { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) },
400 { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) },
401 { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) },
402 { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) },
403 { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) },
404 { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) },
405 { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) },
406 { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) },
407 { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) },
408 { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) },
409 { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) },
410 { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) },
411 { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) },
412 { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) },
413 { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) },
414 { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) },
415 { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) },
416 { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) },
417 { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) },
418 { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) },
419 { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) },
420 { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) },
421 { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) },
422 { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) },
423 { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) },
424 { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) },
425 { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) },
426 { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) },
427 { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) },
428 { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) },
429 { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) },
430 { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) },
431 { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) },
432 { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) },
433 { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) },
434 { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) },
435 { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) },
436 { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) },
437 { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) },
438 { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) },
439 { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) },
440 { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) },
441 { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) },
442 { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) },
443 { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) },
444 { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) },
445 { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) }
449 /* static function declarations */
450 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld);
451 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld);
452 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff);
455 uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
457 uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
459 ps->drm_ps_data_available = 1;
461 ps->bs_enable_sa = faad_get1bit(ld);
462 ps->bs_enable_pan = faad_get1bit(ld);
464 if (ps->bs_enable_sa)
466 drm_ps_sa_element(ps, ld);
469 if (ps->bs_enable_pan)
471 drm_ps_pan_element(ps, ld);
474 bits = (uint16_t)faad_get_processed_bits(ld) - bits;
476 return bits;
479 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
481 drm_ps_huff_tab huff;
482 uint8_t band;
484 ps->bs_sa_dt_flag = faad_get1bit(ld);
485 if (ps->bs_sa_dt_flag)
487 huff = t_huffman_sa;
488 } else {
489 huff = f_huffman_sa;
492 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
494 ps->bs_sa_data[band] = huff_dec(ld, huff);
498 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
500 drm_ps_huff_tab huff;
501 uint8_t band;
503 ps->bs_pan_dt_flag = faad_get1bit(ld);
504 if (ps->bs_pan_dt_flag)
506 huff = t_huffman_pan;
507 } else {
508 huff = f_huffman_pan;
511 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
513 ps->bs_pan_data[band] = huff_dec(ld, huff);
517 /* binary search huffman decoding */
518 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
520 uint8_t bit;
521 int16_t index = 0;
523 while (index >= 0)
525 bit = (uint8_t)faad_get1bit(ld);
526 index = huff[index][bit];
529 return index + 15;
533 static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
535 if (i < 0) {
536 /* printf(" SAminclip %d", i); */
537 ps->sa_decode_error = 1;
538 return 0;
539 } else if (i > 7) {
540 /* printf(" SAmaxclip %d", i); */
541 ps->sa_decode_error = 1;
542 return 7;
543 } else
544 return i;
547 static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
549 if (i < -7) {
550 /* printf(" PANminclip %d", i); */
551 ps->pan_decode_error = 1;
552 return -7;
553 } else if (i > 7) {
554 /* printf(" PANmaxclip %d", i); */
555 ps->pan_decode_error = 1;
556 return 7;
557 } else
558 return i;
561 static void drm_ps_delta_decode(drm_ps_info *ps)
563 uint8_t band;
565 if (ps->bs_enable_sa)
567 if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
569 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
571 ps->g_prev_sa_index[band] = 0;
574 if (ps->bs_sa_dt_flag)
576 ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
578 } else {
579 ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
582 for (band = 1; band < DRM_NUM_SA_BANDS; band++)
584 if (ps->bs_sa_dt_flag)
586 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
587 } else {
588 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
593 /* An error during SA decoding implies PAN data will be undecodable, too */
594 /* Also, we don't like on/off switching in PS, so we force to last settings */
595 if (ps->sa_decode_error) {
596 ps->pan_decode_error = 1;
597 ps->bs_enable_pan = ps->g_last_had_pan;
598 ps->bs_enable_sa = ps->g_last_had_sa;
602 if (ps->bs_enable_sa)
604 if (ps->sa_decode_error) {
605 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
607 ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
609 } else {
610 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
612 ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
617 if (ps->bs_enable_pan)
619 if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
621 /* The DRM PS spec doesn't say anything about this case. (deltacoded in time without a previous frame)
622 AAC PS spec you must tread previous frame as 0, so that's what we try.
624 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626 ps->g_prev_pan_index[band] = 0;
630 if (ps->bs_pan_dt_flag)
632 ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
633 } else {
634 ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
637 for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
639 if (ps->bs_pan_dt_flag)
641 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
642 } else {
643 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
647 if (ps->pan_decode_error) {
648 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
650 ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
652 } else {
653 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
655 ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
661 static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64], uint8_t rateselect)
663 uint8_t s, b, k;
664 complex_t qfrac, tmp0, tmp, in, R0;
665 real_t peakdiff;
666 real_t nrg;
667 real_t power;
668 real_t transratio;
669 real_t new_delay_slopes[NUM_OF_LINKS];
670 uint8_t temp_delay_ser[NUM_OF_LINKS];
671 complex_t Phi_Fract;
672 #ifdef FIXED_POINT
673 uint32_t in_re, in_im;
674 #endif
676 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
678 /* set delay indices */
679 for (k = 0; k < NUM_OF_LINKS; k++)
680 temp_delay_ser[k] = ps->delay_buf_index_ser[k];
682 RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
683 IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
685 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
687 const real_t gamma = REAL_CONST(1.5);
688 const real_t sigma = REAL_CONST(1.5625);
690 RE(in) = QMF_RE(X[s][b]);
691 IM(in) = QMF_IM(X[s][b]);
693 #ifdef FIXED_POINT
694 /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
695 * meaning that P will be scaled by 2^(-10) compared to floating point version
697 in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
698 in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
699 power = in_re*in_re + in_im*in_im;
700 #else
701 power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
702 #endif
704 ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay[rateselect]);
705 if (ps->peakdecay_fast[b] < power)
706 ps->peakdecay_fast[b] = power;
708 peakdiff = ps->prev_peakdiff[b];
709 peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff[rateselect]);
710 ps->prev_peakdiff[b] = peakdiff;
712 nrg = ps->prev_nrg[b];
713 nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff[rateselect]);
714 ps->prev_nrg[b] = nrg;
716 if (MUL_R(peakdiff, gamma) <= nrg) {
717 transratio = sigma;
718 } else {
719 transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
722 for (k = 0; k < NUM_OF_LINKS; k++)
724 new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
727 RE(tmp0) = RE(ps->d_buff[0][b]);
728 IM(tmp0) = IM(ps->d_buff[0][b]);
730 RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
731 IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
733 RE(ps->d_buff[1][b]) = RE(in);
734 IM(ps->d_buff[1][b]) = IM(in);
736 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
738 RE(R0) = RE(tmp);
739 IM(R0) = IM(tmp);
741 for (k = 0; k < NUM_OF_LINKS; k++)
743 RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
744 IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
746 RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
747 IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
749 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
751 RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
752 IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
754 RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
755 IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
757 RE(R0) = RE(tmp);
758 IM(R0) = IM(tmp);
761 QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
762 QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
764 for (k = 0; k < NUM_OF_LINKS; k++)
766 if (++temp_delay_ser[k] >= delay_length[k][rateselect])
767 temp_delay_ser[k] = 0;
772 for (k = 0; k < NUM_OF_LINKS; k++)
773 ps->delay_buf_index_ser[k] = temp_delay_ser[k];
776 static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64])
778 uint8_t s, b, ifreq, qclass;
779 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];
780 real_t new_dir_map, new_sa_map;
782 if (ps->bs_enable_sa)
784 /* Instead of dequantization and mapping, we use an inverse mapping
785 to look up all the values we need */
786 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
788 const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
790 ifreq = sa_inv_freq[b];
791 qclass = (b != 0);
793 sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
794 new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
796 k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
798 sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
799 new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
801 k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
805 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
807 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
809 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]);
810 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]);
811 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]);
812 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]);
814 sa_map[b] += k_sa_map[b];
815 sa_dir_map[b] += k_sa_dir_map[b];
817 for (b = sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b < NUM_OF_QMF_CHANNELS; b++)
819 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
820 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
824 else {
825 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
827 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
829 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
830 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
836 static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect, qmf_t X_left[38][64], qmf_t X_right[38][64])
838 uint8_t s, b, qclass, ifreq;
839 real_t tmp, coeff1, coeff2;
840 real_t pan_base[MAX_PAN_BAND];
841 real_t pan_delta[MAX_PAN_BAND];
842 qmf_t temp_l, temp_r;
844 if (ps->bs_enable_pan)
846 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
848 /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
849 inverse mapping 64->20 and look up the 2^G(x,y) values directly */
850 ifreq = pan_inv_freq[b];
851 qclass = pan_quant_class[ifreq];
853 if (ps->g_prev_pan_index[ifreq] >= 0)
855 pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
856 } else {
857 pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
860 /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
861 /* a en b can be negative so we may need to inverse parts */
862 if (ps->g_pan_index[ifreq] >= 0)
864 if (ps->g_prev_pan_index[ifreq] >= 0)
866 pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
867 pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
868 } else {
869 pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
870 pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
872 } else {
873 if (ps->g_prev_pan_index[ifreq] >= 0)
875 pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
876 pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
877 } else {
878 pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
879 pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
884 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
886 /* PAN always uses all 64 channels */
887 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
889 tmp = pan_base[b];
891 coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
892 coeff1 = MUL_R(coeff2, tmp);
894 QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
895 QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
896 QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
897 QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
899 QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
900 QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
901 QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
902 QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
904 /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
905 /* ^^^^^^^^^^^^^^^ k times */
906 pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
912 drm_ps_info *drm_ps_init(void)
914 drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
916 memset(ps, 0, sizeof(drm_ps_info));
918 return ps;
921 void drm_ps_free(drm_ps_info *ps)
923 faad_free(ps);
926 /* main DRM PS decoding function */
927 uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, qmf_t X_left[38][64], qmf_t X_right[38][64])
929 uint8_t rateselect = (samplerate >= 24000);
931 if (ps == NULL)
933 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
934 return 0;
937 if (!ps->drm_ps_data_available && !guess)
939 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
940 memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
941 memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
942 return 0;
945 /* if SBR CRC doesn't match out, we can assume decode errors to start with,
946 and we'll guess what the parameters should be */
947 if (!guess)
949 ps->sa_decode_error = 0;
950 ps->pan_decode_error = 0;
951 drm_ps_delta_decode(ps);
952 } else
954 ps->sa_decode_error = 1;
955 ps->pan_decode_error = 1;
956 /* don't even bother decoding */
959 ps->drm_ps_data_available = 0;
961 drm_calc_sa_side_signal(ps, X_left, rateselect);
962 drm_add_ambiance(ps, rateselect, X_left, X_right);
964 if (ps->bs_enable_sa)
966 ps->g_last_had_sa = 1;
968 memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
970 } else {
971 ps->g_last_had_sa = 0;
974 if (ps->bs_enable_pan)
976 drm_add_pan(ps, rateselect, X_left, X_right);
978 ps->g_last_had_pan = 1;
980 memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
982 } else {
983 ps->g_last_had_pan = 0;
987 return 0;
990 #endif