Rework of libfaad in several areas. Allow removal of malloc with a new define FAAD_ST...
[kugel-rb.git] / apps / codecs / libfaad / drm_dec.c
blobf0b0f01f2b40bd3325b026e28f370c2ee2428515
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 definitions */
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) }
448 /* static variables */
449 static drm_ps_info s_drm_ps_info;
451 /* static function declarations */
452 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld);
453 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld);
454 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff);
457 uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
459 uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
461 ps->drm_ps_data_available = 1;
463 ps->bs_enable_sa = faad_get1bit(ld);
464 ps->bs_enable_pan = faad_get1bit(ld);
466 if (ps->bs_enable_sa)
468 drm_ps_sa_element(ps, ld);
471 if (ps->bs_enable_pan)
473 drm_ps_pan_element(ps, ld);
476 bits = (uint16_t)faad_get_processed_bits(ld) - bits;
478 return bits;
481 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
483 drm_ps_huff_tab huff;
484 uint8_t band;
486 ps->bs_sa_dt_flag = faad_get1bit(ld);
487 if (ps->bs_sa_dt_flag)
489 huff = t_huffman_sa;
490 } else {
491 huff = f_huffman_sa;
494 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
496 ps->bs_sa_data[band] = huff_dec(ld, huff);
500 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
502 drm_ps_huff_tab huff;
503 uint8_t band;
505 ps->bs_pan_dt_flag = faad_get1bit(ld);
506 if (ps->bs_pan_dt_flag)
508 huff = t_huffman_pan;
509 } else {
510 huff = f_huffman_pan;
513 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
515 ps->bs_pan_data[band] = huff_dec(ld, huff);
519 /* binary search huffman decoding */
520 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
522 uint8_t bit;
523 int16_t index = 0;
525 while (index >= 0)
527 bit = (uint8_t)faad_get1bit(ld);
528 index = huff[index][bit];
531 return index + 15;
535 static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
537 if (i < 0) {
538 /* printf(" SAminclip %d", i); */
539 ps->sa_decode_error = 1;
540 return 0;
541 } else if (i > 7) {
542 /* printf(" SAmaxclip %d", i); */
543 ps->sa_decode_error = 1;
544 return 7;
545 } else
546 return i;
549 static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
551 if (i < -7) {
552 /* printf(" PANminclip %d", i); */
553 ps->pan_decode_error = 1;
554 return -7;
555 } else if (i > 7) {
556 /* printf(" PANmaxclip %d", i); */
557 ps->pan_decode_error = 1;
558 return 7;
559 } else
560 return i;
563 static void drm_ps_delta_decode(drm_ps_info *ps)
565 uint8_t band;
567 if (ps->bs_enable_sa)
569 if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
571 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
573 ps->g_prev_sa_index[band] = 0;
576 if (ps->bs_sa_dt_flag)
578 ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
580 } else {
581 ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
584 for (band = 1; band < DRM_NUM_SA_BANDS; band++)
586 if (ps->bs_sa_dt_flag)
588 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
589 } else {
590 ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]);
595 /* An error during SA decoding implies PAN data will be undecodable, too */
596 /* Also, we don't like on/off switching in PS, so we force to last settings */
597 if (ps->sa_decode_error) {
598 ps->pan_decode_error = 1;
599 ps->bs_enable_pan = ps->g_last_had_pan;
600 ps->bs_enable_sa = ps->g_last_had_sa;
604 if (ps->bs_enable_sa)
606 if (ps->sa_decode_error) {
607 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
609 ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
611 } else {
612 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
614 ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
619 if (ps->bs_enable_pan)
621 if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
623 /* The DRM PS spec doesn't say anything about this case. (deltacoded in time without a previous frame)
624 AAC PS spec you must tread previous frame as 0, so that's what we try.
626 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
628 ps->g_prev_pan_index[band] = 0;
632 if (ps->bs_pan_dt_flag)
634 ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]);
635 } else {
636 ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
639 for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
641 if (ps->bs_pan_dt_flag)
643 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
644 } else {
645 ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]);
649 if (ps->pan_decode_error) {
650 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
652 ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
654 } else {
655 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
657 ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
663 static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[MAX_NTSRPS][64], uint8_t rateselect)
665 uint8_t s, b, k;
666 complex_t qfrac, tmp0, tmp, in, R0;
667 real_t peakdiff;
668 real_t nrg;
669 real_t power;
670 real_t transratio;
671 real_t new_delay_slopes[NUM_OF_LINKS];
672 uint8_t temp_delay_ser[NUM_OF_LINKS];
673 complex_t Phi_Fract;
674 #ifdef FIXED_POINT
675 uint32_t in_re, in_im;
676 #endif
678 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
680 /* set delay indices */
681 for (k = 0; k < NUM_OF_LINKS; k++)
682 temp_delay_ser[k] = ps->delay_buf_index_ser[k];
684 RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
685 IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
687 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
689 const real_t gamma = REAL_CONST(1.5);
690 const real_t sigma = REAL_CONST(1.5625);
692 RE(in) = QMF_RE(X[s][b]);
693 IM(in) = QMF_IM(X[s][b]);
695 #ifdef FIXED_POINT
696 /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF
697 * meaning that P will be scaled by 2^(-10) compared to floating point version
699 in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
700 in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS);
701 power = in_re*in_re + in_im*in_im;
702 #else
703 power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
704 #endif
706 ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay[rateselect]);
707 if (ps->peakdecay_fast[b] < power)
708 ps->peakdecay_fast[b] = power;
710 peakdiff = ps->prev_peakdiff[b];
711 peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff[rateselect]);
712 ps->prev_peakdiff[b] = peakdiff;
714 nrg = ps->prev_nrg[b];
715 nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff[rateselect]);
716 ps->prev_nrg[b] = nrg;
718 if (MUL_R(peakdiff, gamma) <= nrg) {
719 transratio = sigma;
720 } else {
721 transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
724 for (k = 0; k < NUM_OF_LINKS; k++)
726 new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
729 RE(tmp0) = RE(ps->d_buff[0][b]);
730 IM(tmp0) = IM(ps->d_buff[0][b]);
732 RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]);
733 IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]);
735 RE(ps->d_buff[1][b]) = RE(in);
736 IM(ps->d_buff[1][b]) = IM(in);
738 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
740 RE(R0) = RE(tmp);
741 IM(R0) = IM(tmp);
743 for (k = 0; k < NUM_OF_LINKS; k++)
745 RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
746 IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
748 RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]);
749 IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]);
751 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
753 RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
754 IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
756 RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp));
757 IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp));
759 RE(R0) = RE(tmp);
760 IM(R0) = IM(tmp);
763 QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
764 QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
766 for (k = 0; k < NUM_OF_LINKS; k++)
768 if (++temp_delay_ser[k] >= delay_length[k][rateselect])
769 temp_delay_ser[k] = 0;
774 for (k = 0; k < NUM_OF_LINKS; k++)
775 ps->delay_buf_index_ser[k] = temp_delay_ser[k];
778 static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect,
779 qmf_t X_left[MAX_NTSRPS][64],
780 qmf_t X_right[MAX_NTSRPS][64])
782 uint8_t s, b, ifreq, qclass;
783 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];
784 real_t new_dir_map, new_sa_map;
786 if (ps->bs_enable_sa)
788 /* Instead of dequantization and mapping, we use an inverse mapping
789 to look up all the values we need */
790 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
792 const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
794 ifreq = sa_inv_freq[b];
795 qclass = (b != 0);
797 sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass];
798 new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass];
800 k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
802 sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass];
803 new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass];
805 k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
809 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
811 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
813 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]);
814 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]);
815 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]);
816 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]);
818 sa_map[b] += k_sa_map[b];
819 sa_dir_map[b] += k_sa_dir_map[b];
821 for (b = sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b < NUM_OF_QMF_CHANNELS; b++)
823 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
824 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
828 else {
829 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
831 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
833 QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]);
834 QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]);
840 static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect,
841 qmf_t X_left[MAX_NTSRPS][64],
842 qmf_t X_right[MAX_NTSRPS][64])
844 uint8_t s, b, qclass, ifreq;
845 real_t tmp, coeff1, coeff2;
846 real_t pan_base[MAX_PAN_BAND];
847 real_t pan_delta[MAX_PAN_BAND];
848 qmf_t temp_l, temp_r;
850 if (ps->bs_enable_pan)
852 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
854 /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an
855 inverse mapping 64->20 and look up the 2^G(x,y) values directly */
856 ifreq = pan_inv_freq[b];
857 qclass = pan_quant_class[ifreq];
859 if (ps->g_prev_pan_index[ifreq] >= 0)
861 pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
862 } else {
863 pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
866 /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */
867 /* a en b can be negative so we may need to inverse parts */
868 if (ps->g_pan_index[ifreq] >= 0)
870 if (ps->g_prev_pan_index[ifreq] >= 0)
872 pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
873 pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
874 } else {
875 pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass],
876 pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
878 } else {
879 if (ps->g_prev_pan_index[ifreq] >= 0)
881 pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
882 pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]);
883 } else {
884 pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass],
885 pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]);
890 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
892 /* PAN always uses all 64 channels */
893 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
895 tmp = pan_base[b];
897 coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
898 coeff1 = MUL_R(coeff2, tmp);
900 QMF_RE(temp_l) = QMF_RE(X_left[s][b]);
901 QMF_IM(temp_l) = QMF_IM(X_left[s][b]);
902 QMF_RE(temp_r) = QMF_RE(X_right[s][b]);
903 QMF_IM(temp_r) = QMF_IM(X_right[s][b]);
905 QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1);
906 QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1);
907 QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2);
908 QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2);
910 /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */
911 /* ^^^^^^^^^^^^^^^ k times */
912 pan_base[b] = MUL_C(pan_base[b], pan_delta[b]);
918 drm_ps_info *drm_ps_init(void)
920 drm_ps_info *ps = &s_drm_ps_info;
921 memset(ps, 0, sizeof(drm_ps_info));
923 return ps;
926 /* main DRM PS decoding function */
927 uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate,
928 qmf_t X_left[MAX_NTSRPS][64],
929 qmf_t X_right[MAX_NTSRPS][64])
931 uint8_t rateselect = (samplerate >= 24000);
933 if (ps == NULL)
935 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
936 return 0;
939 if (!ps->drm_ps_data_available && !guess)
941 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
942 memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index));
943 memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index));
944 return 0;
947 /* if SBR CRC doesn't match out, we can assume decode errors to start with,
948 and we'll guess what the parameters should be */
949 if (!guess)
951 ps->sa_decode_error = 0;
952 ps->pan_decode_error = 0;
953 drm_ps_delta_decode(ps);
954 } else
956 ps->sa_decode_error = 1;
957 ps->pan_decode_error = 1;
958 /* don't even bother decoding */
961 ps->drm_ps_data_available = 0;
963 drm_calc_sa_side_signal(ps, X_left, rateselect);
964 drm_add_ambiance(ps, rateselect, X_left, X_right);
966 if (ps->bs_enable_sa)
968 ps->g_last_had_sa = 1;
970 memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
972 } else {
973 ps->g_last_had_sa = 0;
976 if (ps->bs_enable_pan)
978 drm_add_pan(ps, rateselect, X_left, X_right);
980 ps->g_last_had_pan = 1;
982 memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
984 } else {
985 ps->g_last_had_pan = 0;
989 return 0;
992 #endif