diff options
author | Sean Bartell <wingedtachikoma@gmail.com> | 2011-06-25 21:32:25 -0400 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2012-04-25 22:13:20 +0200 |
commit | f40bfc9267b13b54e6379dfe7539447662879d24 (patch) | |
tree | 9b20069d5e62809ff434061ad730096836f916f2 /lib/rbcodec/codecs/libfaad/drm_dec.c | |
parent | a0009907de7a0107d49040d8a180f140e2eff299 (diff) | |
download | rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.gz rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.zip |
Add codecs to librbcodec.
Change-Id: Id7f4717d51ed02d67cb9f9cb3c0ada4a81843f97
Reviewed-on: http://gerrit.rockbox.org/137
Reviewed-by: Nils Wallménius <nils@rockbox.org>
Tested-by: Nils Wallménius <nils@rockbox.org>
Diffstat (limited to 'lib/rbcodec/codecs/libfaad/drm_dec.c')
-rw-r--r-- | lib/rbcodec/codecs/libfaad/drm_dec.c | 992 |
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 */ | ||
45 | typedef const int8_t (*drm_ps_huff_tab)[2]; | ||
46 | |||
47 | |||
48 | /* binary search huffman tables */ | ||
49 | static 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 | |||
67 | static 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 | |||
85 | static 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 | |||
117 | static 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 */ | ||
150 | static 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 | ||
164 | static 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] */ | ||
178 | static const real_t pan_pow_2_pos[8][5] = { | ||
179 | { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000) }, | ||
180 | { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312) }, | ||
181 | { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016) }, | ||
182 | { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565) }, | ||
183 | { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337) }, | ||
184 | { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994) }, | ||
185 | { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876) }, | ||
186 | { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140) } | ||
187 | }; | ||
188 | |||
189 | /* 2^(-pan_quant[x][y] */ | ||
190 | static const real_t pan_pow_2_neg[8][5] = { | ||
191 | { REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1) }, | ||
192 | { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242) }, | ||
193 | { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344) }, | ||
194 | { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199) }, | ||
195 | { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336) }, | ||
196 | { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266) }, | ||
197 | { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107) }, | ||
198 | { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825) } | ||
199 | }; | ||
200 | |||
201 | /* 2^(pan_quant[x][y]/30) */ | ||
202 | static const real_t pan_pow_2_30_pos[8][5] = { | ||
203 | { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, | ||
204 | { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) }, | ||
205 | { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933), COEF_CONST(1.019373909), COEF_CONST(1.019373909) }, | ||
206 | { COEF_CONST(1.011579706), COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) }, | ||
207 | { COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) }, | ||
208 | { COEF_CONST(1.019373909), COEF_CONST(1.03117796), COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263) }, | ||
209 | { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) }, | ||
210 | { COEF_CONST(1.03117796), COEF_CONST(1.055195268), COEF_CONST(1.0839263), COEF_CONST(1.113439626), COEF_CONST(1.143756546) } | ||
211 | }; | ||
212 | |||
213 | /* 2^(-pan_quant[x][y]/30) */ | ||
214 | static const real_t pan_pow_2_30_neg[8][5] = { | ||
215 | { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, | ||
216 | { COEF_CONST(0.99616963), COEF_CONST(0.99616963), COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393) }, | ||
217 | { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) }, | ||
218 | { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) }, | ||
219 | { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) }, | ||
220 | { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) }, | ||
221 | { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) }, | ||
222 | { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) } | ||
223 | }; | ||
224 | |||
225 | static const real_t g_decayslope[MAX_SA_BAND] = { | ||
226 | FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8), | ||
227 | FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5), FRAC_CONST(0.45), | ||
228 | FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1), | ||
229 | FRAC_CONST(0.05),FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), | ||
230 | FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), | ||
231 | FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), | ||
232 | FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0) | ||
233 | }; | ||
234 | |||
235 | static const real_t sa_sqrt_1_minus[8][2] = { | ||
236 | { FRAC_CONST(1), FRAC_CONST(1) }, | ||
237 | { FRAC_CONST(0.998744206), FRAC_CONST(0.984066644) }, | ||
238 | { FRAC_CONST(0.997504707), FRAC_CONST(0.959473168) }, | ||
239 | { FRAC_CONST(0.995037562), FRAC_CONST(0.894683804) }, | ||
240 | { FRAC_CONST(0.990165638), FRAC_CONST(0.826933317) }, | ||
241 | { FRAC_CONST(0.980663811), FRAC_CONST(0.706312672) }, | ||
242 | { FRAC_CONST(0.962494836), FRAC_CONST(0.45341406) }, | ||
243 | { FRAC_CONST(0.929071574), FRAC_CONST(0) } | ||
244 | }; | ||
245 | |||
246 | static 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 | |||
259 | static 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 | |||
265 | static 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 */ | ||
272 | static const uint8_t pan_inv_freq[64] = { | ||
273 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | ||
274 | 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, | ||
275 | 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, | ||
276 | 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 | ||
277 | }; | ||
278 | |||
279 | static const uint8_t sa_inv_freq[MAX_SA_BAND] = { | ||
280 | 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, | ||
281 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
282 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
283 | 7, 7, 7, 7, 7, 7, 7 | ||
284 | }; | ||
285 | |||
286 | static const real_t filter_coeff[] = | ||
287 | { | ||
288 | FRAC_CONST(0.65143905754106), | ||
289 | FRAC_CONST(0.56471812200776), | ||
290 | FRAC_CONST(0.48954165955695) | ||
291 | }; | ||
292 | |||
293 | static const uint8_t delay_length[][2] = | ||
294 | { | ||
295 | { 1, 3 }, { 2, 4 }, { 3, 5 } | ||
296 | }; | ||
297 | |||
298 | static const real_t delay_fraction[] = | ||
299 | { | ||
300 | FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347) | ||
301 | }; | ||
302 | |||
303 | static const real_t peak_decay[2] = | ||
304 | { | ||
305 | FRAC_CONST(0.58664621951003), FRAC_CONST(0.76592833836465) | ||
306 | }; | ||
307 | |||
308 | static 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 */ | ||
314 | static const complex_t Q_Fract_allpass_Qmf[][3] = { | ||
315 | { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, | ||
316 | { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, | ||
317 | { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, | ||
318 | { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, | ||
319 | { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, | ||
320 | { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, | ||
321 | { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, | ||
322 | { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, | ||
323 | { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, | ||
324 | { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, | ||
325 | { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, | ||
326 | { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, | ||
327 | { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, | ||
328 | { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, | ||
329 | { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, | ||
330 | { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, | ||
331 | { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, | ||
332 | { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, | ||
333 | { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, | ||
334 | { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, | ||
335 | { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, | ||
336 | { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, | ||
337 | { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, | ||
338 | { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, | ||
339 | { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, | ||
340 | { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, | ||
341 | { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, | ||
342 | { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, | ||
343 | { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, | ||
344 | { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, | ||
345 | { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, | ||
346 | { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, | ||
347 | { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, | ||
348 | { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, | ||
349 | { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, | ||
350 | { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, | ||
351 | { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, | ||
352 | { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, | ||
353 | { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, | ||
354 | { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, | ||
355 | { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, | ||
356 | { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, | ||
357 | { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, | ||
358 | { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, | ||
359 | { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, | ||
360 | { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, | ||
361 | { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, | ||
362 | { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, | ||
363 | { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, | ||
364 | { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, | ||
365 | { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, | ||
366 | { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, | ||
367 | { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, | ||
368 | { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, | ||
369 | { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, | ||
370 | { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, | ||
371 | { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, | ||
372 | { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, | ||
373 | { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, | ||
374 | { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, | ||
375 | { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, | ||
376 | { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, | ||
377 | { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, | ||
378 | { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } | ||
379 | }; | ||
380 | |||
381 | static const complex_t Phi_Fract_Qmf[] = { | ||
382 | { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, | ||
383 | { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, | ||
384 | { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, | ||
385 | { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, | ||
386 | { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, | ||
387 | { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, | ||
388 | { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, | ||
389 | { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, | ||
390 | { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, | ||
391 | { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, | ||
392 | { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, | ||
393 | { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, | ||
394 | { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, | ||
395 | { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, | ||
396 | { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, | ||
397 | { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, | ||
398 | { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, | ||
399 | { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, | ||
400 | { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, | ||
401 | { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, | ||
402 | { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, | ||
403 | { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, | ||
404 | { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, | ||
405 | { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, | ||
406 | { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, | ||
407 | { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, | ||
408 | { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, | ||
409 | { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, | ||
410 | { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, | ||
411 | { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, | ||
412 | { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, | ||
413 | { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, | ||
414 | { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, | ||
415 | { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, | ||
416 | { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, | ||
417 | { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, | ||
418 | { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, | ||
419 | { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, | ||
420 | { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, | ||
421 | { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, | ||
422 | { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, | ||
423 | { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, | ||
424 | { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, | ||
425 | { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, | ||
426 | { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, | ||
427 | { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, | ||
428 | { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, | ||
429 | { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, | ||
430 | { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, | ||
431 | { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, | ||
432 | { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, | ||
433 | { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, | ||
434 | { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, | ||
435 | { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, | ||
436 | { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, | ||
437 | { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, | ||
438 | { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, | ||
439 | { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, | ||
440 | { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, | ||
441 | { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, | ||
442 | { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, | ||
443 | { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, | ||
444 | { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, | ||
445 | { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } | ||
446 | }; | ||
447 | |||
448 | /* static variables */ | ||
449 | static drm_ps_info s_drm_ps_info; | ||
450 | |||
451 | /* static function declarations */ | ||
452 | static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld); | ||
453 | static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld); | ||
454 | static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff); | ||
455 | |||
456 | |||
457 | uint16_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 | |||
481 | static 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 | |||
500 | static 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 */ | ||
520 | static 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 | |||
535 | static 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 | |||
549 | static 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 | |||
563 | static 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 | |||
663 | static 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 | |||
778 | static void drm_add_ambiance(drm_ps_info *ps, uint8_t rateselect, | ||
779 | qmf_t X_left[MAX_NTSRPS][64], | ||
780 | qmf_t X_right[MAX_NTSRPS][64]) | ||
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 | |||
840 | static void drm_add_pan(drm_ps_info *ps, uint8_t rateselect, | ||
841 | qmf_t X_left[MAX_NTSRPS][64], | ||
842 | qmf_t X_right[MAX_NTSRPS][64]) | ||
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 | |||
918 | drm_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 */ | ||
927 | uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate, | ||
928 | qmf_t X_left[MAX_NTSRPS][64], | ||
929 | qmf_t X_right[MAX_NTSRPS][64]) | ||
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 | ||