1 /*
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2005 M. Bakker, Nero 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.
14 **
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.
18 **
19 ** Any non-GPL usage of this software or parts of this software is strictly
20 ** forbidden.
21 **
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"
24 **
25 ** Commercial non-GPL licensing of this software is possible.
26 ** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27 **
28 ** $Id: drm_dec.c,v 1.9 2007/11/01 12:33:30 menno Exp $
29 **/
30
31 #include <stdlib.h>
32 #include <stdio.h>
33 #include <string.h>
34 #include <math.h>
35 #include "common.h"
36
37 #ifdef DRM
38
39 #include "sbr_dec.h"
40 #include "drm_dec.h"
41 #include "bits.h"
42
43 /* constants */
44 #define DECAY_CUTOFF 3
45 #define DECAY_SLOPE 0.05f
46
47 /* type definitaions */
48 typedef const int8_t (*drm_ps_huff_tab)[2];
49
50
51 /* binary search huffman tables */
52 static const int8_t f_huffman_sa[][2] =
53 {
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 */
68 };
69
70 static const int8_t t_huffman_sa[][2] =
71 {
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 */
86 };
87
88 static const int8_t f_huffman_pan[][2] =
89 {
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 */
118 };
119
120 static const int8_t t_huffman_pan[][2] =
121 {
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 */
150 };
151
152 /* There are 3 classes in the standard but the last 2 are identical */
153 static const real_t sa_quant[8][2] =
154 {
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) },
163 };
164
165 /* We don't need the actual quantizer values */
166 #if 0
167 static const real_t pan_quant[8][5] =
168 {
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) },
177 };
178 #endif
179
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) }
190 };
191
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) }
202 };
203
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) }
214 };
215
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) }
226 };
227
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)
236 };
237
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) }
247 };
248
249 static const uint8_t sa_freq_scale[9] =
250 {
251 0, 1, 2, 3, 5, 7, 10, 13, 23
252 };
253
254 static const uint8_t pan_freq_scale[21] =
255 {
256 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
257 11, 12, 13, 14, 15, 18, 22, 26, 32, 64
258 };
259
260 static const uint8_t pan_quant_class[20] =
261 {
262 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
263 2, 2, 2, 2, 3, 3, 3, 4, 4, 4
264 };
265
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
272 };
273
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,
278 7, 7, 7, 7, 7, 7, 7
279 };
280
281 static const real_t filter_coeff[] =
282 {
283 FRAC_CONST(0.65143905754106),
284 FRAC_CONST(0.56471812200776),
285 FRAC_CONST(0.48954165955695)
286 };
287
288 static const uint8_t delay_length[3] =
289 {
290 3, 4, 5
291 };
292
293 static const real_t delay_fraction[] =
294 {
295 FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347)
296 };
297
298 static const real_t peak_decay = FRAC_CONST(0.76592833836465);
299
300 static const real_t smooth_coeff = FRAC_CONST(0.25);
301
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) } }
368 };
369
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) }
435 };
436
437
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);
442
443
drm_ps_data(drm_ps_info * ps,bitfile * ld)444 uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
445 {
446 uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
447
448 ps->drm_ps_data_available = 1;
449
450 ps->bs_enable_sa = faad_get1bit(ld);
451 ps->bs_enable_pan = faad_get1bit(ld);
452
453 if (ps->bs_enable_sa)
454 {
455 drm_ps_sa_element(ps, ld);
456 }
457
458 if (ps->bs_enable_pan)
459 {
460 drm_ps_pan_element(ps, ld);
461 }
462
463 bits = (uint16_t)faad_get_processed_bits(ld) - bits;
464
465 return bits;
466 }
467
drm_ps_sa_element(drm_ps_info * ps,bitfile * ld)468 static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
469 {
470 drm_ps_huff_tab huff;
471 uint8_t band;
472
473 ps->bs_sa_dt_flag = faad_get1bit(ld);
474 if (ps->bs_sa_dt_flag)
475 {
476 huff = t_huffman_sa;
477 } else {
478 huff = f_huffman_sa;
479 }
480
481 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
482 {
483 ps->bs_sa_data[band] = huff_dec(ld, huff);
484 }
485 }
486
drm_ps_pan_element(drm_ps_info * ps,bitfile * ld)487 static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
488 {
489 drm_ps_huff_tab huff;
490 uint8_t band;
491
492 ps->bs_pan_dt_flag = faad_get1bit(ld);
493 if (ps->bs_pan_dt_flag)
494 {
495 huff = t_huffman_pan;
496 } else {
497 huff = f_huffman_pan;
498 }
499
500 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
501 {
502 ps->bs_pan_data[band] = huff_dec(ld, huff);
503 }
504 }
505
506 /* binary search huffman decoding */
huff_dec(bitfile * ld,drm_ps_huff_tab huff)507 static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
508 {
509 uint8_t bit;
510 int16_t index = 0;
511
512 while (index >= 0)
513 {
514 bit = (uint8_t)faad_get1bit(ld);
515 index = huff[index][bit];
516 }
517
518 return index + 15;
519 }
520
521
sa_delta_clip(drm_ps_info * ps,int8_t i)522 static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
523 {
524 if (i < 0) {
525 /* printf(" SAminclip %d", i); */
526 ps->sa_decode_error = 1;
527 return 0;
528 } else if (i > 7) {
529 /* printf(" SAmaxclip %d", i); */
530 ps->sa_decode_error = 1;
531 return 7;
532 } else
533 return i;
534 }
535
pan_delta_clip(drm_ps_info * ps,int8_t i)536 static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
537 {
538 if (i < -7) {
539 /* printf(" PANminclip %d", i); */
540 ps->pan_decode_error = 1;
541 return -7;
542 } else if (i > 7) {
543 /* printf(" PANmaxclip %d", i); */
544 ps->pan_decode_error = 1;
545 return 7;
546 } else
547 return i;
548 }
549
drm_ps_delta_decode(drm_ps_info * ps)550 static void drm_ps_delta_decode(drm_ps_info *ps)
551 {
552 uint8_t band;
553
554 if (ps->bs_enable_sa)
555 {
556 if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
557 {
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]);
563 } else {
564 /* DF always decodable */
565 ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
566 }
567
568 for (band = 1; band < DRM_NUM_SA_BANDS; band++)
569 {
570 if (ps->bs_sa_dt_flag && ps->g_last_had_sa)
571 {
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]);
575 }
576 }
577 }
578
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;
585 }
586
587
588 if (ps->bs_enable_sa)
589 {
590 if (ps->sa_decode_error) {
591 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
592 {
593 ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
594 }
595 } else {
596 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
597 {
598 ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
599 }
600 }
601 }
602
603 if (ps->bs_enable_pan)
604 {
605 if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
606 {
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]);
610 } else {
611 ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]);
612 }
613
614 for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
615 {
616 if (ps->bs_pan_dt_flag && ps->g_last_had_pan)
617 {
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]);
621 }
622 }
623
624 if (ps->pan_decode_error) {
625 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
626 {
627 ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
628 }
629 } else {
630 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
631 {
632 ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
633 }
634 }
635 }
636 }
637
drm_calc_sa_side_signal(drm_ps_info * ps,qmf_t X[38][64])638 static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64])
639 {
640 uint8_t s, b, k;
641 complex_t qfrac, tmp0, tmp, in, R0;
642 real_t peakdiff;
643 real_t nrg;
644 real_t power;
645 real_t transratio;
646 real_t new_delay_slopes[NUM_OF_LINKS];
647 uint8_t temp_delay_ser[NUM_OF_LINKS];
648 complex_t Phi_Fract;
649 #ifdef FIXED_POINT
650 uint32_t in_re, in_im;
651 #endif
652
653 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
654 {
655 /* set delay indices */
656 for (k = 0; k < NUM_OF_LINKS; k++)
657 temp_delay_ser[k] = ps->delay_buf_index_ser[k];
658
659 RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
660 IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
661
662 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
663 {
664 const real_t gamma = REAL_CONST(1.5);
665 const real_t sigma = REAL_CONST(1.5625);
666
667 RE(in) = QMF_RE(X[s][b]);
668 IM(in) = QMF_IM(X[s][b]);
669
670 #ifdef FIXED_POINT
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
673 */
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;
677 #else
678 power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in));
679 #endif
680
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;
684
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;
688
689 nrg = ps->prev_nrg[b];
690 nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff);
691 ps->prev_nrg[b] = nrg;
692
693 if (MUL_R(peakdiff, gamma) <= nrg) {
694 transratio = sigma;
695 } else {
696 transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
697 }
698
699 for (k = 0; k < NUM_OF_LINKS; k++)
700 {
701 new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
702 }
703
704 RE(tmp0) = RE(ps->d_buff[0][b]);
705 IM(tmp0) = IM(ps->d_buff[0][b]);
706
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]);
709
710 RE(ps->d_buff[1][b]) = RE(in);
711 IM(ps->d_buff[1][b]) = IM(in);
712
713 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
714
715 RE(R0) = RE(tmp);
716 IM(R0) = IM(tmp);
717
718 for (k = 0; k < NUM_OF_LINKS; k++)
719 {
720 RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
721 IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
722
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]);
725
726 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
727
728 RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
729 IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
730
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));
733
734 RE(R0) = RE(tmp);
735 IM(R0) = IM(tmp);
736 }
737
738 QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
739 QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
740
741 for (k = 0; k < NUM_OF_LINKS; k++)
742 {
743 if (++temp_delay_ser[k] >= delay_length[k])
744 temp_delay_ser[k] = 0;
745 }
746 }
747 }
748
749 for (k = 0; k < NUM_OF_LINKS; k++)
750 ps->delay_buf_index_ser[k] = temp_delay_ser[k];
751 }
752
drm_add_ambiance(drm_ps_info * ps,qmf_t X_left[38][64],qmf_t X_right[38][64])753 static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
754 {
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;
758
759 if (ps->bs_enable_sa)
760 {
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++)
764 {
765 const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
766
767 ifreq = sa_inv_freq[b];
768 qclass = (b != 0);
769
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];
772
773 k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
774
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];
777
778 k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
779
780 }
781
782 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
783 {
784 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++)
785 {
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]);
790
791 sa_map[b] += k_sa_map[b];
792 sa_dir_map[b] += k_sa_dir_map[b];
793 }
794 for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++)
795 {
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]);
798 }
799 }
800 }
801 else {
802 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
803 {
804 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
805 {
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]);
808 }
809 }
810 }
811 }
812
drm_add_pan(drm_ps_info * ps,qmf_t X_left[38][64],qmf_t X_right[38][64])813 static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64])
814 {
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;
820
821 if (ps->bs_enable_pan)
822 {
823 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
824 {
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];
829
830 if (ps->g_prev_pan_index[ifreq] >= 0)
831 {
832 pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass];
833 } else {
834 pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass];
835 }
836
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)
840 {
841 if (ps->g_prev_pan_index[ifreq] >= 0)
842 {
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]);
845 } else {
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]);
848 }
849 } else {
850 if (ps->g_prev_pan_index[ifreq] >= 0)
851 {
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]);
854 } else {
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]);
857 }
858 }
859 }
860
861 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
862 {
863 /* PAN always uses all 64 channels */
864 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
865 {
866 tmp = pan_base[b];
867
868 coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
869 coeff1 = MUL_R(coeff2, tmp);
870
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]);
875
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);
880
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]);
884 }
885 }
886 }
887 }
888
drm_ps_init(void)889 drm_ps_info *drm_ps_init(void)
890 {
891 drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info));
892
893 memset(ps, 0, sizeof(drm_ps_info));
894
895 return ps;
896 }
897
drm_ps_free(drm_ps_info * ps)898 void drm_ps_free(drm_ps_info *ps)
899 {
900 faad_free(ps);
901 }
902
903 /* main DRM PS decoding function */
drm_ps_decode(drm_ps_info * ps,uint8_t guess,qmf_t X_left[38][64],qmf_t X_right[38][64])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])
905 {
906 if (ps == NULL)
907 {
908 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
909 return 0;
910 }
911
912 if (!ps->drm_ps_data_available && !guess)
913 {
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));
917 return 0;
918 }
919
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 */
922 if (!guess)
923 {
924 ps->sa_decode_error = 0;
925 ps->pan_decode_error = 0;
926 drm_ps_delta_decode(ps);
927 } else
928 {
929 ps->sa_decode_error = 1;
930 ps->pan_decode_error = 1;
931 /* don't even bother decoding */
932 }
933
934 ps->drm_ps_data_available = 0;
935
936 drm_calc_sa_side_signal(ps, X_left);
937 drm_add_ambiance(ps, X_left, X_right);
938
939 if (ps->bs_enable_sa)
940 {
941 ps->g_last_had_sa = 1;
942
943 memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
944
945 } else {
946 ps->g_last_had_sa = 0;
947 }
948
949 if (ps->bs_enable_pan)
950 {
951 drm_add_pan(ps, X_left, X_right);
952
953 ps->g_last_had_pan = 1;
954
955 memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
956
957 } else {
958 ps->g_last_had_pan = 0;
959 }
960
961
962 return 0;
963 }
964
965 #endif
966