/src/libxaac/decoder/ixheaacd_mps_parse.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2018 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | #include <math.h> |
21 | | #include "ixheaac_type_def.h" |
22 | | #include "ixheaac_constants.h" |
23 | | #include "ixheaacd_bitbuffer.h" |
24 | | #include "ixheaacd_common_rom.h" |
25 | | #include "ixheaacd_sbrdecsettings.h" |
26 | | #include "ixheaacd_sbr_scale.h" |
27 | | #include "ixheaacd_env_extr_part.h" |
28 | | #include "ixheaacd_sbr_rom.h" |
29 | | #include "ixheaacd_hybrid.h" |
30 | | #include "ixheaacd_ps_dec.h" |
31 | | #include "ixheaacd_config.h" |
32 | | #include "ixheaacd_qmf_dec.h" |
33 | | #include "ixheaacd_audioobjtypes.h" |
34 | | #include "ixheaacd_mps_polyphase.h" |
35 | | #include "ixheaacd_mps_struct_def.h" |
36 | | #include "ixheaacd_mps_res_rom.h" |
37 | | #include "ixheaacd_mps_defines.h" |
38 | | #include "ixheaacd_mps_aac_struct.h" |
39 | | #include "ixheaacd_mps_dec.h" |
40 | | #include "ixheaacd_mps_nlc_dec.h" |
41 | | #include "ixheaac_error_standards.h" |
42 | | |
43 | | static const WORD32 ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4}; |
44 | | |
45 | | static const WORD32 ixheaacd_freq_res_table_ld[] = {0, 23, 15, 12, 9, 7, 5, 4}; |
46 | | |
47 | | static const WORD32 |
48 | | ixheaacd_hybrid_band_71_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] = { |
49 | | 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
50 | | 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
51 | | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; |
52 | | |
53 | | static const WORD32 |
54 | | ixheaacd_hybrid_band_71_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] = { |
55 | | 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, |
56 | | 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, |
57 | | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; |
58 | | |
59 | | static const WORD32 |
60 | | ixheaacd_hybrid_band_71_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] = { |
61 | | 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, |
62 | | 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, |
63 | | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; |
64 | | |
65 | | static const WORD32 |
66 | | ixheaacd_hybrid_band_71_to_processing_band_10_map[MAX_HYBRID_BANDS_MPS] = { |
67 | | 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, |
68 | | 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, |
69 | | 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; |
70 | | |
71 | | static const WORD32 |
72 | | ixheaacd_hybrid_band_71_to_processing_band_14_map[MAX_HYBRID_BANDS_MPS] = { |
73 | | 0, 0, 0, 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, |
74 | | 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, |
75 | | 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, |
76 | | 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}; |
77 | | |
78 | | const WORD32 |
79 | | ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS] = { |
80 | | 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, |
81 | | 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, |
82 | | 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, |
83 | | 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}; |
84 | | |
85 | | const WORD32 |
86 | | ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS] = { |
87 | | 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
88 | | 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, |
89 | | 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, |
90 | | 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}; |
91 | | |
92 | | const WORD32 |
93 | | ixheaacd_hybrid_band_64_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] = |
94 | | {0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
95 | | 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
96 | | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
97 | | 3, 3, 3, 3, 3}; |
98 | | |
99 | | const WORD32 |
100 | | ixheaacd_hybrid_band_64_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] = |
101 | | {0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
102 | | 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, |
103 | | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, |
104 | | 4, 4, 4, 4, 4}; |
105 | | |
106 | | const WORD32 |
107 | | ixheaacd_hybrid_band_64_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] = |
108 | | {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, |
109 | | 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, |
110 | | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, |
111 | | 6, 6, 6, 6, 6}; |
112 | | |
113 | | const WORD32 |
114 | | ixheaacd_hybrid_band_64_to_processing_band_9_map[MAX_HYBRID_BANDS_MPS] = |
115 | | {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, |
116 | | 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, |
117 | | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, |
118 | | 8, 8, 8, 8, 8}; |
119 | | |
120 | | const WORD32 |
121 | | ixheaacd_hybrid_band_64_to_processing_band_12_map[MAX_HYBRID_BANDS_MPS] = |
122 | | {0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, |
123 | | 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, |
124 | | 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, |
125 | | 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, |
126 | | 11, 11, 11, 11, 11, 11, 11}; |
127 | | |
128 | | const WORD32 |
129 | | ixheaacd_hybrid_band_64_to_processing_band_15_map[MAX_HYBRID_BANDS_MPS] = |
130 | | {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 10, 10, 11, 11, |
131 | | 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, |
132 | | 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, |
133 | | 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, |
134 | | 14, 14, 14, 14, 14, 14, 14}; |
135 | | |
136 | | const WORD32 |
137 | | ixheaacd_hybrid_band_64_to_processing_band_23_map[MAX_HYBRID_BANDS_MPS] = |
138 | | {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13, |
139 | | 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, |
140 | | 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, |
141 | | 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, |
142 | | 22, 22, 22, 22, 22, 22, 22}; |
143 | | |
144 | | static const FLOAT32 ixheaacd_mps_clip_gain_table[] = { |
145 | | 1.000000f, 1.189207f, 1.414213f, 1.681792f, |
146 | | 2.000000f, 2.378414f, 2.828427f, 4.000000f}; |
147 | | |
148 | | static const WORD32 ixheaacd_mps_stride_table[] = {1, 2, 5, 28}; |
149 | | |
150 | | static const FLOAT32 ixheaacd_cld_de_quant_table[] = { |
151 | | -150.0, -45.0, -40.0, -35.0, -30.0, -25.0, -22.0, -19.0, |
152 | | -16.0, -13.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0, |
153 | | 2.0, 4.0, 6.0, 8.0, 10.0, 13.0, 16.0, 19.0, |
154 | | 22.0, 25.0, 30.0, 35.0, 40.0, 45.0, 150.0}; |
155 | | |
156 | | static const FLOAT32 ixheaacd_icc_de_quant_table[] = { |
157 | | 1.0000f, 0.9370f, 0.84118f, 0.60092f, 0.36764f, 0.0f, -0.5890f, -0.9900f}; |
158 | | |
159 | | const FLOAT32 ixheaacd_ipd_de_quant_table[] = { |
160 | | 0.f, 0.392699082f, 0.785398163f, 1.178097245f, |
161 | | 1.570796327f, 1.963495408f, 2.35619449f, 2.748893572f, |
162 | | 3.141592654f, 3.534291735f, 3.926990817f, 4.319689899f, |
163 | | 4.71238898f, 5.105088062f, 5.497787144f, 5.890486225f}; |
164 | | const WORD32 ixheaacd_ipd_de_quant_table_q28[] = { |
165 | | 0, 105414360, 210828720, 316243072, 421657440, 527071776, |
166 | | 632486144, 737900480, 843314880, 948729216, 1054143552, 1159557888, |
167 | | 1264972288, 1370386688, 1475800960, 1581215360}; |
168 | | static const WORD32 ixheaacd_smoothing_time_table[] = {64, 128, 256, 512}; |
169 | | |
170 | | static const FLOAT32 ixheaacd_inverse_smoothing_time_table[] = { |
171 | | 1.0f / 64.0f, 1.0f / 128.0f, 1.0f / 256.0f, 1.0f / 512.0f}; |
172 | | |
173 | 3.18M | static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) { |
174 | 3.18M | var = min(var, upper_bound); |
175 | 3.18M | var = max(var, lower_bound); |
176 | 3.18M | return var; |
177 | 3.18M | } |
178 | | |
179 | | static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b, |
180 | 1.08M | UWORD16 d[], WORD32 len) { |
181 | 1.08M | WORD32 k; |
182 | 1.08M | UWORD32 tmp; |
183 | 1.08M | UWORD32 b0 = (UWORD32)b; |
184 | | |
185 | 1.08M | tmp = ((UWORD32)a[0]) * b0; |
186 | 1.08M | d[0] = (UWORD16)tmp; |
187 | | |
188 | 5.43M | for (k = 1; k < len; k++) { |
189 | 4.34M | tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0; |
190 | 4.34M | d[k] = (UWORD16)tmp; |
191 | 4.34M | } |
192 | 1.08M | } |
193 | | |
194 | | static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a, |
195 | 1.08M | UWORD16 d[], UWORD16 *pr, WORD32 len) { |
196 | 1.08M | UWORD32 r; |
197 | 1.08M | UWORD32 tmp; |
198 | 1.08M | UWORD32 temp; |
199 | 1.08M | WORD32 k; |
200 | | |
201 | 1.08M | if (a == 0) |
202 | 0 | return; |
203 | | |
204 | 1.08M | r = 0; |
205 | | |
206 | 6.52M | for (k = len - 1; k >= 0; k--) { |
207 | 5.43M | tmp = ((UWORD32)b[k]) + (r << 16); |
208 | | |
209 | 5.43M | if (tmp) { |
210 | 1.70M | d[k] = (UWORD16)(tmp / a); |
211 | 1.70M | temp = d[k] * a; |
212 | 1.70M | r = tmp - temp; |
213 | 3.72M | } else { |
214 | 3.72M | d[k] = 0; |
215 | 3.72M | } |
216 | 5.43M | } |
217 | 1.08M | *pr = (UWORD16)r; |
218 | 1.08M | } |
219 | | |
220 | | static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena, |
221 | 66.9k | WORD32 lenb) { |
222 | 66.9k | WORD32 h; |
223 | 66.9k | WORD32 carry = 0; |
224 | | |
225 | 66.9k | if (lenb > lena) |
226 | 0 | return; |
227 | | |
228 | 334k | for (h = 0; h < lenb; h++) { |
229 | 267k | carry = carry + (WORD32)(a[h] - b[h]); |
230 | 267k | a[h] = (UWORD16)carry; |
231 | 267k | carry = carry >> 16; |
232 | 267k | } |
233 | | |
234 | 66.9k | for (; h < lena; h++) { |
235 | 0 | carry = ((UWORD32)a[h]) + carry; |
236 | 0 | a[h] = (UWORD16)carry; |
237 | 0 | carry = carry >> 16; |
238 | 0 | } |
239 | | |
240 | 66.9k | if (carry != 0) |
241 | 0 | return; |
242 | 66.9k | return; |
243 | 66.9k | } |
244 | | |
245 | | static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[], |
246 | 346k | WORD32 len) { |
247 | 346k | WORD32 i; |
248 | | |
249 | 1.27M | for (i = len - 1; i > 0; i--) { |
250 | 1.02M | if (a[i] != b[i]) break; |
251 | 1.02M | } |
252 | 346k | return (a[i] >= b[i]) ? 1 : 0; |
253 | 346k | } |
254 | | |
255 | | static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type, |
256 | 42.4k | WORD32 band_start, WORD32 ixheaacd_num_bands) { |
257 | 42.4k | WORD32 i; |
258 | | |
259 | 622k | for (i = band_start; i < band_start + ixheaacd_num_bands; i++) { |
260 | 579k | data[i] <<= 1; |
261 | 579k | } |
262 | | |
263 | 42.4k | if (data_type == CLD) { |
264 | 132k | for (i = band_start; i < band_start + ixheaacd_num_bands; i++) { |
265 | 123k | if (data[i] == -14) |
266 | 19.3k | data[i] = -15; |
267 | 104k | else if (data[i] == 14) |
268 | 5.06k | data[i] = 15; |
269 | 123k | } |
270 | 9.28k | } |
271 | 42.4k | } |
272 | | |
273 | 10.9k | static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) { |
274 | 10.9k | WORD32 i; |
275 | | |
276 | 124k | for (i = 0; i < ixheaacd_num_bands; i++) { |
277 | 113k | data[i] /= 2; |
278 | 113k | } |
279 | 10.9k | } |
280 | | |
281 | | static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start, |
282 | 32.5k | WORD32 band_stop, WORD32 *strides) { |
283 | 32.5k | WORD32 i, pb, ch_fac, data_bands, start_offset; |
284 | | |
285 | 32.5k | ch_fac = ixheaacd_mps_stride_table[freq_res_stride]; |
286 | 32.5k | data_bands = (band_stop - band_start - 1) / ch_fac + 1; |
287 | | |
288 | 32.5k | strides[0] = band_start; |
289 | 267k | for (pb = 1; pb <= data_bands; pb++) { |
290 | 234k | strides[pb] = strides[pb - 1] + ch_fac; |
291 | 234k | } |
292 | 32.5k | start_offset = 0; |
293 | 181k | while (strides[data_bands] > band_stop) { |
294 | 148k | if (start_offset < data_bands) |
295 | 12.6k | start_offset++; |
296 | 135k | else |
297 | 135k | start_offset = 1; |
298 | | |
299 | 310k | for (i = start_offset; i <= data_bands; i++) { |
300 | 162k | strides[i]--; |
301 | 162k | } |
302 | 148k | } |
303 | | |
304 | 32.5k | return data_bands; |
305 | 32.5k | } |
306 | | |
307 | | static IA_ERRORCODE ixheaacd_mps_ecdata_decoding( |
308 | | ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream, |
309 | 232k | WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) { |
310 | 232k | WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx; |
311 | 232k | WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0}; |
312 | 232k | WORD32 band_stop = 0; |
313 | | |
314 | 232k | WORD32 *lastdata = NULL; |
315 | 232k | ia_mps_data_struct *frame_xxx_data = NULL; |
316 | 232k | WORD32 default_val = 0; |
317 | 232k | IA_ERRORCODE err = IA_NO_ERROR; |
318 | | |
319 | 232k | ia_mps_bs_frame *frame = &(self->bs_frame); |
320 | | |
321 | 232k | if (datatype == 0) { |
322 | 108k | frame_xxx_data = &frame->cld_data; |
323 | 108k | lastdata = frame->cmp_cld_idx_prev; |
324 | 108k | band_stop = self->bs_param_bands; |
325 | 123k | } else if (datatype == 1) { |
326 | 108k | frame_xxx_data = &frame->icc_data; |
327 | 108k | lastdata = frame->cmp_icc_idx_prev; |
328 | 108k | band_stop = self->bs_param_bands; |
329 | 108k | } else if (datatype == 2) { |
330 | 15.1k | frame_xxx_data = &frame->ipd_data; |
331 | 15.1k | lastdata = frame->ipd_idx_data_prev; |
332 | 15.1k | band_stop = self->num_bands_ipd; |
333 | 15.1k | } else { |
334 | 0 | frame_xxx_data = &frame->cld_data; |
335 | 0 | lastdata = frame->cmp_cld_idx_prev; |
336 | 0 | band_stop = self->bs_param_bands; |
337 | 0 | } |
338 | | |
339 | 508k | for (i = 0; i < self->num_parameter_sets; i++) { |
340 | 275k | frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2); |
341 | 275k | } |
342 | | |
343 | 232k | set_index = 0; |
344 | 232k | bs_data_pair = 0; |
345 | 232k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev; |
346 | | |
347 | 508k | for (i = 0; i < self->num_parameter_sets; i++) { |
348 | 275k | if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { |
349 | 2.20M | for (pb = 0; pb < band_stop; pb++) { |
350 | 2.02M | lastdata[pb] = default_val; |
351 | 2.02M | } |
352 | | |
353 | 179k | old_quant_coarse_xxx = 0; |
354 | 179k | } |
355 | | |
356 | 275k | if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { |
357 | 25.5k | if (bs_data_pair) { |
358 | 945 | bs_data_pair = 0; |
359 | 24.5k | } else { |
360 | 24.5k | bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1); |
361 | 24.5k | frame_xxx_data->bs_quant_coarse_xxx[set_index] = |
362 | 24.5k | ixheaacd_read_bits_buf(bitstream, 1); |
363 | 24.5k | frame_xxx_data->bs_freq_res_stride_xxx[set_index] = |
364 | 24.5k | ixheaacd_read_bits_buf(bitstream, 2); |
365 | | |
366 | 24.5k | if (frame_xxx_data->bs_quant_coarse_xxx[set_index] != |
367 | 24.5k | old_quant_coarse_xxx) { |
368 | 6.78k | if (old_quant_coarse_xxx) { |
369 | 876 | ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0); |
370 | 5.91k | } else { |
371 | 5.91k | ixheaacd_mps_fine2coarse(lastdata, band_stop); |
372 | 5.91k | } |
373 | 6.78k | } |
374 | | |
375 | 24.5k | data_bands = ixheaacd_mps_getstridemap( |
376 | 24.5k | frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop, |
377 | 24.5k | strides); |
378 | | |
379 | 225k | for (pb = 0; pb < data_bands; pb++) { |
380 | 200k | lastdata[pb] = lastdata[strides[pb]]; |
381 | 200k | } |
382 | | |
383 | 24.5k | err = ixheaacd_mps_ecdatapairdec( |
384 | 24.5k | bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair, |
385 | 24.5k | frame_xxx_data->bs_quant_coarse_xxx[set_index], |
386 | 24.5k | !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag); |
387 | 24.5k | if (err) return err; |
388 | | |
389 | 224k | for (pb = 0; pb < data_bands; pb++) { |
390 | 513k | for (j = strides[pb]; j < strides[pb + 1]; j++) { |
391 | 313k | if (datatype == IPD) { |
392 | 68.4k | if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) { |
393 | 32.9k | lastdata[j] = data[set_index + bs_data_pair][pb] & 7; |
394 | 35.4k | } else { |
395 | 35.4k | lastdata[j] = data[set_index + bs_data_pair][pb] & 15; |
396 | 35.4k | } |
397 | 244k | } else { |
398 | 244k | lastdata[j] = data[set_index + bs_data_pair][pb]; |
399 | 244k | } |
400 | 313k | } |
401 | 200k | } |
402 | | |
403 | 24.5k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
404 | | |
405 | 24.5k | if (bs_data_pair) { |
406 | 9.63k | frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] = |
407 | 9.63k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
408 | 9.63k | frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] = |
409 | 9.63k | frame_xxx_data->bs_freq_res_stride_xxx[set_index]; |
410 | 9.63k | } |
411 | 24.5k | set_index += bs_data_pair + 1; |
412 | 24.5k | } |
413 | 25.5k | } |
414 | 275k | } |
415 | 232k | return err; |
416 | 232k | } |
417 | | |
418 | | IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, |
419 | | WORD32 usac_independency_flag, |
420 | 108k | ia_bit_buf_struct *bitstream) { |
421 | 108k | WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch; |
422 | 108k | WORD32 ps, pg, ts, pb; |
423 | 108k | WORD32 env_shape_data[MAX_TIME_SLOTS]; |
424 | | |
425 | 108k | WORD32 bits_param_slot = 0; |
426 | | |
427 | 108k | ia_mps_bs_frame *frame = &(self->bs_frame); |
428 | 108k | IA_ERRORCODE err = IA_NO_ERROR; |
429 | | |
430 | 108k | if (self->parse_nxt_frame == 0) return IA_NO_ERROR; |
431 | | |
432 | 108k | self->num_parameter_sets_prev = self->num_parameter_sets; |
433 | | |
434 | 108k | if (self->bs_high_rate_mode) { |
435 | 28.8k | bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1); |
436 | 28.8k | self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1; |
437 | 80.0k | } else { |
438 | 80.0k | bs_frame_type = 0; |
439 | 80.0k | self->num_parameter_sets = 1; |
440 | 80.0k | } |
441 | | |
442 | 108k | if (self->time_slots == 32) |
443 | 93.4k | bits_param_slot = 5; |
444 | 15.4k | else if (self->time_slots == 64) |
445 | 15.4k | bits_param_slot = 6; |
446 | | |
447 | 108k | if (bs_frame_type) { |
448 | 3.01k | WORD32 prev_param_slot = -1; |
449 | 6.18k | for (i = 0; i < self->num_parameter_sets; i++) { |
450 | 3.24k | self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot); |
451 | | |
452 | 3.24k | if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) { |
453 | 75 | return IA_FATAL_ERROR; |
454 | 75 | } |
455 | 3.17k | prev_param_slot = self->param_slots[i]; |
456 | 3.17k | } |
457 | 105k | } else { |
458 | 231k | for (i = 0; i < self->num_parameter_sets; i++) { |
459 | 125k | self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) / |
460 | 125k | self->num_parameter_sets) - |
461 | 125k | 1; |
462 | 125k | } |
463 | 105k | } |
464 | | |
465 | 108k | if (!usac_independency_flag) { |
466 | 106k | frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1); |
467 | 106k | } else { |
468 | 2.53k | frame->independency_flag = 1; |
469 | 2.53k | } |
470 | | |
471 | 108k | err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD); |
472 | 108k | if (err) return err; |
473 | | |
474 | 108k | err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC); |
475 | 108k | if (err) return err; |
476 | | |
477 | 108k | if (self->config->bs_phase_coding) { |
478 | 82.9k | self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1); |
479 | | |
480 | 82.9k | if (!self->bs_phase_mode) { |
481 | 1.02M | for (pb = 0; pb < self->num_bands_ipd; pb++) { |
482 | 954k | frame->ipd_idx_data_prev[pb] = 0; |
483 | 2.13M | for (i = 0; i < self->num_parameter_sets; i++) { |
484 | 1.17M | frame->ipd_idx_data[i][pb] = 0; |
485 | 1.17M | self->bs_frame.ipd_idx[i][pb] = 0; |
486 | 1.17M | } |
487 | 954k | self->bs_frame.ipd_idx_prev[pb] = 0; |
488 | 954k | } |
489 | 67.7k | self->opd_smoothing_mode = 0; |
490 | 67.7k | } else { |
491 | 15.1k | self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1); |
492 | 15.1k | err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data, |
493 | 15.1k | IPD); |
494 | 15.1k | if (err) return err; |
495 | 15.1k | } |
496 | 82.9k | } |
497 | | |
498 | 25.9k | else { |
499 | 25.9k | self->bs_phase_mode = 0; |
500 | 186k | for (pb = 0; pb < self->num_bands_ipd; pb++) { |
501 | 160k | frame->ipd_idx_data_prev[pb] = 0; |
502 | 372k | for (i = 0; i < self->num_parameter_sets; i++) { |
503 | 212k | frame->ipd_idx_data[i][pb] = 0; |
504 | 212k | self->bs_frame.ipd_idx[i][pb] = 0; |
505 | 212k | } |
506 | 160k | self->bs_frame.ipd_idx_prev[pb] = 0; |
507 | 160k | } |
508 | 25.9k | self->opd_smoothing_mode = 0; |
509 | 25.9k | } |
510 | | |
511 | 108k | if (self->bs_high_rate_mode) { |
512 | 76.8k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
513 | 48.1k | frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2); |
514 | 48.1k | if (frame->bs_smooth_mode[ps] >= 2) { |
515 | 9.68k | frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2); |
516 | 9.68k | } |
517 | 48.1k | if (frame->bs_smooth_mode[ps] == 3) { |
518 | 1.46k | frame->bs_freq_res_stride_smg[ps] = |
519 | 1.46k | ixheaacd_read_bits_buf(bitstream, 2); |
520 | 1.46k | data_bands = |
521 | 1.46k | (self->bs_param_bands - 1) / |
522 | 1.46k | ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] + |
523 | 1.46k | 1; |
524 | 13.2k | for (pg = 0; pg < data_bands; pg++) { |
525 | 11.7k | frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1); |
526 | 11.7k | } |
527 | 1.46k | } |
528 | 48.1k | } |
529 | 80.1k | } else { |
530 | 160k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
531 | 80.0k | frame->bs_smooth_mode[ps] = 0; |
532 | 80.0k | } |
533 | 80.1k | } |
534 | | |
535 | 326k | for (i = 0; i < 2; i++) { |
536 | 217k | self->temp_shape_enable_ch_stp[i] = 0; |
537 | 217k | self->temp_shape_enable_ch_ges[i] = 0; |
538 | 217k | } |
539 | | |
540 | 108k | self->bs_tsd_enable = 0; |
541 | 108k | if (self->config->bs_temp_shape_config == 3) { |
542 | 49.1k | self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1); |
543 | 59.6k | } else if (self->config->bs_temp_shape_config != 0) { |
544 | 33.4k | bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1); |
545 | 33.4k | if (bs_temp_shape_enable) { |
546 | 5.74k | num_of_temp_shape_ch = 2; |
547 | 5.74k | switch (self->config->bs_temp_shape_config) { |
548 | 2.13k | case 1: |
549 | 6.38k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
550 | 4.25k | self->temp_shape_enable_ch_stp[i] = |
551 | 4.25k | ixheaacd_read_bits_buf(bitstream, 1); |
552 | 4.25k | } |
553 | 2.13k | break; |
554 | 3.61k | case 2: |
555 | 10.8k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
556 | 7.22k | self->temp_shape_enable_ch_ges[i] = |
557 | 7.22k | ixheaacd_read_bits_buf(bitstream, 1); |
558 | 7.22k | } |
559 | 10.8k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
560 | 7.19k | if (self->temp_shape_enable_ch_ges[i]) { |
561 | 3.46k | ixheaacd_mps_huff_decode(bitstream, env_shape_data, |
562 | 3.46k | self->time_slots); |
563 | 120k | for (ts = 0; ts < self->time_slots; ts++) { |
564 | 117k | self->env_shape_data[i][ts] = (FLOAT32)pow( |
565 | 117k | 2, (FLOAT32)env_shape_data[ts] / |
566 | 117k | (self->config->bs_env_quant_mode + 2) - |
567 | 117k | 1); |
568 | 117k | } |
569 | 3.46k | } |
570 | 7.19k | } |
571 | 3.61k | break; |
572 | 0 | default: |
573 | 0 | return -1; |
574 | 5.74k | } |
575 | 5.74k | } |
576 | 33.4k | } |
577 | | |
578 | 108k | if (self->bs_tsd_enable) { |
579 | 9.88k | UWORD16 s[4]; |
580 | 9.88k | UWORD64 s_64; |
581 | 9.88k | UWORD16 c[5]; |
582 | 9.88k | UWORD64 c_64; |
583 | 9.88k | UWORD16 b; |
584 | 9.88k | UWORD16 r[1]; |
585 | 9.88k | static const UWORD16 table_64[] = { |
586 | 9.88k | 6, 11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49, |
587 | 9.88k | 51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61}; |
588 | 9.88k | static const UWORD16 table_32[] = {5, 9, 13, 16, 18, 20, 22, 24, |
589 | 9.88k | 25, 26, 27, 28, 29, 29, 30, 30}; |
590 | 9.88k | unsigned const short *tab = NULL; |
591 | 9.88k | WORD32 k; |
592 | 9.88k | UWORD16 h; |
593 | 9.88k | WORD32 nbits_tr_slots = 0; |
594 | | |
595 | 9.88k | if (self->time_slots == 32) { |
596 | 6.38k | nbits_tr_slots = 4; |
597 | 6.38k | tab = table_32; |
598 | 6.38k | } else if (self->time_slots == 64) { |
599 | 3.50k | nbits_tr_slots = 5; |
600 | 3.50k | tab = table_64; |
601 | 3.50k | } |
602 | | |
603 | 9.88k | self->tsd_num_tr_slots = ixheaacd_read_bits_buf(bitstream, nbits_tr_slots); |
604 | 9.88k | self->tsd_num_tr_slots++; |
605 | 9.88k | self->tsd_codeword_len = tab[self->tsd_num_tr_slots - 1]; |
606 | | |
607 | 9.88k | if (self->tsd_codeword_len > 48) { |
608 | 108 | s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48); |
609 | 108 | s_64 = s[3]; |
610 | 108 | s[2] = ixheaacd_read_bits_buf(bitstream, 16); |
611 | 108 | s_64 = (s_64 << 16) | s[2]; |
612 | 108 | s[1] = ixheaacd_read_bits_buf(bitstream, 16); |
613 | 108 | s_64 = (s_64 << 16) | s[1]; |
614 | 108 | s[0] = ixheaacd_read_bits_buf(bitstream, 16); |
615 | 108 | s_64 = (s_64 << 16) | s[0]; |
616 | 9.77k | } else if (self->tsd_codeword_len > 32) { |
617 | 1.55k | s[3] = 0; |
618 | 1.55k | s_64 = s[3]; |
619 | 1.55k | s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32); |
620 | 1.55k | s_64 = (s_64 << 16) | s[2]; |
621 | 1.55k | s[1] = ixheaacd_read_bits_buf(bitstream, 16); |
622 | 1.55k | s_64 = (s_64 << 16) | s[1]; |
623 | 1.55k | s[0] = ixheaacd_read_bits_buf(bitstream, 16); |
624 | 1.55k | s_64 = (s_64 << 16) | s[0]; |
625 | 8.22k | } else if (self->tsd_codeword_len > 16) { |
626 | 4.09k | s[3] = 0; |
627 | 4.09k | s_64 = s[3]; |
628 | 4.09k | s[2] = 0; |
629 | 4.09k | s_64 = (s_64 << 16) | s[2]; |
630 | 4.09k | s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16); |
631 | 4.09k | s_64 = (s_64 << 16) | s[1]; |
632 | 4.09k | s[0] = ixheaacd_read_bits_buf(bitstream, 16); |
633 | 4.09k | s_64 = (s_64 << 16) | s[0]; |
634 | 4.13k | } else { |
635 | 4.13k | s[3] = 0; |
636 | 4.13k | s_64 = s[3]; |
637 | 4.13k | s[2] = 0; |
638 | 4.13k | s_64 = (s_64 << 16) | s[2]; |
639 | 4.13k | s[1] = 0; |
640 | 4.13k | s_64 = (s_64 << 16) | s[1]; |
641 | 4.13k | s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len); |
642 | 4.13k | s_64 = (s_64 << 16) | s[0]; |
643 | 4.13k | } |
644 | | |
645 | 9.88k | { |
646 | 9.88k | WORD32 p = self->tsd_num_tr_slots; |
647 | | |
648 | 438k | for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0; |
649 | | |
650 | 347k | for (k = self->time_slots - 1; k >= 0; k--) { |
651 | 347k | if (p > k) { |
652 | 2.96k | for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1; |
653 | 919 | break; |
654 | 919 | } |
655 | | |
656 | 346k | c[0] = k - p + 1; |
657 | 346k | c_64 = c[0]; |
658 | 1.73M | for (i = 1; i < 5; i++) c[i] = 0; |
659 | | |
660 | 1.43M | for (h = 2; h <= p; h++) { |
661 | 1.08M | b = k - p + h; |
662 | 1.08M | c_64 = c_64 * (b / h); |
663 | 1.08M | ixheaacd_longmult1(c, b, c, 5); |
664 | 1.08M | b = h; |
665 | 1.08M | ixheaacd_longdiv(c, b, c, r, 5); |
666 | 1.08M | } |
667 | | |
668 | 346k | if (ixheaacd_longcompare(s, c, 4)) { |
669 | 66.9k | ixheaacd_longsub(s, c, 4, 4); |
670 | 66.9k | self->bs_tsd_sep_data[k] = 1; |
671 | 66.9k | p--; |
672 | 66.9k | if (p == 0) break; |
673 | 66.9k | } |
674 | 346k | } |
675 | 9.88k | } |
676 | | |
677 | 437k | for (i = 0; i < self->time_slots; i++) { |
678 | 427k | if (self->bs_tsd_sep_data[i]) |
679 | 68.8k | self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3); |
680 | 427k | } |
681 | 9.88k | } |
682 | | |
683 | 108k | self->parse_nxt_frame = 0; |
684 | 108k | return err; |
685 | 108k | } |
686 | | |
687 | | static VOID ixheaacd_ld_mps_ecdata_decoding( |
688 | | ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff, |
689 | | WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype, |
690 | 20.5k | WORD32 start_band) { |
691 | 20.5k | WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx; |
692 | 20.5k | WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0}; |
693 | 20.5k | WORD32 band_stop = 0; |
694 | | |
695 | 20.5k | WORD32 *lastdata = NULL; |
696 | 20.5k | ia_mps_data_struct *frame_xxx_data = NULL; |
697 | 20.5k | WORD32 default_val = 0; |
698 | | |
699 | 20.5k | ia_mps_bs_frame *frame = &(self->bs_frame); |
700 | | |
701 | 20.5k | if (datatype == CLD) { |
702 | 15.5k | frame_xxx_data = &frame->cld_data; |
703 | 15.5k | lastdata = frame->cmp_cld_idx_prev; |
704 | 15.5k | band_stop = self->bs_param_bands; |
705 | 15.5k | } else if (datatype == ICC) { |
706 | 5.03k | frame_xxx_data = &frame->icc_data; |
707 | 5.03k | lastdata = frame->cmp_icc_idx_prev; |
708 | 5.03k | band_stop = self->bs_param_bands; |
709 | 5.03k | } else if (datatype == IPD) { |
710 | 0 | frame_xxx_data = &frame->ipd_data; |
711 | 0 | lastdata = frame->ipd_idx_data_prev; |
712 | 0 | band_stop = self->num_bands_ipd; |
713 | 0 | } else { |
714 | 0 | frame_xxx_data = &frame->cld_data; |
715 | 0 | lastdata = frame->cmp_cld_idx_prev; |
716 | 0 | band_stop = self->bs_param_bands; |
717 | 0 | } |
718 | 48.5k | for (i = 0; i < self->num_parameter_sets; i++) { |
719 | 27.9k | frame_xxx_data->bs_xxx_data_mode[i] = |
720 | 27.9k | ixheaacd_read_bits_buf(it_bit_buff, 2); |
721 | 27.9k | } |
722 | | |
723 | 20.5k | set_index = 0; |
724 | 20.5k | bs_data_pair = 0; |
725 | 20.5k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev; |
726 | | |
727 | 48.4k | for (i = 0; i < self->num_parameter_sets; i++) { |
728 | 27.9k | if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { |
729 | 95.1k | for (pb = 0; pb < band_stop; pb++) { |
730 | 83.0k | lastdata[pb] = default_val; |
731 | 83.0k | } |
732 | | |
733 | 12.0k | old_quant_coarse_xxx = 0; |
734 | 12.0k | } |
735 | | |
736 | 27.9k | if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { |
737 | 9.86k | if (bs_data_pair) { |
738 | 1.92k | bs_data_pair = 0; |
739 | 7.93k | } else { |
740 | 7.93k | bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1); |
741 | 7.93k | frame_xxx_data->bs_quant_coarse_xxx[set_index] = |
742 | 7.93k | ixheaacd_read_bits_buf(it_bit_buff, 1); |
743 | 7.93k | frame_xxx_data->bs_freq_res_stride_xxx[set_index] = |
744 | 7.93k | ixheaacd_read_bits_buf(it_bit_buff, 2); |
745 | | |
746 | 7.93k | if (frame_xxx_data->bs_quant_coarse_xxx[set_index] != |
747 | 7.93k | old_quant_coarse_xxx) { |
748 | 6.10k | if (old_quant_coarse_xxx) { |
749 | 1.03k | ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0); |
750 | 5.06k | } else { |
751 | 5.06k | ixheaacd_mps_fine2coarse(lastdata, band_stop); |
752 | 5.06k | } |
753 | 6.10k | } |
754 | | |
755 | 7.93k | data_bands = ixheaacd_mps_getstridemap( |
756 | 7.93k | frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band, |
757 | 7.93k | band_stop, strides); |
758 | 41.7k | for (pb = 0; pb < data_bands; pb++) { |
759 | 33.8k | lastdata[pb] = lastdata[strides[pb]]; |
760 | 33.8k | } |
761 | | |
762 | 7.93k | ixheaacd_mps_ecdatapairdec( |
763 | 7.93k | it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair, |
764 | 7.93k | frame_xxx_data->bs_quant_coarse_xxx[set_index], |
765 | 7.93k | !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag); |
766 | | |
767 | 41.5k | for (pb = 0; pb < data_bands; pb++) { |
768 | 99.2k | for (j = strides[pb]; j < strides[pb + 1]; j++) { |
769 | 65.5k | if (datatype == IPD) { |
770 | 0 | if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) { |
771 | 0 | lastdata[j] = data[set_index + bs_data_pair][pb] & 7; |
772 | 0 | } else { |
773 | 0 | lastdata[j] = data[set_index + bs_data_pair][pb] & 15; |
774 | 0 | } |
775 | 65.5k | } else { |
776 | 65.5k | lastdata[j] = data[set_index + bs_data_pair][pb]; |
777 | 65.5k | } |
778 | 65.5k | } |
779 | 33.6k | } |
780 | | |
781 | 7.93k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
782 | | |
783 | 7.93k | if (bs_data_pair) { |
784 | 5.88k | frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] = |
785 | 5.88k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
786 | 5.88k | frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] = |
787 | 5.88k | frame_xxx_data->bs_freq_res_stride_xxx[set_index]; |
788 | 5.88k | } |
789 | 7.93k | set_index += bs_data_pair + 1; |
790 | 7.93k | } |
791 | 9.86k | } |
792 | 27.9k | } |
793 | 20.5k | } |
794 | | |
795 | | IA_ERRORCODE ixheaacd_ld_mps_frame_parsing( |
796 | 3.04k | ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) { |
797 | 3.04k | WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, |
798 | 3.04k | num_of_temp_shape_ch; |
799 | 3.04k | WORD32 ps, pg, ts, ic; |
800 | 3.04k | WORD32 env_shape_data[MAX_TIME_SLOTS]; |
801 | 3.04k | WORD32 alignment; |
802 | 3.04k | WORD32 bits_param_slot = 0; |
803 | | |
804 | 3.04k | ia_mps_bs_frame *frame = &(self->bs_frame); |
805 | 3.04k | alignment = it_bit_buff->cnt_bits; |
806 | 3.04k | if (self->parse_nxt_frame == 0) return IA_NO_ERROR; |
807 | | |
808 | 3.04k | self->num_parameter_sets_prev = self->num_parameter_sets; |
809 | | |
810 | 3.04k | bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1); |
811 | 3.04k | self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1; |
812 | | |
813 | 3.04k | if (self->time_slots == 32) |
814 | 359 | bits_param_slot = 5; |
815 | 2.68k | else if (self->time_slots == 64) |
816 | 0 | bits_param_slot = 6; |
817 | 2.68k | else if (self->time_slots == 8) |
818 | 40 | bits_param_slot = 3; |
819 | 2.64k | else if (self->time_slots == 16 || self->time_slots == 15) |
820 | 114 | bits_param_slot = 4; |
821 | | |
822 | 3.04k | if (bs_frame_type) { |
823 | 537 | WORD32 prev_param_slot = -1; |
824 | 1.11k | for (i = 0; i < self->num_parameter_sets; i++) { |
825 | 588 | self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot); |
826 | | |
827 | 588 | if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) { |
828 | 15 | return IA_FATAL_ERROR; |
829 | 15 | } |
830 | 573 | prev_param_slot = self->param_slots[i]; |
831 | 573 | } |
832 | 2.51k | } else { |
833 | 6.08k | for (i = 0; i < self->num_parameter_sets; i++) { |
834 | 3.57k | self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) / |
835 | 3.57k | self->num_parameter_sets) - |
836 | 3.57k | 1; |
837 | 3.57k | } |
838 | 2.51k | } |
839 | | |
840 | 3.03k | frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1); |
841 | | |
842 | 12.9k | for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) { |
843 | 9.94k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD, |
844 | 9.94k | 0); |
845 | 9.94k | } |
846 | | |
847 | 3.03k | if (self->ldmps_config.bs_one_icc) { |
848 | 2.07k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC, |
849 | 2.07k | 0); |
850 | 2.07k | } else { |
851 | 4.54k | for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) { |
852 | 3.59k | if (!self->ldmps_config.ott_mode_lfe[i]) |
853 | 2.95k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, |
854 | 2.95k | ICC, 0); |
855 | 3.59k | } |
856 | 954 | } |
857 | | |
858 | 7.12k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
859 | 4.09k | frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2); |
860 | 4.09k | if (frame->bs_smooth_mode[ps] >= 2) { |
861 | 1.82k | frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2); |
862 | 1.82k | } |
863 | 4.09k | if (frame->bs_smooth_mode[ps] == 3) { |
864 | 1.40k | frame->bs_freq_res_stride_smg[ps] = |
865 | 1.40k | ixheaacd_read_bits_buf(it_bit_buff, 2); |
866 | 1.40k | data_bands = |
867 | 1.40k | (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) / |
868 | 1.40k | ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] + |
869 | 1.40k | 1; |
870 | 6.02k | for (pg = 0; pg < data_bands; pg++) { |
871 | 4.61k | frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1); |
872 | 4.61k | } |
873 | 1.40k | } |
874 | 4.09k | } |
875 | | |
876 | 9.04k | for (i = 0; i < 2; i++) { |
877 | 6.01k | self->temp_shape_enable_ch_stp[i] = 0; |
878 | 6.01k | self->temp_shape_enable_ch_ges[i] = 0; |
879 | 6.01k | } |
880 | | |
881 | 3.03k | if (self->ldmps_config.bs_temp_shape_config != 0) { |
882 | 2.31k | bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1); |
883 | 2.31k | if (bs_temp_shape_enable) { |
884 | 1.21k | num_of_temp_shape_ch = 2; |
885 | 1.21k | switch (self->ldmps_config.bs_temp_shape_config) { |
886 | 147 | case 1: |
887 | 441 | for (i = 0; i < num_of_temp_shape_ch; i++) { |
888 | 294 | self->temp_shape_enable_ch_stp[i] = |
889 | 294 | ixheaacd_read_bits_buf(it_bit_buff, 1); |
890 | 294 | } |
891 | 147 | break; |
892 | 1.05k | case 2: |
893 | 3.15k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
894 | 2.10k | self->temp_shape_enable_ch_ges[i] = |
895 | 2.10k | ixheaacd_read_bits_buf(it_bit_buff, 1); |
896 | 2.10k | } |
897 | 3.15k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
898 | 2.10k | if (self->temp_shape_enable_ch_ges[i]) { |
899 | 848 | ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data, |
900 | 848 | self->time_slots); |
901 | 2.60k | for (ts = 0; ts < self->time_slots; ts++) { |
902 | 1.75k | self->env_shape_data[i][ts] = (FLOAT32)pow( |
903 | 1.75k | 2, (FLOAT32)env_shape_data[ts] / |
904 | 1.75k | (self->ldmps_config.bs_env_quant_mode + 2) - |
905 | 1.75k | 1); |
906 | 1.75k | } |
907 | 848 | } |
908 | 2.10k | } |
909 | 1.05k | break; |
910 | 19 | default: |
911 | 19 | if (self->ec_flag == 0) { |
912 | 19 | return IA_FATAL_ERROR; |
913 | 19 | } |
914 | 0 | break; |
915 | 1.21k | } |
916 | 1.21k | } |
917 | 2.31k | } |
918 | | |
919 | 3.01k | if (self->ldmps_config.bs_arbitrary_downmix != 0) { |
920 | 8.30k | for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) { |
921 | 5.58k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, |
922 | 5.58k | CLD, 0); |
923 | 5.58k | } |
924 | 2.72k | } |
925 | | |
926 | 3.01k | ixheaacd_byte_align(it_bit_buff, &alignment); |
927 | | |
928 | 14.9M | while (it_bit_buff->cnt_bits > 8) { |
929 | 14.9M | ixheaacd_read_bits_buf(it_bit_buff, 8); |
930 | 14.9M | } |
931 | 3.01k | ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits); |
932 | 3.01k | return IA_NO_ERROR; |
933 | 3.03k | } |
934 | | |
935 | | static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1], |
936 | | WORD32 band_start, WORD32 band_stop, |
937 | 56.6k | WORD32 ch_fac) { |
938 | 56.6k | WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i; |
939 | 56.6k | WORD32 vdk[MAX_PARAMETER_BANDS + 1]; |
940 | 56.6k | input_bands = band_stop - band_start; |
941 | 56.6k | out_bands = (input_bands - 1) / ch_fac + 1; |
942 | 56.6k | if (out_bands < 1) { |
943 | 0 | out_bands = 1; |
944 | 0 | } |
945 | | |
946 | 56.6k | bands_achived = out_bands * ch_fac; |
947 | 56.6k | bands_diff = input_bands - bands_achived; |
948 | 471k | for (i = 0; i < out_bands; i++) { |
949 | 415k | vdk[i] = ch_fac; |
950 | 415k | } |
951 | | |
952 | 56.6k | if (bands_diff > 0) { |
953 | 0 | incr = -1; |
954 | 0 | k = out_bands - 1; |
955 | 56.6k | } else { |
956 | 56.6k | incr = 1; |
957 | 56.6k | k = 0; |
958 | 56.6k | } |
959 | | |
960 | 230k | while (bands_diff != 0) { |
961 | 173k | vdk[k] = vdk[k] - incr; |
962 | 173k | k = k + incr; |
963 | 173k | bands_diff = bands_diff + incr; |
964 | 173k | if (k >= out_bands) { |
965 | 152k | if (bands_diff > 0) { |
966 | 0 | k = out_bands - 1; |
967 | 152k | } else if (bands_diff < 0) { |
968 | 141k | k = 0; |
969 | 141k | } |
970 | 152k | } |
971 | 173k | } |
972 | 56.6k | map[0] = band_start; |
973 | 471k | for (i = 0; i < out_bands; i++) { |
974 | 415k | map[i + 1] = map[i] + vdk[i]; |
975 | 415k | } |
976 | 56.6k | } |
977 | | |
978 | | static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map, |
979 | 54.1k | WORD32 data_bands) { |
980 | 54.1k | WORD32 i, j, band_start, band_stop, value; |
981 | 54.1k | WORD32 start_band_0 = map[0]; |
982 | | |
983 | 448k | for (i = 0; i < data_bands; i++) { |
984 | 394k | value = in[i + start_band_0]; |
985 | | |
986 | 394k | band_start = map[i]; |
987 | 394k | band_stop = map[i + 1]; |
988 | 1.10M | for (j = band_start; j < band_stop; j++) { |
989 | 706k | out[j] = value; |
990 | 706k | } |
991 | 394k | } |
992 | 54.1k | } |
993 | | |
994 | 4.47M | static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) { |
995 | 4.47M | switch (param_type) { |
996 | 1.59M | case CLD: |
997 | 1.59M | return ixheaacd_cld_de_quant_table[(value + 15)]; |
998 | | |
999 | 1.59M | case ICC: |
1000 | 1.59M | return ixheaacd_icc_de_quant_table[value]; |
1001 | | |
1002 | 1.28M | case IPD: |
1003 | 1.28M | return ixheaacd_ipd_de_quant_table[(value & 15)]; |
1004 | | |
1005 | 0 | default: |
1006 | 0 | return 0; |
1007 | 0 | return 0; |
1008 | 4.47M | } |
1009 | 4.47M | } |
1010 | | |
1011 | | static IA_ERRORCODE ixheaacd_mps_mapindexdata( |
1012 | | ia_mps_dec_state_struct *self, ia_mps_data_struct *frame_xxx_data, |
1013 | | FLOAT32 out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], |
1014 | | WORD32 out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], |
1015 | | WORD32 cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], |
1016 | 305k | WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) { |
1017 | 305k | WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0}; |
1018 | 305k | WORD32 map[MAX_PARAMETER_BANDS + 1]; |
1019 | | |
1020 | 305k | WORD32 set_index, i, band, parm_slot; |
1021 | 305k | WORD32 data_bands, ch_fac; |
1022 | 305k | WORD32 ps; |
1023 | | |
1024 | 305k | WORD32 i1, i2, x1, xi, x2; |
1025 | 305k | WORD32 band_start = 0; |
1026 | 305k | WORD32 ext_frame_flag = self->ext_frame_flag; |
1027 | 305k | WORD32 *param_slots = self->param_slots; |
1028 | 305k | WORD32 num_parameter_sets = self->num_parameter_sets; |
1029 | 305k | WORD32 band_stop = self->bs_param_bands; |
1030 | 305k | WORD32 default_val = 0; |
1031 | | |
1032 | 305k | set_index = 0; |
1033 | | |
1034 | 670k | for (i = 0; i < num_parameter_sets; i++) { |
1035 | 365k | if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { |
1036 | 225k | frame_xxx_data->quant_coarse_xxx_flag[i] = 0; |
1037 | 2.88M | for (band = band_start; band < band_stop; band++) { |
1038 | 2.66M | out_idx_data[i][band] = default_val; |
1039 | 2.66M | } |
1040 | 2.88M | for (band = band_start; band < band_stop; band++) { |
1041 | 2.66M | idx_prev[band] = out_idx_data[i][band]; |
1042 | 2.66M | } |
1043 | | |
1044 | 225k | frame_xxx_data->bs_quant_coarse_xxx_prev = 0; |
1045 | 225k | } |
1046 | | |
1047 | 365k | if (frame_xxx_data->bs_xxx_data_mode[i] == 1) { |
1048 | 605k | for (band = band_start; band < band_stop; band++) { |
1049 | 562k | out_idx_data[i][band] = idx_prev[band]; |
1050 | 562k | } |
1051 | 43.0k | frame_xxx_data->quant_coarse_xxx_flag[i] = |
1052 | 43.0k | frame_xxx_data->bs_quant_coarse_xxx_prev; |
1053 | 43.0k | } |
1054 | | |
1055 | 365k | if (frame_xxx_data->bs_xxx_data_mode[i] == 2) { |
1056 | 589k | for (band = band_start; band < band_stop; band++) { |
1057 | 547k | out_idx_data[i][band] = idx_prev[band]; |
1058 | 547k | } |
1059 | 42.2k | frame_xxx_data->quant_coarse_xxx_flag[i] = |
1060 | 42.2k | frame_xxx_data->bs_quant_coarse_xxx_prev; |
1061 | 42.2k | interpolate_local[i] = 1; |
1062 | 322k | } else { |
1063 | 322k | interpolate_local[i] = 0; |
1064 | 322k | } |
1065 | | |
1066 | 365k | if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { |
1067 | 54.1k | parm_slot = i; |
1068 | 54.1k | ch_fac = |
1069 | 54.1k | ixheaacd_mps_stride_table[frame_xxx_data |
1070 | 54.1k | ->bs_freq_res_stride_xxx[set_index]]; |
1071 | 54.1k | data_bands = (band_stop - band_start - 1) / ch_fac + 1; |
1072 | 54.1k | ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac); |
1073 | 54.1k | ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0], |
1074 | 54.1k | &out_idx_data[parm_slot][0], map, data_bands); |
1075 | | |
1076 | 760k | for (band = band_start; band < band_stop; band++) { |
1077 | 706k | idx_prev[band] = out_idx_data[parm_slot][band]; |
1078 | 706k | } |
1079 | | |
1080 | 54.1k | frame_xxx_data->bs_quant_coarse_xxx_prev = |
1081 | 54.1k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
1082 | 54.1k | frame_xxx_data->quant_coarse_xxx_flag[i] = |
1083 | 54.1k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
1084 | | |
1085 | 54.1k | set_index++; |
1086 | 54.1k | } |
1087 | 365k | } |
1088 | | |
1089 | 670k | for (i = 0; i < num_parameter_sets; i++) { |
1090 | 365k | if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) { |
1091 | 40.5k | ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start, |
1092 | 40.5k | band_stop - band_start); |
1093 | 40.5k | frame_xxx_data->quant_coarse_xxx_flag[i] = 0; |
1094 | 40.5k | } |
1095 | 365k | } |
1096 | | |
1097 | 305k | i1 = -1; |
1098 | 305k | x1 = 0; |
1099 | 305k | i2 = 0; |
1100 | 669k | for (i = 0; i < num_parameter_sets; i++) { |
1101 | 364k | if (interpolate_local[i] != 1) { |
1102 | 322k | i1 = i; |
1103 | 322k | } |
1104 | 364k | i2 = i; |
1105 | 407k | while (interpolate_local[i2] == 1) { |
1106 | 42.6k | i2++; |
1107 | 42.6k | } |
1108 | 364k | if (i1 == -1) { |
1109 | 38.3k | x1 = 0; |
1110 | 38.3k | i1 = 0; |
1111 | 326k | } else { |
1112 | 326k | x1 = param_slots[i1]; |
1113 | 326k | } |
1114 | 364k | xi = param_slots[i]; |
1115 | 364k | x2 = param_slots[i2]; |
1116 | | |
1117 | 364k | if (interpolate_local[i] == 1) { |
1118 | 42.2k | if (i2 < num_parameter_sets) { |
1119 | 173 | if (self->ec_flag == 0) { |
1120 | 173 | return IA_FATAL_ERROR; |
1121 | 173 | } |
1122 | 173 | } |
1123 | | |
1124 | 586k | for (band = band_start; band < band_stop; band++) { |
1125 | 544k | WORD32 yi, y1, y2; |
1126 | 544k | yi = 0; |
1127 | 544k | y1 = out_idx_data[i1][band]; |
1128 | 544k | y2 = out_idx_data[i2][band]; |
1129 | 544k | if (param_type == IPD) { |
1130 | 135k | if (y2 - y1 > 8) y1 += 16; |
1131 | 135k | if (y1 - y2 > 8) y2 += 16; |
1132 | | |
1133 | 135k | if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16; |
1134 | 408k | } else { |
1135 | 408k | if (x2 != x1) { |
1136 | 38.9k | yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1); |
1137 | 38.9k | } |
1138 | 408k | } |
1139 | 544k | out_idx_data[i][band] = yi; |
1140 | 544k | } |
1141 | 42.0k | } |
1142 | 364k | } |
1143 | | |
1144 | 669k | for (ps = 0; ps < num_parameter_sets; ps++) { |
1145 | 4.83M | for (band = band_start; band < band_stop; band++) { |
1146 | 4.47M | if (param_type == CLD) { |
1147 | 1.59M | out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15); |
1148 | 2.87M | } else if (param_type == ICC) |
1149 | 1.59M | { |
1150 | 1.59M | out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7); |
1151 | 1.59M | } |
1152 | 4.47M | out_data[ps][band] = |
1153 | 4.47M | ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type); |
1154 | 4.47M | } |
1155 | 364k | } |
1156 | | |
1157 | 305k | if (ext_frame_flag) { |
1158 | 77.0k | for (band = band_start; band < band_stop; band++) { |
1159 | 69.2k | out_data[num_parameter_sets][band] = |
1160 | 69.2k | out_data[num_parameter_sets - 1][band]; |
1161 | 69.2k | out_idx_data[num_parameter_sets][band] = |
1162 | 69.2k | out_idx_data[num_parameter_sets - 1][band]; |
1163 | 69.2k | } |
1164 | 7.77k | } |
1165 | 305k | return IA_NO_ERROR; |
1166 | 305k | } |
1167 | | |
1168 | | static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott( |
1169 | 111k | ia_mps_dec_state_struct *self) { |
1170 | 111k | ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame); |
1171 | 111k | IA_ERRORCODE err_code = 0; |
1172 | | |
1173 | 111k | err_code = ixheaacd_mps_mapindexdata( |
1174 | 111k | self, &cur_bit_stream_ptr->cld_data, self->cld_data, |
1175 | 111k | cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx, |
1176 | 111k | cur_bit_stream_ptr->cld_idx_pre, CLD); |
1177 | 111k | if (err_code != IA_NO_ERROR) return err_code; |
1178 | 111k | err_code = ixheaacd_mps_mapindexdata( |
1179 | 111k | self, &cur_bit_stream_ptr->icc_data, self->icc_data, |
1180 | 111k | cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx, |
1181 | 111k | cur_bit_stream_ptr->icc_idx_pre, ICC); |
1182 | 111k | if (err_code != IA_NO_ERROR) return err_code; |
1183 | 111k | if ((self->config->bs_phase_coding)) { |
1184 | 82.7k | err_code = ixheaacd_mps_mapindexdata( |
1185 | 82.7k | self, &cur_bit_stream_ptr->ipd_data, self->ipd_data, |
1186 | 82.7k | cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data, |
1187 | 82.7k | cur_bit_stream_ptr->ipd_idx_prev, IPD); |
1188 | | |
1189 | 82.7k | if (err_code != IA_NO_ERROR) return err_code; |
1190 | 82.7k | } |
1191 | 111k | return IA_NO_ERROR; |
1192 | 111k | } |
1193 | | |
1194 | 111k | static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { |
1195 | 111k | WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop, |
1196 | 111k | group_to_band[MAX_PARAMETER_BANDS + 1]; |
1197 | 111k | ia_mps_bs_frame *frame = &(self->bs_frame); |
1198 | 243k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
1199 | 132k | switch (frame->bs_smooth_mode[ps]) { |
1200 | 116k | case 0: |
1201 | 116k | self->smoothing_time[ps] = 256; |
1202 | 116k | self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f); |
1203 | | |
1204 | 1.49M | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1205 | 1.37M | self->smoothing_data[ps][pb] = 0; |
1206 | 1.37M | } |
1207 | 116k | break; |
1208 | | |
1209 | 4.92k | case 1: |
1210 | 4.92k | if (ps > 0) { |
1211 | 1.77k | self->smoothing_time[ps] = self->smoothing_time[ps - 1]; |
1212 | 1.77k | self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1]; |
1213 | 3.14k | } else { |
1214 | 3.14k | self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time; |
1215 | 3.14k | self->inv_smoothing_time[ps] = |
1216 | 3.14k | self->smoothing_filt_state.inv_prev_smg_time; |
1217 | 3.14k | } |
1218 | | |
1219 | 62.1k | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1220 | 57.2k | if (ps > 0) |
1221 | 25.9k | self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb]; |
1222 | 31.2k | else |
1223 | 31.2k | self->smoothing_data[ps][pb] = |
1224 | 31.2k | self->smoothing_filt_state.prev_smg_data[pb]; |
1225 | 57.2k | } |
1226 | 4.92k | break; |
1227 | | |
1228 | 8.46k | case 2: |
1229 | 8.46k | self->smoothing_time[ps] = |
1230 | 8.46k | ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1231 | 8.46k | self->inv_smoothing_time[ps] = |
1232 | 8.46k | ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1233 | 119k | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1234 | 111k | self->smoothing_data[ps][pb] = 1; |
1235 | 111k | } |
1236 | 8.46k | break; |
1237 | | |
1238 | 2.56k | case 3: |
1239 | 2.56k | self->smoothing_time[ps] = |
1240 | 2.56k | ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1241 | 2.56k | self->inv_smoothing_time[ps] = |
1242 | 2.56k | ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1243 | | |
1244 | 2.56k | ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]]; |
1245 | 2.56k | data_bands = (self->bs_param_bands - 1) / ch_fac + 1; |
1246 | 2.56k | ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands, |
1247 | 2.56k | ch_fac); |
1248 | 23.6k | for (pg = 0; pg < data_bands; pg++) { |
1249 | 21.0k | param_band_start = group_to_band[pg]; |
1250 | 21.0k | param_band_stop = group_to_band[pg + 1]; |
1251 | 65.3k | for (pb = param_band_start; pb < param_band_stop; pb++) { |
1252 | 44.2k | self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg]; |
1253 | 44.2k | } |
1254 | 21.0k | } |
1255 | 2.56k | break; |
1256 | 132k | } |
1257 | 132k | } |
1258 | | |
1259 | 111k | self->smoothing_filt_state.prev_smg_time = |
1260 | 111k | self->smoothing_time[self->num_parameter_sets - 1]; |
1261 | 111k | self->smoothing_filt_state.inv_prev_smg_time = |
1262 | 111k | self->inv_smoothing_time[self->num_parameter_sets - 1]; |
1263 | 1.42M | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1264 | 1.31M | self->smoothing_filt_state.prev_smg_data[pb] = |
1265 | 1.31M | self->smoothing_data[self->num_parameter_sets - 1][pb]; |
1266 | 1.31M | } |
1267 | | |
1268 | 111k | if (self->ext_frame_flag) { |
1269 | 3.26k | self->smoothing_time[self->num_parameter_sets] = |
1270 | 3.26k | self->smoothing_time[self->num_parameter_sets - 1]; |
1271 | 3.26k | self->inv_smoothing_time[self->num_parameter_sets] = |
1272 | 3.26k | self->inv_smoothing_time[self->num_parameter_sets - 1]; |
1273 | 32.4k | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1274 | 29.2k | self->smoothing_data[self->num_parameter_sets][pb] = |
1275 | 29.2k | self->smoothing_data[self->num_parameter_sets - 1][pb]; |
1276 | 29.2k | } |
1277 | 3.26k | } |
1278 | 111k | } |
1279 | | |
1280 | 111k | IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) { |
1281 | 111k | WORD32 i; |
1282 | 111k | IA_ERRORCODE err_code = 0; |
1283 | 111k | if (self->ldmps_config.ldmps_present_flag != 1) |
1284 | 108k | if (self->parse_nxt_frame == 1) return err_code; |
1285 | 111k | self->ext_frame_flag = 0; |
1286 | 111k | if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) { |
1287 | 3.27k | self->ext_frame_flag = 1; |
1288 | 3.27k | } |
1289 | | |
1290 | 111k | err_code = ixheaacd_mps_dec_and_mapframeott(self); |
1291 | 111k | if (err_code != IA_NO_ERROR) return err_code; |
1292 | 111k | ixheaacd_mps_dec_and_mapframesmg(self); |
1293 | | |
1294 | 111k | if (self->ext_frame_flag) { |
1295 | 3.26k | self->num_parameter_sets++; |
1296 | 3.26k | self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1; |
1297 | 3.26k | } |
1298 | 111k | self->param_slot_diff[0] = self->param_slots[0] + 1; |
1299 | 111k | if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) { |
1300 | 0 | if (self->ec_flag == 0) { |
1301 | 0 | return -1; |
1302 | 0 | } else { |
1303 | 0 | self->param_slot_diff[0] = MAX_TIME_SLOTS; |
1304 | 0 | } |
1305 | 0 | } |
1306 | 111k | self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0]; |
1307 | 111k | self->inv_param_slot_diff_Q30[0] = |
1308 | 111k | (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5); |
1309 | 135k | for (i = 1; i < self->num_parameter_sets; i++) { |
1310 | 24.4k | self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1]; |
1311 | 24.4k | if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) || |
1312 | 24.4k | (self->param_slot_diff[i] == 0)) { |
1313 | 2 | if (self->ec_flag == 0) { |
1314 | 2 | return -1; |
1315 | 2 | } else { |
1316 | 0 | self->param_slot_diff[i] = 1; |
1317 | 0 | self->inv_param_slot_diff[i] = 1; |
1318 | 0 | } |
1319 | 2 | } |
1320 | 24.4k | self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i]; |
1321 | 24.4k | self->inv_param_slot_diff_Q30[i] = |
1322 | 24.4k | (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5); |
1323 | 24.4k | } |
1324 | 111k | return IA_NO_ERROR; |
1325 | 111k | } |
1326 | | |
1327 | 3.69k | WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) { |
1328 | 3.69k | WORD32 samp_freq; |
1329 | 3.69k | WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000, |
1330 | 3.69k | 24000, 22050, 16000, 12000, 11025, 8000, |
1331 | 3.69k | 7350, 0, 0, 0}; |
1332 | | |
1333 | 3.69k | if (self->ldmps_config.ldmps_present_flag == 1) |
1334 | 1.24k | self->time_slots = self->frame_length + 1; |
1335 | 2.45k | else |
1336 | 2.45k | self->time_slots = self->frame_length; |
1337 | | |
1338 | 3.69k | self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res]; |
1339 | | |
1340 | 3.69k | if (self->ldmps_config.ldmps_present_flag == 1) { |
1341 | 1.24k | if (self->ldmps_config.bs_sampling_freq_index == 15) { |
1342 | 13 | samp_freq = self->ldmps_config.bs_fampling_frequency; |
1343 | 1.23k | } else { |
1344 | 1.23k | samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index]; |
1345 | 1.23k | } |
1346 | | |
1347 | 1.24k | if (samp_freq < 27713.0) { |
1348 | 716 | self->qmf_band_count = 32; |
1349 | 716 | } else if (samp_freq >= 55426.0) { |
1350 | 25 | self->qmf_band_count = 128; |
1351 | 502 | } else { |
1352 | 502 | self->qmf_band_count = 64; |
1353 | 502 | } |
1354 | 1.24k | } |
1355 | | |
1356 | 3.69k | if (self->object_type == AOT_ER_AAC_ELD || |
1357 | 2.45k | self->object_type == AOT_ER_AAC_LD) { |
1358 | 1.24k | self->bs_param_bands = |
1359 | 1.24k | ixheaacd_freq_res_table_ld[self->config->bs_freq_res]; |
1360 | 1.24k | self->hyb_band_count_max = self->qmf_band_count; |
1361 | 1.24k | } else |
1362 | 2.45k | self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10; |
1363 | | |
1364 | 3.69k | if (self->object_type == AOT_ER_AAC_ELD || |
1365 | 2.45k | self->object_type == AOT_ER_AAC_LD) { |
1366 | 1.24k | switch (self->bs_param_bands) { |
1367 | 45 | case 4: |
1368 | | |
1369 | 45 | self->hyb_band_to_processing_band_table = |
1370 | 45 | ixheaacd_hybrid_band_64_to_processing_band_4_map; |
1371 | 45 | break; |
1372 | 30 | case 5: |
1373 | | |
1374 | 30 | self->hyb_band_to_processing_band_table = |
1375 | 30 | ixheaacd_hybrid_band_64_to_processing_band_5_map; |
1376 | 30 | break; |
1377 | 80 | case 7: |
1378 | | |
1379 | 80 | self->hyb_band_to_processing_band_table = |
1380 | 80 | ixheaacd_hybrid_band_64_to_processing_band_7_map; |
1381 | 80 | break; |
1382 | 139 | case 9: |
1383 | | |
1384 | 139 | self->hyb_band_to_processing_band_table = |
1385 | 139 | ixheaacd_hybrid_band_64_to_processing_band_9_map; |
1386 | 139 | break; |
1387 | 97 | case 12: |
1388 | | |
1389 | 97 | self->hyb_band_to_processing_band_table = |
1390 | 97 | ixheaacd_hybrid_band_64_to_processing_band_12_map; |
1391 | 97 | break; |
1392 | 146 | case 15: |
1393 | | |
1394 | 146 | self->hyb_band_to_processing_band_table = |
1395 | 146 | ixheaacd_hybrid_band_64_to_processing_band_15_map; |
1396 | 146 | break; |
1397 | 700 | case 23: |
1398 | | |
1399 | 700 | self->hyb_band_to_processing_band_table = |
1400 | 700 | ixheaacd_hybrid_band_64_to_processing_band_23_map; |
1401 | 700 | break; |
1402 | 6 | default: |
1403 | 6 | self->hyb_band_to_processing_band_table = NULL; |
1404 | 6 | return -1; |
1405 | 0 | break; |
1406 | 1.24k | } |
1407 | 2.45k | } else { |
1408 | 2.45k | switch (self->bs_param_bands) { |
1409 | 825 | case 4: |
1410 | 825 | self->hyb_band_to_processing_band_table = |
1411 | 825 | ixheaacd_hybrid_band_71_to_processing_band_4_map; |
1412 | 825 | break; |
1413 | 370 | case 5: |
1414 | 370 | self->hyb_band_to_processing_band_table = |
1415 | 370 | ixheaacd_hybrid_band_71_to_processing_band_5_map; |
1416 | 370 | break; |
1417 | 352 | case 7: |
1418 | 352 | self->hyb_band_to_processing_band_table = |
1419 | 352 | ixheaacd_hybrid_band_71_to_processing_band_7_map; |
1420 | 352 | break; |
1421 | 267 | case 10: |
1422 | 267 | self->hyb_band_to_processing_band_table = |
1423 | 267 | ixheaacd_hybrid_band_71_to_processing_band_10_map; |
1424 | 267 | break; |
1425 | 223 | case 14: |
1426 | 223 | self->hyb_band_to_processing_band_table = |
1427 | 223 | ixheaacd_hybrid_band_71_to_processing_band_14_map; |
1428 | 223 | break; |
1429 | 87 | case 20: |
1430 | 87 | self->hyb_band_to_processing_band_table = |
1431 | 87 | ixheaacd_hybrid_band_71_to_processing_band_20_map; |
1432 | 87 | break; |
1433 | 328 | case 28: |
1434 | 328 | self->hyb_band_to_processing_band_table = |
1435 | 328 | ixheaacd_hybrid_band_71_to_processing_band_28_map; |
1436 | 328 | break; |
1437 | 1 | default: |
1438 | 1 | self->hyb_band_to_processing_band_table = NULL; |
1439 | 1 | return -1; |
1440 | 0 | break; |
1441 | 2.45k | } |
1442 | 2.45k | } |
1443 | 3.68k | self->in_ch_count = 1; |
1444 | 3.68k | self->out_ch_count = 2; |
1445 | | |
1446 | 3.68k | self->input_gain = |
1447 | 3.68k | ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx]; |
1448 | | |
1449 | 3.68k | if (self->config->bs_ott_bands_phase_present) { |
1450 | 829 | self->num_bands_ipd = self->config->bs_ott_bands_phase; |
1451 | 2.86k | } else { |
1452 | 2.86k | if (!(self->object_type == AOT_ER_AAC_ELD || |
1453 | 1.62k | self->object_type == AOT_ER_AAC_LD)) { |
1454 | 1.62k | switch (self->bs_param_bands) { |
1455 | 588 | case 4: |
1456 | 870 | case 5: |
1457 | 870 | self->num_bands_ipd = 2; |
1458 | 870 | break; |
1459 | 286 | case 7: |
1460 | 286 | self->num_bands_ipd = 3; |
1461 | 286 | break; |
1462 | 79 | case 10: |
1463 | 79 | self->num_bands_ipd = 5; |
1464 | 79 | break; |
1465 | 204 | case 14: |
1466 | 204 | self->num_bands_ipd = 7; |
1467 | 204 | break; |
1468 | 31 | case 20: |
1469 | 184 | case 28: |
1470 | 184 | self->num_bands_ipd = 10; |
1471 | 184 | break; |
1472 | 0 | default: |
1473 | 0 | return -1; |
1474 | 0 | break; |
1475 | 1.62k | } |
1476 | 1.62k | } |
1477 | 2.86k | } |
1478 | | |
1479 | 3.68k | if (self->residual_coding) { |
1480 | 1.60k | self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd); |
1481 | 1.60k | self->max_res_bands = 0; |
1482 | 1.60k | if (self->bs_residual_present) { |
1483 | 1.60k | self->res_bands = self->bs_residual_bands; |
1484 | 1.60k | if (self->res_bands > self->max_res_bands) { |
1485 | 1.02k | self->max_res_bands = self->res_bands; |
1486 | 1.02k | } |
1487 | 1.60k | } else { |
1488 | 0 | self->res_bands = 0; |
1489 | 0 | } |
1490 | 1.60k | } |
1491 | | |
1492 | 3.68k | if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1; |
1493 | | |
1494 | 3.68k | self->dir_sig_count = 1; |
1495 | 3.68k | self->decor_sig_count = 1; |
1496 | | |
1497 | 3.68k | self->bs_high_rate_mode = self->config->bs_high_rate_mode; |
1498 | 3.68k | self->pre_mix_req = 1; |
1499 | | |
1500 | 3.68k | return 0; |
1501 | 3.68k | } |