summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/libfaad/drm_dec.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/libfaad/drm_dec.c')
-rw-r--r--lib/rbcodec/codecs/libfaad/drm_dec.c992
1 files changed, 992 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libfaad/drm_dec.c b/lib/rbcodec/codecs/libfaad/drm_dec.c
new file mode 100644
index 0000000000..f0b0f01f2b
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/drm_dec.c
@@ -0,0 +1,992 @@
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.
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** Commercial non-GPL licensing of this software is possible.
23** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
24**
25** $Id$
26**/
27
28#include <stdlib.h>
29#include <stdio.h>
30#include <string.h>
31#include <math.h>
32#include "common.h"
33
34#ifdef DRM
35
36#include "sbr_dec.h"
37#include "drm_dec.h"
38#include "bits.h"
39
40/* constants */
41#define DECAY_CUTOFF 3
42#define DECAY_SLOPE 0.05f
43
44/* type definitions */
45typedef const int8_t (*drm_ps_huff_tab)[2];
46
47
48/* binary search huffman tables */
49static const int8_t f_huffman_sa[][2] =
50{
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 */
65};
66
67static const int8_t t_huffman_sa[][2] =
68{
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 */
83};
84
85static const int8_t f_huffman_pan[][2] =
86{
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 */
115};
116
117static const int8_t t_huffman_pan[][2] =
118{
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 */
147};
148
149/* There are 3 classes in the standard but the last 2 are identical */
150static const real_t sa_quant[8][2] =
151{
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) },
160};
161
162/* We don't need the actual quantizer values */
163#if 0
164static const real_t pan_quant[8][5] =
165{
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) },
174};
175#endif
176
177/* 2^(pan_quant[x][y] */
178static 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) }
187};
188
189/* 2^(-pan_quant[x][y] */
190static 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) }
199};
200
201/* 2^(pan_quant[x][y]/30) */
202static 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) }
211};
212
213/* 2^(-pan_quant[x][y]/30) */
214static 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) }
223};
224
225static 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)
233};
234
235static 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) }
244};
245
246static const uint8_t sa_freq_scale[9][2] =
247{
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}
257};
258
259static const uint8_t pan_freq_scale[21] =
260{
261 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
262 11, 12, 13, 14, 15, 18, 22, 26, 32, 64
263};
264
265static const uint8_t pan_quant_class[20] =
266{
267 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
268 2, 2, 2, 2, 3, 3, 3, 4, 4, 4
269};
270
271/* Inverse mapping lookup */
272static 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
277};
278
279static 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
284};
285
286static const real_t filter_coeff[] =
287{
288 FRAC_CONST(0.65143905754106),
289 FRAC_CONST(0.56471812200776),
290 FRAC_CONST(0.48954165955695)
291};
292
293static const uint8_t delay_length[][2] =
294{
295 { 1, 3 }, { 2, 4 }, { 3, 5 }
296};
297
298static const real_t delay_fraction[] =
299{
300 FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347)
301};
302
303static const real_t peak_decay[2] =
304{
305 FRAC_CONST(0.58664621951003), FRAC_CONST(0.76592833836465)
306};
307
308static const real_t smooth_coeff[2] =
309{
310 FRAC_CONST(0.6), FRAC_CONST(0.25)
311};
312
313/* Please note that these are the same tables as in plain PS */
314static 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) } }
379};
380
381static 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) }
446};
447
448/* static variables */
449static drm_ps_info s_drm_ps_info;
450
451/* static function declarations */
452static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld);
453static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld);
454static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff);
455
456
457uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld)
458{
459 uint16_t bits = (uint16_t)faad_get_processed_bits(ld);
460
461 ps->drm_ps_data_available = 1;
462
463 ps->bs_enable_sa = faad_get1bit(ld);
464 ps->bs_enable_pan = faad_get1bit(ld);
465
466 if (ps->bs_enable_sa)
467 {
468 drm_ps_sa_element(ps, ld);
469 }
470
471 if (ps->bs_enable_pan)
472 {
473 drm_ps_pan_element(ps, ld);
474 }
475
476 bits = (uint16_t)faad_get_processed_bits(ld) - bits;
477
478 return bits;
479}
480
481static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld)
482{
483 drm_ps_huff_tab huff;
484 uint8_t band;
485
486 ps->bs_sa_dt_flag = faad_get1bit(ld);
487 if (ps->bs_sa_dt_flag)
488 {
489 huff = t_huffman_sa;
490 } else {
491 huff = f_huffman_sa;
492 }
493
494 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
495 {
496 ps->bs_sa_data[band] = huff_dec(ld, huff);
497 }
498}
499
500static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld)
501{
502 drm_ps_huff_tab huff;
503 uint8_t band;
504
505 ps->bs_pan_dt_flag = faad_get1bit(ld);
506 if (ps->bs_pan_dt_flag)
507 {
508 huff = t_huffman_pan;
509 } else {
510 huff = f_huffman_pan;
511 }
512
513 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
514 {
515 ps->bs_pan_data[band] = huff_dec(ld, huff);
516 }
517}
518
519/* binary search huffman decoding */
520static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff)
521{
522 uint8_t bit;
523 int16_t index = 0;
524
525 while (index >= 0)
526 {
527 bit = (uint8_t)faad_get1bit(ld);
528 index = huff[index][bit];
529 }
530
531 return index + 15;
532}
533
534
535static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i)
536{
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;
547}
548
549static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i)
550{
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;
561}
562
563static void drm_ps_delta_decode(drm_ps_info *ps)
564{
565 uint8_t band;
566
567 if (ps->bs_enable_sa)
568 {
569 if (ps->bs_sa_dt_flag && !ps->g_last_had_sa)
570 {
571 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
572 {
573 ps->g_prev_sa_index[band] = 0;
574 }
575 }
576 if (ps->bs_sa_dt_flag)
577 {
578 ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
579
580 } else {
581 ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]);
582 }
583
584 for (band = 1; band < DRM_NUM_SA_BANDS; band++)
585 {
586 if (ps->bs_sa_dt_flag)
587 {
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]);
591 }
592 }
593 }
594
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;
601 }
602
603
604 if (ps->bs_enable_sa)
605 {
606 if (ps->sa_decode_error) {
607 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
608 {
609 ps->g_sa_index[band] = ps->g_last_good_sa_index[band];
610 }
611 } else {
612 for (band = 0; band < DRM_NUM_SA_BANDS; band++)
613 {
614 ps->g_last_good_sa_index[band] = ps->g_sa_index[band];
615 }
616 }
617 }
618
619 if (ps->bs_enable_pan)
620 {
621 if (ps->bs_pan_dt_flag && !ps->g_last_had_pan)
622 {
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.
625*/
626 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
627 {
628 ps->g_prev_pan_index[band] = 0;
629 }
630 }
631
632 if (ps->bs_pan_dt_flag)
633 {
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]);
637 }
638
639 for (band = 1; band < DRM_NUM_PAN_BANDS; band++)
640 {
641 if (ps->bs_pan_dt_flag)
642 {
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]);
646 }
647 }
648
649 if (ps->pan_decode_error) {
650 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
651 {
652 ps->g_pan_index[band] = ps->g_last_good_pan_index[band];
653 }
654 } else {
655 for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
656 {
657 ps->g_last_good_pan_index[band] = ps->g_pan_index[band];
658 }
659 }
660 }
661}
662
663static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[MAX_NTSRPS][64], uint8_t rateselect)
664{
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
677
678 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
679 {
680 /* set delay indices */
681 for (k = 0; k < NUM_OF_LINKS; k++)
682 temp_delay_ser[k] = ps->delay_buf_index_ser[k];
683
684 RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]);
685 IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]);
686
687 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
688 {
689 const real_t gamma = REAL_CONST(1.5);
690 const real_t sigma = REAL_CONST(1.5625);
691
692 RE(in) = QMF_RE(X[s][b]);
693 IM(in) = QMF_IM(X[s][b]);
694
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
698 */
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
705
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;
709
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;
713
714 nrg = ps->prev_nrg[b];
715 nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff[rateselect]);
716 ps->prev_nrg[b] = nrg;
717
718 if (MUL_R(peakdiff, gamma) <= nrg) {
719 transratio = sigma;
720 } else {
721 transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma);
722 }
723
724 for (k = 0; k < NUM_OF_LINKS; k++)
725 {
726 new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]);
727 }
728
729 RE(tmp0) = RE(ps->d_buff[0][b]);
730 IM(tmp0) = IM(ps->d_buff[0][b]);
731
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]);
734
735 RE(ps->d_buff[1][b]) = RE(in);
736 IM(ps->d_buff[1][b]) = IM(in);
737
738 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract));
739
740 RE(R0) = RE(tmp);
741 IM(R0) = IM(tmp);
742
743 for (k = 0; k < NUM_OF_LINKS; k++)
744 {
745 RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]);
746 IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]);
747
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]);
750
751 ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac));
752
753 RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0));
754 IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0));
755
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));
758
759 RE(R0) = RE(tmp);
760 IM(R0) = IM(tmp);
761 }
762
763 QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio);
764 QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio);
765
766 for (k = 0; k < NUM_OF_LINKS; k++)
767 {
768 if (++temp_delay_ser[k] >= delay_length[k][rateselect])
769 temp_delay_ser[k] = 0;
770 }
771 }
772 }
773
774 for (k = 0; k < NUM_OF_LINKS; k++)
775 ps->delay_buf_index_ser[k] = temp_delay_ser[k];
776}
777
778static 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])
781{
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;
785
786 if (ps->bs_enable_sa)
787 {
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++)
791 {
792 const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333);
793
794 ifreq = sa_inv_freq[b];
795 qclass = (b != 0);
796
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];
799
800 k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b]));
801
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];
804
805 k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b]));
806
807 }
808
809 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
810 {
811 for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b++)
812 {
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]);
817
818 sa_map[b] += k_sa_map[b];
819 sa_dir_map[b] += k_sa_dir_map[b];
820 }
821 for (b = sa_freq_scale[DRM_NUM_SA_BANDS][rateselect]; b < NUM_OF_QMF_CHANNELS; b++)
822 {
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]);
825 }
826 }
827 }
828 else {
829 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
830 {
831 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
832 {
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]);
835 }
836 }
837 }
838}
839
840static 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])
843{
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;
849
850 if (ps->bs_enable_pan)
851 {
852 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
853 {
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];
858
859 if (ps->g_prev_pan_index[ifreq] >= 0)
860 {
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];
864 }
865
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)
869 {
870 if (ps->g_prev_pan_index[ifreq] >= 0)
871 {
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]);
877 }
878 } else {
879 if (ps->g_prev_pan_index[ifreq] >= 0)
880 {
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]);
886 }
887 }
888 }
889
890 for (s = 0; s < NUM_OF_SUBSAMPLES; s++)
891 {
892 /* PAN always uses all 64 channels */
893 for (b = 0; b < NUM_OF_QMF_CHANNELS; b++)
894 {
895 tmp = pan_base[b];
896
897 coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp));
898 coeff1 = MUL_R(coeff2, tmp);
899
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]);
904
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);
909
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]);
913 }
914 }
915 }
916}
917
918drm_ps_info *drm_ps_init(void)
919{
920 drm_ps_info *ps = &s_drm_ps_info;
921 memset(ps, 0, sizeof(drm_ps_info));
922
923 return ps;
924}
925
926/* main DRM PS decoding function */
927uint8_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])
930{
931 uint8_t rateselect = (samplerate >= 24000);
932
933 if (ps == NULL)
934 {
935 memcpy(X_right, X_left, sizeof(qmf_t)*30*64);
936 return 0;
937 }
938
939 if (!ps->drm_ps_data_available && !guess)
940 {
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;
945 }
946
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)
950 {
951 ps->sa_decode_error = 0;
952 ps->pan_decode_error = 0;
953 drm_ps_delta_decode(ps);
954 } else
955 {
956 ps->sa_decode_error = 1;
957 ps->pan_decode_error = 1;
958 /* don't even bother decoding */
959 }
960
961 ps->drm_ps_data_available = 0;
962
963 drm_calc_sa_side_signal(ps, X_left, rateselect);
964 drm_add_ambiance(ps, rateselect, X_left, X_right);
965
966 if (ps->bs_enable_sa)
967 {
968 ps->g_last_had_sa = 1;
969
970 memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS);
971
972 } else {
973 ps->g_last_had_sa = 0;
974 }
975
976 if (ps->bs_enable_pan)
977 {
978 drm_add_pan(ps, rateselect, X_left, X_right);
979
980 ps->g_last_had_pan = 1;
981
982 memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS);
983
984 } else {
985 ps->g_last_had_pan = 0;
986 }
987
988
989 return 0;
990}
991
992#endif