diff options
Diffstat (limited to 'lib/rbcodec/codecs/libfaad/ps_syntax.c')
-rw-r--r-- | lib/rbcodec/codecs/libfaad/ps_syntax.c | 546 |
1 files changed, 546 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libfaad/ps_syntax.c b/lib/rbcodec/codecs/libfaad/ps_syntax.c new file mode 100644 index 0000000000..290d7e5523 --- /dev/null +++ b/lib/rbcodec/codecs/libfaad/ps_syntax.c | |||
@@ -0,0 +1,546 @@ | |||
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 "common.h" | ||
29 | |||
30 | #ifdef PS_DEC | ||
31 | |||
32 | #include "bits.h" | ||
33 | #include "ps_dec.h" | ||
34 | |||
35 | /* type definitaions */ | ||
36 | typedef const int8_t (*ps_huff_tab)[2]; | ||
37 | |||
38 | /* static data tables */ | ||
39 | static const uint8_t nr_iid_par_tab[] = { | ||
40 | 10, 20, 34, 10, 20, 34, 0, 0 | ||
41 | }; | ||
42 | static const uint8_t nr_ipdopd_par_tab[] = { | ||
43 | 5, 11, 17, 5, 11, 17, 0, 0 | ||
44 | }; | ||
45 | static const uint8_t nr_icc_par_tab[] = { | ||
46 | 10, 20, 34, 10, 20, 34, 0, 0 | ||
47 | }; | ||
48 | static const uint8_t num_env_tab[][4] = { | ||
49 | { 0, 1, 2, 4 }, | ||
50 | { 1, 2, 3, 4 } | ||
51 | }; | ||
52 | |||
53 | /* binary lookup huffman tables */ | ||
54 | static const int8_t f_huff_iid_def[][2] = { | ||
55 | { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ | ||
56 | { 2, 3 }, /* index 1: 2 bits: 1x */ | ||
57 | { /*1*/ -30, /*-1*/ -32 }, /* index 2: 3 bits: 10x */ | ||
58 | { 4, 5 }, /* index 3: 3 bits: 11x */ | ||
59 | { /*2*/ -29, /*-2*/ -33 }, /* index 4: 4 bits: 110x */ | ||
60 | { 6, 7 }, /* index 5: 4 bits: 111x */ | ||
61 | { /*3*/ -28, /*-3*/ -34 }, /* index 6: 5 bits: 1110x */ | ||
62 | { 8, 9 }, /* index 7: 5 bits: 1111x */ | ||
63 | { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 11110x */ | ||
64 | { /*5*/ -26, 10 }, /* index 9: 6 bits: 11111x */ | ||
65 | { /*-5*/ -36, 11 }, /* index 10: 7 bits: 111111x */ | ||
66 | { /*6*/ -25, 12 }, /* index 11: 8 bits: 1111111x */ | ||
67 | { /*-6*/ -37, 13 }, /* index 12: 9 bits: 11111111x */ | ||
68 | { /*-7*/ -38, 14 }, /* index 13: 10 bits: 111111111x */ | ||
69 | { /*7*/ -24, 15 }, /* index 14: 11 bits: 1111111111x */ | ||
70 | { 16, 17 }, /* index 15: 12 bits: 11111111111x */ | ||
71 | { /*8*/ -23, /*-8*/ -39 }, /* index 16: 13 bits: 111111111110x */ | ||
72 | { 18, 19 }, /* index 17: 13 bits: 111111111111x */ | ||
73 | { /*9*/ -22, /*10*/ -21 }, /* index 18: 14 bits: 1111111111110x */ | ||
74 | { 20, 21 }, /* index 19: 14 bits: 1111111111111x */ | ||
75 | { /*-9*/ -40, /*11*/ -20 }, /* index 20: 15 bits: 11111111111110x */ | ||
76 | { 22, 23 }, /* index 21: 15 bits: 11111111111111x */ | ||
77 | { /*-10*/ -41, 24 }, /* index 22: 16 bits: 111111111111110x */ | ||
78 | { 25, 26 }, /* index 23: 16 bits: 111111111111111x */ | ||
79 | { /*-11*/ -42, /*-14*/ -45 }, /* index 24: 17 bits: 1111111111111101x */ | ||
80 | { /*-13*/ -44, /*-12*/ -43 }, /* index 25: 17 bits: 1111111111111110x */ | ||
81 | { /*12*/ -19, 27 }, /* index 26: 17 bits: 1111111111111111x */ | ||
82 | { /*13*/ -18, /*14*/ -17 } /* index 27: 18 bits: 11111111111111111x */ | ||
83 | }; | ||
84 | |||
85 | static const int8_t t_huff_iid_def[][2] = { | ||
86 | { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ | ||
87 | { /*-1*/ -32, 2 }, /* index 1: 2 bits: 1x */ | ||
88 | { /*1*/ -30, 3 }, /* index 2: 3 bits: 11x */ | ||
89 | { /*-2*/ -33, 4 }, /* index 3: 4 bits: 111x */ | ||
90 | { /*2*/ -29, 5 }, /* index 4: 5 bits: 1111x */ | ||
91 | { /*-3*/ -34, 6 }, /* index 5: 6 bits: 11111x */ | ||
92 | { /*3*/ -28, 7 }, /* index 6: 7 bits: 111111x */ | ||
93 | { /*-4*/ -35, 8 }, /* index 7: 8 bits: 1111111x */ | ||
94 | { /*4*/ -27, 9 }, /* index 8: 9 bits: 11111111x */ | ||
95 | { /*-5*/ -36, 10 }, /* index 9: 10 bits: 111111111x */ | ||
96 | { /*5*/ -26, 11 }, /* index 10: 11 bits: 1111111111x */ | ||
97 | { /*-6*/ -37, 12 }, /* index 11: 12 bits: 11111111111x */ | ||
98 | { /*6*/ -25, 13 }, /* index 12: 13 bits: 111111111111x */ | ||
99 | { /*7*/ -24, 14 }, /* index 13: 14 bits: 1111111111111x */ | ||
100 | { /*-7*/ -38, 15 }, /* index 14: 15 bits: 11111111111111x */ | ||
101 | { 16, 17 }, /* index 15: 16 bits: 111111111111111x */ | ||
102 | { /*8*/ -23, /*-8*/ -39 }, /* index 16: 17 bits: 1111111111111110x */ | ||
103 | { 18, 19 }, /* index 17: 17 bits: 1111111111111111x */ | ||
104 | { 20, 21 }, /* index 18: 18 bits: 11111111111111110x */ | ||
105 | { 22, 23 }, /* index 19: 18 bits: 11111111111111111x */ | ||
106 | { /*9*/ -22, /*-14*/ -45 }, /* index 20: 19 bits: 111111111111111100x */ | ||
107 | { /*-13*/ -44, /*-12*/ -43 }, /* index 21: 19 bits: 111111111111111101x */ | ||
108 | { 24, 25 }, /* index 22: 19 bits: 111111111111111110x */ | ||
109 | { 26, 27 }, /* index 23: 19 bits: 111111111111111111x */ | ||
110 | { /*-11*/ -42, /*-10*/ -41 }, /* index 24: 20 bits: 1111111111111111100x */ | ||
111 | { /*-9*/ -40, /*10*/ -21 }, /* index 25: 20 bits: 1111111111111111101x */ | ||
112 | { /*11*/ -20, /*12*/ -19 }, /* index 26: 20 bits: 1111111111111111110x */ | ||
113 | { /*13*/ -18, /*14*/ -17 } /* index 27: 20 bits: 1111111111111111111x */ | ||
114 | }; | ||
115 | |||
116 | static const int8_t f_huff_iid_fine[][2] = { | ||
117 | { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ | ||
118 | { 2, 3 }, /* index 1: 2 bits: 0x */ | ||
119 | { 4, /*-1*/ -32 }, /* index 2: 3 bits: 00x */ | ||
120 | { /*1*/ -30, 5 }, /* index 3: 3 bits: 01x */ | ||
121 | { /*-2*/ -33, /*2*/ -29 }, /* index 4: 4 bits: 000x */ | ||
122 | { 6, 7 }, /* index 5: 4 bits: 011x */ | ||
123 | { /*-3*/ -34, /*3*/ -28 }, /* index 6: 5 bits: 0110x */ | ||
124 | { 8, 9 }, /* index 7: 5 bits: 0111x */ | ||
125 | { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 01110x */ | ||
126 | { 10, 11 }, /* index 9: 6 bits: 01111x */ | ||
127 | { /*-5*/ -36, /*5*/ -26 }, /* index 10: 7 bits: 011110x */ | ||
128 | { 12, 13 }, /* index 11: 7 bits: 011111x */ | ||
129 | { /*-6*/ -37, /*6*/ -25 }, /* index 12: 8 bits: 0111110x */ | ||
130 | { 14, 15 }, /* index 13: 8 bits: 0111111x */ | ||
131 | { /*7*/ -24, 16 }, /* index 14: 9 bits: 01111110x */ | ||
132 | { 17, 18 }, /* index 15: 9 bits: 01111111x */ | ||
133 | { 19, /*-8*/ -39 }, /* index 16: 10 bits: 011111101x */ | ||
134 | { /*8*/ -23, 20 }, /* index 17: 10 bits: 011111110x */ | ||
135 | { 21, /*-7*/ -38 }, /* index 18: 10 bits: 011111111x */ | ||
136 | { /*10*/ -21, 22 }, /* index 19: 11 bits: 0111111010x */ | ||
137 | { 23, /*-9*/ -40 }, /* index 20: 11 bits: 0111111101x */ | ||
138 | { /*9*/ -22, 24 }, /* index 21: 11 bits: 0111111110x */ | ||
139 | { /*-11*/ -42, /*11*/ -20 }, /* index 22: 12 bits: 01111110101x */ | ||
140 | { 25, 26 }, /* index 23: 12 bits: 01111111010x */ | ||
141 | { 27, /*-10*/ -41 }, /* index 24: 12 bits: 01111111101x */ | ||
142 | { 28, /*-12*/ -43 }, /* index 25: 13 bits: 011111110100x */ | ||
143 | { /*12*/ -19, 29 }, /* index 26: 13 bits: 011111110101x */ | ||
144 | { 30, 31 }, /* index 27: 13 bits: 011111111010x */ | ||
145 | { 32, /*-14*/ -45 }, /* index 28: 14 bits: 0111111101000x */ | ||
146 | { /*14*/ -17, 33 }, /* index 29: 14 bits: 0111111101011x */ | ||
147 | { 34, /*-13*/ -44 }, /* index 30: 14 bits: 0111111110100x */ | ||
148 | { /*13*/ -18, 35 }, /* index 31: 14 bits: 0111111110101x */ | ||
149 | { 36, 37 }, /* index 32: 15 bits: 01111111010000x */ | ||
150 | { 38, /*-15*/ -46 }, /* index 33: 15 bits: 01111111010111x */ | ||
151 | { /*15*/ -16, 39 }, /* index 34: 15 bits: 01111111101000x */ | ||
152 | { 40, 41 }, /* index 35: 15 bits: 01111111101011x */ | ||
153 | { 42, 43 }, /* index 36: 16 bits: 011111110100000x */ | ||
154 | { /*-17*/ -48, /*17*/ -14 }, /* index 37: 16 bits: 011111110100001x */ | ||
155 | { 44, 45 }, /* index 38: 16 bits: 011111110101110x */ | ||
156 | { 46, 47 }, /* index 39: 16 bits: 011111111010001x */ | ||
157 | { 48, 49 }, /* index 40: 16 bits: 011111111010110x */ | ||
158 | { /*-16*/ -47, /*16*/ -15 }, /* index 41: 16 bits: 011111111010111x */ | ||
159 | { /*-21*/ -52, /*21*/ -10 }, /* index 42: 17 bits: 0111111101000000x */ | ||
160 | { /*-19*/ -50, /*19*/ -12 }, /* index 43: 17 bits: 0111111101000001x */ | ||
161 | { /*-18*/ -49, /*18*/ -13 }, /* index 44: 17 bits: 0111111101011100x */ | ||
162 | { 50, 51 }, /* index 45: 17 bits: 0111111101011101x */ | ||
163 | { 52, 53 }, /* index 46: 17 bits: 0111111110100010x */ | ||
164 | { 54, 55 }, /* index 47: 17 bits: 0111111110100011x */ | ||
165 | { 56, 57 }, /* index 48: 17 bits: 0111111110101100x */ | ||
166 | { 58, 59 }, /* index 49: 17 bits: 0111111110101101x */ | ||
167 | { /*-26*/ -57, /*-25*/ -56 }, /* index 50: 18 bits: 01111111010111010x */ | ||
168 | { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 18 bits: 01111111010111011x */ | ||
169 | { /*-22*/ -53, /*22*/ -9 }, /* index 52: 18 bits: 01111111101000100x */ | ||
170 | { /*-24*/ -55, /*-23*/ -54 }, /* index 53: 18 bits: 01111111101000101x */ | ||
171 | { /*25*/ -6, /*26*/ -5 }, /* index 54: 18 bits: 01111111101000110x */ | ||
172 | { /*23*/ -8, /*24*/ -7 }, /* index 55: 18 bits: 01111111101000111x */ | ||
173 | { /*29*/ -2, /*30*/ -1 }, /* index 56: 18 bits: 01111111101011000x */ | ||
174 | { /*27*/ -4, /*28*/ -3 }, /* index 57: 18 bits: 01111111101011001x */ | ||
175 | { /*-30*/ -61, /*-29*/ -60 }, /* index 58: 18 bits: 01111111101011010x */ | ||
176 | { /*-20*/ -51, /*20*/ -11 } /* index 59: 18 bits: 01111111101011011x */ | ||
177 | }; | ||
178 | |||
179 | static const int8_t t_huff_iid_fine[][2] = { | ||
180 | { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ | ||
181 | { /*1*/ -30, 2 }, /* index 1: 2 bits: 0x */ | ||
182 | { 3, /*-1*/ -32 }, /* index 2: 3 bits: 01x */ | ||
183 | { 4, 5 }, /* index 3: 4 bits: 010x */ | ||
184 | { 6, 7 }, /* index 4: 5 bits: 0100x */ | ||
185 | { /*-2*/ -33, /*2*/ -29 }, /* index 5: 5 bits: 0101x */ | ||
186 | { 8, /*-3*/ -34 }, /* index 6: 6 bits: 01000x */ | ||
187 | { /*3*/ -28, 9 }, /* index 7: 6 bits: 01001x */ | ||
188 | { /*-4*/ -35, /*4*/ -27 }, /* index 8: 7 bits: 010000x */ | ||
189 | { 10, 11 }, /* index 9: 7 bits: 010011x */ | ||
190 | { /*5*/ -26, 12 }, /* index 10: 8 bits: 0100110x */ | ||
191 | { 13, 14 }, /* index 11: 8 bits: 0100111x */ | ||
192 | { /*-6*/ -37, /*6*/ -25 }, /* index 12: 9 bits: 01001101x */ | ||
193 | { 15, 16 }, /* index 13: 9 bits: 01001110x */ | ||
194 | { 17, /*-5*/ -36 }, /* index 14: 9 bits: 01001111x */ | ||
195 | { 18, /*-7*/ -38 }, /* index 15: 10 bits: 010011100x */ | ||
196 | { /*7*/ -24, 19 }, /* index 16: 10 bits: 010011101x */ | ||
197 | { 20, 21 }, /* index 17: 10 bits: 010011110x */ | ||
198 | { /*9*/ -22, 22 }, /* index 18: 11 bits: 0100111000x */ | ||
199 | { 23, 24 }, /* index 19: 11 bits: 0100111011x */ | ||
200 | { /*-8*/ -39, /*8*/ -23 }, /* index 20: 11 bits: 0100111100x */ | ||
201 | { 25, 26 }, /* index 21: 11 bits: 0100111101x */ | ||
202 | { /*11*/ -20, 27 }, /* index 22: 12 bits: 01001110001x */ | ||
203 | { 28, 29 }, /* index 23: 12 bits: 01001110110x */ | ||
204 | { /*-10*/ -41, /*10*/ -21 }, /* index 24: 12 bits: 01001110111x */ | ||
205 | { 30, 31 }, /* index 25: 12 bits: 01001111010x */ | ||
206 | { 32, /*-9*/ -40 }, /* index 26: 12 bits: 01001111011x */ | ||
207 | { 33, /*-13*/ -44 }, /* index 27: 13 bits: 010011100011x */ | ||
208 | { /*13*/ -18, 34 }, /* index 28: 13 bits: 010011101100x */ | ||
209 | { 35, 36 }, /* index 29: 13 bits: 010011101101x */ | ||
210 | { 37, /*-12*/ -43 }, /* index 30: 13 bits: 010011110100x */ | ||
211 | { /*12*/ -19, 38 }, /* index 31: 13 bits: 010011110101x */ | ||
212 | { 39, /*-11*/ -42 }, /* index 32: 13 bits: 010011110110x */ | ||
213 | { 40, 41 }, /* index 33: 14 bits: 0100111000110x */ | ||
214 | { 42, 43 }, /* index 34: 14 bits: 0100111011001x */ | ||
215 | { 44, 45 }, /* index 35: 14 bits: 0100111011010x */ | ||
216 | { 46, /*-15*/ -46 }, /* index 36: 14 bits: 0100111011011x */ | ||
217 | { /*15*/ -16, 47 }, /* index 37: 14 bits: 0100111101000x */ | ||
218 | { /*-14*/ -45, /*14*/ -17 }, /* index 38: 14 bits: 0100111101011x */ | ||
219 | { 48, 49 }, /* index 39: 14 bits: 0100111101100x */ | ||
220 | { /*-21*/ -52, /*-20*/ -51 }, /* index 40: 15 bits: 01001110001100x */ | ||
221 | { /*18*/ -13, /*19*/ -12 }, /* index 41: 15 bits: 01001110001101x */ | ||
222 | { /*-19*/ -50, /*-18*/ -49 }, /* index 42: 15 bits: 01001110110010x */ | ||
223 | { 50, 51 }, /* index 43: 15 bits: 01001110110011x */ | ||
224 | { 52, 53 }, /* index 44: 15 bits: 01001110110100x */ | ||
225 | { 54, 55 }, /* index 45: 15 bits: 01001110110101x */ | ||
226 | { 56, /*-17*/ -48 }, /* index 46: 15 bits: 01001110110110x */ | ||
227 | { /*17*/ -14, 57 }, /* index 47: 15 bits: 01001111010001x */ | ||
228 | { 58, /*-16*/ -47 }, /* index 48: 15 bits: 01001111011000x */ | ||
229 | { /*16*/ -15, 59 }, /* index 49: 15 bits: 01001111011001x */ | ||
230 | { /*-26*/ -57, /*26*/ -5 }, /* index 50: 16 bits: 010011101100110x */ | ||
231 | { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 16 bits: 010011101100111x */ | ||
232 | { /*29*/ -2, /*30*/ -1 }, /* index 52: 16 bits: 010011101101000x */ | ||
233 | { /*27*/ -4, /*28*/ -3 }, /* index 53: 16 bits: 010011101101001x */ | ||
234 | { /*-30*/ -61, /*-29*/ -60 }, /* index 54: 16 bits: 010011101101010x */ | ||
235 | { /*-25*/ -56, /*25*/ -6 }, /* index 55: 16 bits: 010011101101011x */ | ||
236 | { /*-24*/ -55, /*24*/ -7 }, /* index 56: 16 bits: 010011101101100x */ | ||
237 | { /*-23*/ -54, /*23*/ -8 }, /* index 57: 16 bits: 010011110100011x */ | ||
238 | { /*-22*/ -53, /*22*/ -9 }, /* index 58: 16 bits: 010011110110000x */ | ||
239 | { /*20*/ -11, /*21*/ -10 } /* index 59: 16 bits: 010011110110011x */ | ||
240 | }; | ||
241 | |||
242 | static const int8_t f_huff_icc[][2] = { | ||
243 | { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ | ||
244 | { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ | ||
245 | { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ | ||
246 | { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ | ||
247 | { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ | ||
248 | { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ | ||
249 | { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ | ||
250 | { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ | ||
251 | { /*5*/ -26, 9 }, /* index 8: 9 bits: 11111111x */ | ||
252 | { /*-4*/ -35, 10 }, /* index 9: 10 bits: 111111111x */ | ||
253 | { /*6*/ -25, 11 }, /* index 10: 11 bits: 1111111111x */ | ||
254 | { /*-5*/ -36, 12 }, /* index 11: 12 bits: 11111111111x */ | ||
255 | { /*7*/ -24, 13 }, /* index 12: 13 bits: 111111111111x */ | ||
256 | { /*-6*/ -37, /*-7*/ -38 } /* index 13: 14 bits: 1111111111111x */ | ||
257 | }; | ||
258 | |||
259 | static const int8_t t_huff_icc[][2] = { | ||
260 | { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ | ||
261 | { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ | ||
262 | { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ | ||
263 | { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ | ||
264 | { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ | ||
265 | { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ | ||
266 | { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ | ||
267 | { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ | ||
268 | { /*-4*/ -35, 9 }, /* index 8: 9 bits: 11111111x */ | ||
269 | { /*5*/ -26, 10 }, /* index 9: 10 bits: 111111111x */ | ||
270 | { /*-5*/ -36, 11 }, /* index 10: 11 bits: 1111111111x */ | ||
271 | { /*6*/ -25, 12 }, /* index 11: 12 bits: 11111111111x */ | ||
272 | { /*-6*/ -37, 13 }, /* index 12: 13 bits: 111111111111x */ | ||
273 | { /*-7*/ -38, /*7*/ -24 } /* index 13: 14 bits: 1111111111111x */ | ||
274 | }; | ||
275 | |||
276 | static const int8_t f_huff_ipd[][2] = { | ||
277 | { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ | ||
278 | { 2, 3 }, /* index 1: 2 bits: 0x */ | ||
279 | { /*1*/ -30, 4 }, /* index 2: 3 bits: 00x */ | ||
280 | { 5, 6 }, /* index 3: 3 bits: 01x */ | ||
281 | { /*4*/ -27, /*5*/ -26 }, /* index 4: 4 bits: 001x */ | ||
282 | { /*3*/ -28, /*6*/ -25 }, /* index 5: 4 bits: 010x */ | ||
283 | { /*2*/ -29, /*7*/ -24 } /* index 6: 4 bits: 011x */ | ||
284 | }; | ||
285 | |||
286 | static const int8_t t_huff_ipd[][2] = { | ||
287 | { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ | ||
288 | { 2, 3 }, /* index 1: 2 bits: 0x */ | ||
289 | { 4, 5 }, /* index 2: 3 bits: 00x */ | ||
290 | { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ | ||
291 | { /*5*/ -26, 6 }, /* index 4: 4 bits: 000x */ | ||
292 | { /*2*/ -29, /*6*/ -25 }, /* index 5: 4 bits: 001x */ | ||
293 | { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0001x */ | ||
294 | }; | ||
295 | |||
296 | static const int8_t f_huff_opd[][2] = { | ||
297 | { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ | ||
298 | { 2, 3 }, /* index 1: 2 bits: 0x */ | ||
299 | { /*7*/ -24, /*1*/ -30 }, /* index 2: 3 bits: 00x */ | ||
300 | { 4, 5 }, /* index 3: 3 bits: 01x */ | ||
301 | { /*3*/ -28, /*6*/ -25 }, /* index 4: 4 bits: 010x */ | ||
302 | { /*2*/ -29, 6 }, /* index 5: 4 bits: 011x */ | ||
303 | { /*5*/ -26, /*4*/ -27 } /* index 6: 5 bits: 0111x */ | ||
304 | }; | ||
305 | |||
306 | static const int8_t t_huff_opd[][2] = { | ||
307 | { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ | ||
308 | { 2, 3 }, /* index 1: 2 bits: 0x */ | ||
309 | { 4, 5 }, /* index 2: 3 bits: 00x */ | ||
310 | { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ | ||
311 | { /*5*/ -26, 6 }, /* index 4: 4 bits: 000x */ | ||
312 | { /*2*/ -29, /*6*/ -25 }, /* index 5: 4 bits: 001x */ | ||
313 | { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0001x */ | ||
314 | }; | ||
315 | |||
316 | /* static function declarations */ | ||
317 | static uint16_t ps_extension(ps_info *ps, bitfile *ld, | ||
318 | const uint8_t ps_extension_id, | ||
319 | const uint16_t num_bits_left); | ||
320 | static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, | ||
321 | ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par); | ||
322 | static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff); | ||
323 | |||
324 | |||
325 | uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header) | ||
326 | { | ||
327 | uint8_t tmp, n; | ||
328 | uint16_t bits = (uint16_t)faad_get_processed_bits(ld); | ||
329 | |||
330 | *header = 0; | ||
331 | |||
332 | /* check for new PS header */ | ||
333 | if (faad_get1bit(ld | ||
334 | DEBUGVAR(1,1000,"ps_data(): enable_ps_header"))) | ||
335 | { | ||
336 | *header = 1; | ||
337 | |||
338 | ps->header_read = 1; | ||
339 | |||
340 | ps->use34hybrid_bands = 0; | ||
341 | |||
342 | /* Inter-channel Intensity Difference (IID) parameters enabled */ | ||
343 | ps->enable_iid = (uint8_t)faad_get1bit(ld | ||
344 | DEBUGVAR(1,1001,"ps_data(): enable_iid")); | ||
345 | |||
346 | if (ps->enable_iid) | ||
347 | { | ||
348 | ps->iid_mode = (uint8_t)faad_getbits(ld, 3 | ||
349 | DEBUGVAR(1,1002,"ps_data(): iid_mode")); | ||
350 | |||
351 | ps->nr_iid_par = nr_iid_par_tab[ps->iid_mode]; | ||
352 | ps->nr_ipdopd_par = nr_ipdopd_par_tab[ps->iid_mode]; | ||
353 | |||
354 | if (ps->iid_mode == 2 || ps->iid_mode == 5) | ||
355 | ps->use34hybrid_bands = 1; | ||
356 | |||
357 | /* IPD freq res equal to IID freq res */ | ||
358 | ps->ipd_mode = ps->iid_mode; | ||
359 | } | ||
360 | |||
361 | /* Inter-channel Coherence (ICC) parameters enabled */ | ||
362 | ps->enable_icc = (uint8_t)faad_get1bit(ld | ||
363 | DEBUGVAR(1,1003,"ps_data(): enable_icc")); | ||
364 | |||
365 | if (ps->enable_icc) | ||
366 | { | ||
367 | ps->icc_mode = (uint8_t)faad_getbits(ld, 3 | ||
368 | DEBUGVAR(1,1004,"ps_data(): icc_mode")); | ||
369 | |||
370 | ps->nr_icc_par = nr_icc_par_tab[ps->icc_mode]; | ||
371 | |||
372 | if (ps->icc_mode == 2 || ps->icc_mode == 5) | ||
373 | ps->use34hybrid_bands = 1; | ||
374 | } | ||
375 | |||
376 | /* PS extension layer enabled */ | ||
377 | ps->enable_ext = (uint8_t)faad_get1bit(ld | ||
378 | DEBUGVAR(1,1005,"ps_data(): enable_ext")); | ||
379 | } | ||
380 | |||
381 | /* we are here, but no header has been read yet */ | ||
382 | if (ps->header_read == 0) | ||
383 | return 1; | ||
384 | |||
385 | ps->frame_class = (uint8_t)faad_get1bit(ld | ||
386 | DEBUGVAR(1,1006,"ps_data(): frame_class")); | ||
387 | tmp = (uint8_t)faad_getbits(ld, 2 | ||
388 | DEBUGVAR(1,1007,"ps_data(): num_env_idx")); | ||
389 | |||
390 | ps->num_env = num_env_tab[ps->frame_class][tmp]; | ||
391 | |||
392 | if (ps->frame_class) | ||
393 | { | ||
394 | for (n = 1; n < ps->num_env+1; n++) | ||
395 | { | ||
396 | ps->border_position[n] = (uint8_t)faad_getbits(ld, 5 | ||
397 | DEBUGVAR(1,1008,"ps_data(): border_position")); | ||
398 | } | ||
399 | } | ||
400 | |||
401 | if (ps->enable_iid) | ||
402 | { | ||
403 | for (n = 0; n < ps->num_env; n++) | ||
404 | { | ||
405 | ps->iid_dt[n] = (uint8_t)faad_get1bit(ld | ||
406 | DEBUGVAR(1,1009,"ps_data(): iid_dt")); | ||
407 | |||
408 | /* iid_data */ | ||
409 | if (ps->iid_mode < 3) | ||
410 | { | ||
411 | huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_def, | ||
412 | f_huff_iid_def, ps->iid_index[n]); | ||
413 | } else { | ||
414 | huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_fine, | ||
415 | f_huff_iid_fine, ps->iid_index[n]); | ||
416 | } | ||
417 | } | ||
418 | } | ||
419 | |||
420 | if (ps->enable_icc) | ||
421 | { | ||
422 | for (n = 0; n < ps->num_env; n++) | ||
423 | { | ||
424 | ps->icc_dt[n] = (uint8_t)faad_get1bit(ld | ||
425 | DEBUGVAR(1,1010,"ps_data(): icc_dt")); | ||
426 | |||
427 | /* icc_data */ | ||
428 | huff_data(ld, ps->icc_dt[n], ps->nr_icc_par, t_huff_icc, | ||
429 | f_huff_icc, ps->icc_index[n]); | ||
430 | } | ||
431 | } | ||
432 | |||
433 | if (ps->enable_ext) | ||
434 | { | ||
435 | uint16_t num_bits_left; | ||
436 | uint16_t cnt = (uint16_t)faad_getbits(ld, 4 | ||
437 | DEBUGVAR(1,1011,"ps_data(): ps_extension_size")); | ||
438 | if (cnt == 15) | ||
439 | { | ||
440 | cnt += (uint16_t)faad_getbits(ld, 8 | ||
441 | DEBUGVAR(1,1012,"ps_data(): esc_count")); | ||
442 | } | ||
443 | |||
444 | num_bits_left = 8 * cnt; | ||
445 | while (num_bits_left > 7) | ||
446 | { | ||
447 | uint8_t ps_extension_id = (uint8_t)faad_getbits(ld, 2 | ||
448 | DEBUGVAR(1,1013,"ps_data(): ps_extension_size")); | ||
449 | |||
450 | num_bits_left -= 2; | ||
451 | num_bits_left -= ps_extension(ps, ld, ps_extension_id, num_bits_left); | ||
452 | } | ||
453 | |||
454 | faad_getbits(ld, num_bits_left | ||
455 | DEBUGVAR(1,1014,"ps_data(): fill_bits")); | ||
456 | } | ||
457 | |||
458 | bits = (uint16_t)faad_get_processed_bits(ld) - bits; | ||
459 | |||
460 | ps->ps_data_available = 1; | ||
461 | |||
462 | return bits; | ||
463 | } | ||
464 | |||
465 | static uint16_t ps_extension(ps_info *ps, bitfile *ld, | ||
466 | const uint8_t ps_extension_id, | ||
467 | const uint16_t num_bits_left) | ||
468 | { | ||
469 | uint8_t n; | ||
470 | uint16_t bits = (uint16_t)faad_get_processed_bits(ld); | ||
471 | |||
472 | (void)num_bits_left; | ||
473 | if (ps_extension_id == 0) | ||
474 | { | ||
475 | ps->enable_ipdopd = (uint8_t)faad_get1bit(ld | ||
476 | DEBUGVAR(1,1015,"ps_extension(): enable_ipdopd")); | ||
477 | |||
478 | if (ps->enable_ipdopd) | ||
479 | { | ||
480 | for (n = 0; n < ps->num_env; n++) | ||
481 | { | ||
482 | ps->ipd_dt[n] = (uint8_t)faad_get1bit(ld | ||
483 | DEBUGVAR(1,1016,"ps_extension(): ipd_dt")); | ||
484 | |||
485 | /* ipd_data */ | ||
486 | huff_data(ld, ps->ipd_dt[n], ps->nr_ipdopd_par, t_huff_ipd, | ||
487 | f_huff_ipd, ps->ipd_index[n]); | ||
488 | |||
489 | ps->opd_dt[n] = (uint8_t)faad_get1bit(ld | ||
490 | DEBUGVAR(1,1017,"ps_extension(): opd_dt")); | ||
491 | |||
492 | /* opd_data */ | ||
493 | huff_data(ld, ps->opd_dt[n], ps->nr_ipdopd_par, t_huff_opd, | ||
494 | f_huff_opd, ps->opd_index[n]); | ||
495 | } | ||
496 | } | ||
497 | faad_get1bit(ld | ||
498 | DEBUGVAR(1,1018,"ps_extension(): reserved_ps")); | ||
499 | } | ||
500 | |||
501 | /* return number of bits read */ | ||
502 | bits = (uint16_t)faad_get_processed_bits(ld) - bits; | ||
503 | |||
504 | return bits; | ||
505 | } | ||
506 | |||
507 | /* read huffman data coded in either the frequency or the time direction */ | ||
508 | static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, | ||
509 | ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par) | ||
510 | { | ||
511 | uint8_t n; | ||
512 | |||
513 | if (dt) | ||
514 | { | ||
515 | /* coded in time direction */ | ||
516 | for (n = 0; n < nr_par; n++) | ||
517 | { | ||
518 | par[n] = ps_huff_dec(ld, t_huff); | ||
519 | } | ||
520 | } else { | ||
521 | /* coded in frequency direction */ | ||
522 | par[0] = ps_huff_dec(ld, f_huff); | ||
523 | |||
524 | for (n = 1; n < nr_par; n++) | ||
525 | { | ||
526 | par[n] = ps_huff_dec(ld, f_huff); | ||
527 | } | ||
528 | } | ||
529 | } | ||
530 | |||
531 | /* binary search huffman decoding */ | ||
532 | static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff) | ||
533 | { | ||
534 | uint8_t bit; | ||
535 | int16_t index = 0; | ||
536 | |||
537 | while (index >= 0) | ||
538 | { | ||
539 | bit = (uint8_t)faad_get1bit(ld); | ||
540 | index = t_huff[index][bit]; | ||
541 | } | ||
542 | |||
543 | return index + 31; | ||
544 | } | ||
545 | |||
546 | #endif | ||