/src/libxaac/decoder/ixheaacd_mps_parse.c
Line | Count | Source (jump to first uncovered line) |
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 | 2.60M | static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) { |
174 | 2.60M | var = min(var, upper_bound); |
175 | 2.60M | var = max(var, lower_bound); |
176 | 2.60M | return var; |
177 | 2.60M | } |
178 | | |
179 | | static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b, |
180 | 1.00M | UWORD16 d[], WORD32 len) { |
181 | 1.00M | WORD32 k; |
182 | 1.00M | UWORD32 tmp; |
183 | 1.00M | UWORD32 b0 = (UWORD32)b; |
184 | | |
185 | 1.00M | tmp = ((UWORD32)a[0]) * b0; |
186 | 1.00M | d[0] = (UWORD16)tmp; |
187 | | |
188 | 5.00M | for (k = 1; k < len; k++) { |
189 | 4.00M | tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0; |
190 | 4.00M | d[k] = (UWORD16)tmp; |
191 | 4.00M | } |
192 | 1.00M | } |
193 | | |
194 | | static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a, |
195 | 1.00M | UWORD16 d[], UWORD16 *pr, WORD32 len) { |
196 | 1.00M | UWORD32 r; |
197 | 1.00M | UWORD32 tmp; |
198 | 1.00M | UWORD32 temp; |
199 | 1.00M | WORD32 k; |
200 | | |
201 | 1.00M | if (a == 0) |
202 | 0 | return; |
203 | | |
204 | 1.00M | r = 0; |
205 | | |
206 | 6.00M | for (k = len - 1; k >= 0; k--) { |
207 | 5.00M | tmp = ((UWORD32)b[k]) + (r << 16); |
208 | | |
209 | 5.00M | if (tmp) { |
210 | 1.62M | d[k] = (UWORD16)(tmp / a); |
211 | 1.62M | temp = d[k] * a; |
212 | 1.62M | r = tmp - temp; |
213 | 3.37M | } else { |
214 | 3.37M | d[k] = 0; |
215 | 3.37M | } |
216 | 5.00M | } |
217 | 1.00M | *pr = (UWORD16)r; |
218 | 1.00M | } |
219 | | |
220 | | static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena, |
221 | 60.6k | WORD32 lenb) { |
222 | 60.6k | WORD32 h; |
223 | 60.6k | WORD32 carry = 0; |
224 | | |
225 | 60.6k | if (lenb > lena) |
226 | 0 | return; |
227 | | |
228 | 303k | for (h = 0; h < lenb; h++) { |
229 | 242k | carry = carry + (WORD32)(a[h] - b[h]); |
230 | 242k | a[h] = (UWORD16)carry; |
231 | 242k | carry = carry >> 16; |
232 | 242k | } |
233 | | |
234 | 60.6k | 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 | 60.6k | if (carry != 0) |
241 | 0 | return; |
242 | 60.6k | return; |
243 | 60.6k | } |
244 | | |
245 | | static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[], |
246 | 373k | WORD32 len) { |
247 | 373k | WORD32 i; |
248 | | |
249 | 1.38M | for (i = len - 1; i > 0; i--) { |
250 | 1.10M | if (a[i] != b[i]) break; |
251 | 1.10M | } |
252 | 373k | return (a[i] >= b[i]) ? 1 : 0; |
253 | 373k | } |
254 | | |
255 | | static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type, |
256 | 41.5k | WORD32 band_start, WORD32 ixheaacd_num_bands) { |
257 | 41.5k | WORD32 i; |
258 | | |
259 | 602k | for (i = band_start; i < band_start + ixheaacd_num_bands; i++) { |
260 | 561k | data[i] <<= 1; |
261 | 561k | } |
262 | | |
263 | 41.5k | if (data_type == CLD) { |
264 | 126k | for (i = band_start; i < band_start + ixheaacd_num_bands; i++) { |
265 | 117k | if (data[i] == -14) |
266 | 16.5k | data[i] = -15; |
267 | 100k | else if (data[i] == 14) |
268 | 3.86k | data[i] = 15; |
269 | 117k | } |
270 | 9.43k | } |
271 | 41.5k | } |
272 | | |
273 | 9.04k | static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) { |
274 | 9.04k | WORD32 i; |
275 | | |
276 | 96.7k | for (i = 0; i < ixheaacd_num_bands; i++) { |
277 | 87.7k | data[i] /= 2; |
278 | 87.7k | } |
279 | 9.04k | } |
280 | | |
281 | | static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start, |
282 | 25.9k | WORD32 band_stop, WORD32 *strides) { |
283 | 25.9k | WORD32 i, pb, ch_fac, data_bands, start_offset; |
284 | | |
285 | 25.9k | ch_fac = ixheaacd_mps_stride_table[freq_res_stride]; |
286 | 25.9k | data_bands = (band_stop - band_start - 1) / ch_fac + 1; |
287 | | |
288 | 25.9k | strides[0] = band_start; |
289 | 212k | for (pb = 1; pb <= data_bands; pb++) { |
290 | 186k | strides[pb] = strides[pb - 1] + ch_fac; |
291 | 186k | } |
292 | 25.9k | start_offset = 0; |
293 | 139k | while (strides[data_bands] > band_stop) { |
294 | 113k | if (start_offset < data_bands) |
295 | 9.62k | start_offset++; |
296 | 104k | else |
297 | 104k | start_offset = 1; |
298 | | |
299 | 237k | for (i = start_offset; i <= data_bands; i++) { |
300 | 124k | strides[i]--; |
301 | 124k | } |
302 | 113k | } |
303 | | |
304 | 25.9k | return data_bands; |
305 | 25.9k | } |
306 | | |
307 | | static IA_ERRORCODE ixheaacd_mps_ecdata_decoding( |
308 | | ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream, |
309 | 191k | WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) { |
310 | 191k | WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx; |
311 | 191k | WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0}; |
312 | 191k | WORD32 band_stop = 0; |
313 | | |
314 | 191k | WORD32 *lastdata = NULL; |
315 | 191k | ia_mps_data_struct *frame_xxx_data = NULL; |
316 | 191k | WORD32 default_val = 0; |
317 | 191k | IA_ERRORCODE err = IA_NO_ERROR; |
318 | | |
319 | 191k | ia_mps_bs_frame *frame = &(self->bs_frame); |
320 | | |
321 | 191k | if (datatype == 0) { |
322 | 89.1k | frame_xxx_data = &frame->cld_data; |
323 | 89.1k | lastdata = frame->cmp_cld_idx_prev; |
324 | 89.1k | band_stop = self->bs_param_bands; |
325 | 102k | } else if (datatype == 1) { |
326 | 89.1k | frame_xxx_data = &frame->icc_data; |
327 | 89.1k | lastdata = frame->cmp_icc_idx_prev; |
328 | 89.1k | band_stop = self->bs_param_bands; |
329 | 89.1k | } else if (datatype == 2) { |
330 | 13.5k | frame_xxx_data = &frame->ipd_data; |
331 | 13.5k | lastdata = frame->ipd_idx_data_prev; |
332 | 13.5k | band_stop = self->num_bands_ipd; |
333 | 13.5k | } 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 | 437k | for (i = 0; i < self->num_parameter_sets; i++) { |
340 | 245k | frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2); |
341 | 245k | } |
342 | | |
343 | 191k | set_index = 0; |
344 | 191k | bs_data_pair = 0; |
345 | 191k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev; |
346 | | |
347 | 436k | for (i = 0; i < self->num_parameter_sets; i++) { |
348 | 245k | if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { |
349 | 1.81M | for (pb = 0; pb < band_stop; pb++) { |
350 | 1.64M | lastdata[pb] = default_val; |
351 | 1.64M | } |
352 | | |
353 | 162k | old_quant_coarse_xxx = 0; |
354 | 162k | } |
355 | | |
356 | 245k | if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { |
357 | 20.9k | if (bs_data_pair) { |
358 | 938 | bs_data_pair = 0; |
359 | 19.9k | } else { |
360 | 19.9k | bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1); |
361 | 19.9k | frame_xxx_data->bs_quant_coarse_xxx[set_index] = |
362 | 19.9k | ixheaacd_read_bits_buf(bitstream, 1); |
363 | 19.9k | frame_xxx_data->bs_freq_res_stride_xxx[set_index] = |
364 | 19.9k | ixheaacd_read_bits_buf(bitstream, 2); |
365 | | |
366 | 19.9k | if (frame_xxx_data->bs_quant_coarse_xxx[set_index] != |
367 | 19.9k | old_quant_coarse_xxx) { |
368 | 6.01k | if (old_quant_coarse_xxx) { |
369 | 777 | ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0); |
370 | 5.23k | } else { |
371 | 5.23k | ixheaacd_mps_fine2coarse(lastdata, band_stop); |
372 | 5.23k | } |
373 | 6.01k | } |
374 | | |
375 | 19.9k | data_bands = ixheaacd_mps_getstridemap( |
376 | 19.9k | frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop, |
377 | 19.9k | strides); |
378 | | |
379 | 181k | for (pb = 0; pb < data_bands; pb++) { |
380 | 161k | lastdata[pb] = lastdata[strides[pb]]; |
381 | 161k | } |
382 | | |
383 | 19.9k | err = ixheaacd_mps_ecdatapairdec( |
384 | 19.9k | bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair, |
385 | 19.9k | frame_xxx_data->bs_quant_coarse_xxx[set_index], |
386 | 19.9k | !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag); |
387 | 19.9k | if (err) return err; |
388 | | |
389 | 181k | for (pb = 0; pb < data_bands; pb++) { |
390 | 408k | for (j = strides[pb]; j < strides[pb + 1]; j++) { |
391 | 247k | if (datatype == IPD) { |
392 | 59.9k | if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) { |
393 | 24.4k | lastdata[j] = data[set_index + bs_data_pair][pb] & 7; |
394 | 35.5k | } else { |
395 | 35.5k | lastdata[j] = data[set_index + bs_data_pair][pb] & 15; |
396 | 35.5k | } |
397 | 187k | } else { |
398 | 187k | lastdata[j] = data[set_index + bs_data_pair][pb]; |
399 | 187k | } |
400 | 247k | } |
401 | 161k | } |
402 | | |
403 | 19.9k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
404 | | |
405 | 19.9k | if (bs_data_pair) { |
406 | 7.90k | frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] = |
407 | 7.90k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
408 | 7.90k | frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] = |
409 | 7.90k | frame_xxx_data->bs_freq_res_stride_xxx[set_index]; |
410 | 7.90k | } |
411 | 19.9k | set_index += bs_data_pair + 1; |
412 | 19.9k | } |
413 | 20.9k | } |
414 | 245k | } |
415 | 191k | return err; |
416 | 191k | } |
417 | | |
418 | | IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, |
419 | | WORD32 usac_independency_flag, |
420 | 89.2k | ia_bit_buf_struct *bitstream) { |
421 | 89.2k | WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch; |
422 | 89.2k | WORD32 ps, pg, ts, pb; |
423 | 89.2k | WORD32 env_shape_data[MAX_TIME_SLOTS]; |
424 | | |
425 | 89.2k | WORD32 bits_param_slot = 0; |
426 | | |
427 | 89.2k | ia_mps_bs_frame *frame = &(self->bs_frame); |
428 | 89.2k | IA_ERRORCODE err = IA_NO_ERROR; |
429 | | |
430 | 89.2k | if (self->parse_nxt_frame == 0) return IA_NO_ERROR; |
431 | | |
432 | 89.2k | self->num_parameter_sets_prev = self->num_parameter_sets; |
433 | | |
434 | 89.2k | if (self->bs_high_rate_mode) { |
435 | 35.2k | bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1); |
436 | 35.2k | self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1; |
437 | 54.0k | } else { |
438 | 54.0k | bs_frame_type = 0; |
439 | 54.0k | self->num_parameter_sets = 1; |
440 | 54.0k | } |
441 | | |
442 | 89.2k | if (self->time_slots == 32) |
443 | 66.9k | bits_param_slot = 5; |
444 | 22.2k | else if (self->time_slots == 64) |
445 | 22.2k | bits_param_slot = 6; |
446 | | |
447 | 89.2k | if (bs_frame_type) { |
448 | 4.01k | WORD32 prev_param_slot = -1; |
449 | 8.56k | for (i = 0; i < self->num_parameter_sets; i++) { |
450 | 4.62k | self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot); |
451 | | |
452 | 4.62k | if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) { |
453 | 77 | return IA_FATAL_ERROR; |
454 | 77 | } |
455 | 4.55k | prev_param_slot = self->param_slots[i]; |
456 | 4.55k | } |
457 | 85.2k | } else { |
458 | 195k | for (i = 0; i < self->num_parameter_sets; i++) { |
459 | 110k | self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) / |
460 | 110k | self->num_parameter_sets) - |
461 | 110k | 1; |
462 | 110k | } |
463 | 85.2k | } |
464 | | |
465 | 89.1k | if (!usac_independency_flag) { |
466 | 86.3k | frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1); |
467 | 86.3k | } else { |
468 | 2.82k | frame->independency_flag = 1; |
469 | 2.82k | } |
470 | | |
471 | 89.1k | err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD); |
472 | 89.1k | if (err) return err; |
473 | | |
474 | 89.1k | err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC); |
475 | 89.1k | if (err) return err; |
476 | | |
477 | 89.1k | if (self->config->bs_phase_coding) { |
478 | 63.6k | self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1); |
479 | | |
480 | 63.6k | if (!self->bs_phase_mode) { |
481 | 724k | for (pb = 0; pb < self->num_bands_ipd; pb++) { |
482 | 674k | frame->ipd_idx_data_prev[pb] = 0; |
483 | 1.56M | for (i = 0; i < self->num_parameter_sets; i++) { |
484 | 895k | frame->ipd_idx_data[i][pb] = 0; |
485 | 895k | self->bs_frame.ipd_idx[i][pb] = 0; |
486 | 895k | } |
487 | 674k | self->bs_frame.ipd_idx_prev[pb] = 0; |
488 | 674k | } |
489 | 50.1k | self->opd_smoothing_mode = 0; |
490 | 50.1k | } else { |
491 | 13.5k | self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1); |
492 | 13.5k | err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data, |
493 | 13.5k | IPD); |
494 | 13.5k | if (err) return err; |
495 | 13.5k | } |
496 | 63.6k | } |
497 | | |
498 | 25.4k | else { |
499 | 25.4k | self->bs_phase_mode = 0; |
500 | 302k | for (pb = 0; pb < self->num_bands_ipd; pb++) { |
501 | 277k | frame->ipd_idx_data_prev[pb] = 0; |
502 | 640k | for (i = 0; i < self->num_parameter_sets; i++) { |
503 | 363k | frame->ipd_idx_data[i][pb] = 0; |
504 | 363k | self->bs_frame.ipd_idx[i][pb] = 0; |
505 | 363k | } |
506 | 277k | self->bs_frame.ipd_idx_prev[pb] = 0; |
507 | 277k | } |
508 | 25.4k | self->opd_smoothing_mode = 0; |
509 | 25.4k | } |
510 | | |
511 | 89.1k | if (self->bs_high_rate_mode) { |
512 | 95.4k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
513 | 60.3k | frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2); |
514 | 60.3k | if (frame->bs_smooth_mode[ps] >= 2) { |
515 | 10.7k | frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2); |
516 | 10.7k | } |
517 | 60.3k | if (frame->bs_smooth_mode[ps] == 3) { |
518 | 2.15k | frame->bs_freq_res_stride_smg[ps] = |
519 | 2.15k | ixheaacd_read_bits_buf(bitstream, 2); |
520 | 2.15k | data_bands = |
521 | 2.15k | (self->bs_param_bands - 1) / |
522 | 2.15k | ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] + |
523 | 2.15k | 1; |
524 | 18.7k | for (pg = 0; pg < data_bands; pg++) { |
525 | 16.5k | frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1); |
526 | 16.5k | } |
527 | 2.15k | } |
528 | 60.3k | } |
529 | 54.0k | } else { |
530 | 108k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
531 | 53.9k | frame->bs_smooth_mode[ps] = 0; |
532 | 53.9k | } |
533 | 54.0k | } |
534 | | |
535 | 267k | for (i = 0; i < 2; i++) { |
536 | 178k | self->temp_shape_enable_ch_stp[i] = 0; |
537 | 178k | self->temp_shape_enable_ch_ges[i] = 0; |
538 | 178k | } |
539 | | |
540 | 89.1k | self->bs_tsd_enable = 0; |
541 | 89.1k | if (self->config->bs_temp_shape_config == 3) { |
542 | 46.1k | self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1); |
543 | 46.1k | } else if (self->config->bs_temp_shape_config != 0) { |
544 | 20.9k | bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1); |
545 | 20.9k | if (bs_temp_shape_enable) { |
546 | 4.15k | num_of_temp_shape_ch = 2; |
547 | 4.15k | switch (self->config->bs_temp_shape_config) { |
548 | 1.27k | case 1: |
549 | 3.81k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
550 | 2.54k | self->temp_shape_enable_ch_stp[i] = |
551 | 2.54k | ixheaacd_read_bits_buf(bitstream, 1); |
552 | 2.54k | } |
553 | 1.27k | break; |
554 | 2.88k | case 2: |
555 | 8.64k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
556 | 5.76k | self->temp_shape_enable_ch_ges[i] = |
557 | 5.76k | ixheaacd_read_bits_buf(bitstream, 1); |
558 | 5.76k | } |
559 | 8.63k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
560 | 5.75k | if (self->temp_shape_enable_ch_ges[i]) { |
561 | 2.62k | ixheaacd_mps_huff_decode(bitstream, env_shape_data, |
562 | 2.62k | self->time_slots); |
563 | 110k | for (ts = 0; ts < self->time_slots; ts++) { |
564 | 108k | self->env_shape_data[i][ts] = (FLOAT32)pow( |
565 | 108k | 2, (FLOAT32)env_shape_data[ts] / |
566 | 108k | (self->config->bs_env_quant_mode + 2) - |
567 | 108k | 1); |
568 | 108k | } |
569 | 2.62k | } |
570 | 5.75k | } |
571 | 2.88k | break; |
572 | 0 | default: |
573 | 0 | return -1; |
574 | 4.15k | } |
575 | 4.15k | } |
576 | 20.9k | } |
577 | | |
578 | 89.1k | if (self->bs_tsd_enable) { |
579 | 9.74k | UWORD16 s[4]; |
580 | 9.74k | UWORD64 s_64; |
581 | 9.74k | UWORD16 c[5]; |
582 | 9.74k | UWORD64 c_64; |
583 | 9.74k | UWORD16 b; |
584 | 9.74k | UWORD16 r[1]; |
585 | 9.74k | static const UWORD16 table_64[] = { |
586 | 9.74k | 6, 11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49, |
587 | 9.74k | 51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61}; |
588 | 9.74k | static const UWORD16 table_32[] = {5, 9, 13, 16, 18, 20, 22, 24, |
589 | 9.74k | 25, 26, 27, 28, 29, 29, 30, 30}; |
590 | 9.74k | unsigned const short *tab = NULL; |
591 | 9.74k | WORD32 k; |
592 | 9.74k | UWORD16 h; |
593 | 9.74k | WORD32 nbits_tr_slots = 0; |
594 | | |
595 | 9.74k | if (self->time_slots == 32) { |
596 | 5.19k | nbits_tr_slots = 4; |
597 | 5.19k | tab = table_32; |
598 | 5.19k | } else if (self->time_slots == 64) { |
599 | 4.54k | nbits_tr_slots = 5; |
600 | 4.54k | tab = table_64; |
601 | 4.54k | } |
602 | | |
603 | 9.74k | self->tsd_num_tr_slots = ixheaacd_read_bits_buf(bitstream, nbits_tr_slots); |
604 | 9.74k | self->tsd_num_tr_slots++; |
605 | 9.74k | self->tsd_codeword_len = tab[self->tsd_num_tr_slots - 1]; |
606 | | |
607 | 9.74k | if (self->tsd_codeword_len > 48) { |
608 | 155 | s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48); |
609 | 155 | s_64 = s[3]; |
610 | 155 | s[2] = ixheaacd_read_bits_buf(bitstream, 16); |
611 | 155 | s_64 = (s_64 << 16) | s[2]; |
612 | 155 | s[1] = ixheaacd_read_bits_buf(bitstream, 16); |
613 | 155 | s_64 = (s_64 << 16) | s[1]; |
614 | 155 | s[0] = ixheaacd_read_bits_buf(bitstream, 16); |
615 | 155 | s_64 = (s_64 << 16) | s[0]; |
616 | 9.58k | } else if (self->tsd_codeword_len > 32) { |
617 | 1.64k | s[3] = 0; |
618 | 1.64k | s_64 = s[3]; |
619 | 1.64k | s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32); |
620 | 1.64k | s_64 = (s_64 << 16) | s[2]; |
621 | 1.64k | s[1] = ixheaacd_read_bits_buf(bitstream, 16); |
622 | 1.64k | s_64 = (s_64 << 16) | s[1]; |
623 | 1.64k | s[0] = ixheaacd_read_bits_buf(bitstream, 16); |
624 | 1.64k | s_64 = (s_64 << 16) | s[0]; |
625 | 7.94k | } else if (self->tsd_codeword_len > 16) { |
626 | 3.48k | s[3] = 0; |
627 | 3.48k | s_64 = s[3]; |
628 | 3.48k | s[2] = 0; |
629 | 3.48k | s_64 = (s_64 << 16) | s[2]; |
630 | 3.48k | s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16); |
631 | 3.48k | s_64 = (s_64 << 16) | s[1]; |
632 | 3.48k | s[0] = ixheaacd_read_bits_buf(bitstream, 16); |
633 | 3.48k | s_64 = (s_64 << 16) | s[0]; |
634 | 4.46k | } else { |
635 | 4.46k | s[3] = 0; |
636 | 4.46k | s_64 = s[3]; |
637 | 4.46k | s[2] = 0; |
638 | 4.46k | s_64 = (s_64 << 16) | s[2]; |
639 | 4.46k | s[1] = 0; |
640 | 4.46k | s_64 = (s_64 << 16) | s[1]; |
641 | 4.46k | s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len); |
642 | 4.46k | s_64 = (s_64 << 16) | s[0]; |
643 | 4.46k | } |
644 | | |
645 | 9.74k | { |
646 | 9.74k | WORD32 p = self->tsd_num_tr_slots; |
647 | | |
648 | 466k | for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0; |
649 | | |
650 | 374k | for (k = self->time_slots - 1; k >= 0; k--) { |
651 | 374k | if (p > k) { |
652 | 2.27k | for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1; |
653 | 773 | break; |
654 | 773 | } |
655 | | |
656 | 373k | c[0] = k - p + 1; |
657 | 373k | c_64 = c[0]; |
658 | 1.86M | for (i = 1; i < 5; i++) c[i] = 0; |
659 | | |
660 | 1.37M | for (h = 2; h <= p; h++) { |
661 | 1.00M | b = k - p + h; |
662 | 1.00M | c_64 = c_64 * (b / h); |
663 | 1.00M | ixheaacd_longmult1(c, b, c, 5); |
664 | 1.00M | b = h; |
665 | 1.00M | ixheaacd_longdiv(c, b, c, r, 5); |
666 | 1.00M | } |
667 | | |
668 | 373k | if (ixheaacd_longcompare(s, c, 4)) { |
669 | 60.6k | ixheaacd_longsub(s, c, 4, 4); |
670 | 60.6k | self->bs_tsd_sep_data[k] = 1; |
671 | 60.6k | p--; |
672 | 60.6k | if (p == 0) break; |
673 | 60.6k | } |
674 | 373k | } |
675 | 9.74k | } |
676 | | |
677 | 466k | for (i = 0; i < self->time_slots; i++) { |
678 | 456k | if (self->bs_tsd_sep_data[i]) |
679 | 62.0k | self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3); |
680 | 456k | } |
681 | 9.74k | } |
682 | | |
683 | 89.1k | self->parse_nxt_frame = 0; |
684 | 89.1k | return err; |
685 | 89.1k | } |
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 | 16.8k | WORD32 start_band) { |
691 | 16.8k | WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx; |
692 | 16.8k | WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0}; |
693 | 16.8k | WORD32 band_stop = 0; |
694 | | |
695 | 16.8k | WORD32 *lastdata = NULL; |
696 | 16.8k | ia_mps_data_struct *frame_xxx_data = NULL; |
697 | 16.8k | WORD32 default_val = 0; |
698 | | |
699 | 16.8k | ia_mps_bs_frame *frame = &(self->bs_frame); |
700 | | |
701 | 16.8k | if (datatype == CLD) { |
702 | 12.6k | frame_xxx_data = &frame->cld_data; |
703 | 12.6k | lastdata = frame->cmp_cld_idx_prev; |
704 | 12.6k | band_stop = self->bs_param_bands; |
705 | 12.6k | } else if (datatype == ICC) { |
706 | 4.19k | frame_xxx_data = &frame->icc_data; |
707 | 4.19k | lastdata = frame->cmp_icc_idx_prev; |
708 | 4.19k | band_stop = self->bs_param_bands; |
709 | 4.19k | } 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 | 38.9k | for (i = 0; i < self->num_parameter_sets; i++) { |
719 | 22.1k | frame_xxx_data->bs_xxx_data_mode[i] = |
720 | 22.1k | ixheaacd_read_bits_buf(it_bit_buff, 2); |
721 | 22.1k | } |
722 | | |
723 | 16.8k | set_index = 0; |
724 | 16.8k | bs_data_pair = 0; |
725 | 16.8k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev; |
726 | | |
727 | 38.9k | for (i = 0; i < self->num_parameter_sets; i++) { |
728 | 22.1k | if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { |
729 | 91.9k | for (pb = 0; pb < band_stop; pb++) { |
730 | 81.8k | lastdata[pb] = default_val; |
731 | 81.8k | } |
732 | | |
733 | 10.0k | old_quant_coarse_xxx = 0; |
734 | 10.0k | } |
735 | | |
736 | 22.1k | if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { |
737 | 7.37k | if (bs_data_pair) { |
738 | 1.42k | bs_data_pair = 0; |
739 | 5.95k | } else { |
740 | 5.95k | bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1); |
741 | 5.95k | frame_xxx_data->bs_quant_coarse_xxx[set_index] = |
742 | 5.95k | ixheaacd_read_bits_buf(it_bit_buff, 1); |
743 | 5.95k | frame_xxx_data->bs_freq_res_stride_xxx[set_index] = |
744 | 5.95k | ixheaacd_read_bits_buf(it_bit_buff, 2); |
745 | | |
746 | 5.95k | if (frame_xxx_data->bs_quant_coarse_xxx[set_index] != |
747 | 5.95k | old_quant_coarse_xxx) { |
748 | 4.59k | if (old_quant_coarse_xxx) { |
749 | 787 | ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0); |
750 | 3.80k | } else { |
751 | 3.80k | ixheaacd_mps_fine2coarse(lastdata, band_stop); |
752 | 3.80k | } |
753 | 4.59k | } |
754 | | |
755 | 5.95k | data_bands = ixheaacd_mps_getstridemap( |
756 | 5.95k | frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band, |
757 | 5.95k | band_stop, strides); |
758 | 30.6k | for (pb = 0; pb < data_bands; pb++) { |
759 | 24.7k | lastdata[pb] = lastdata[strides[pb]]; |
760 | 24.7k | } |
761 | | |
762 | 5.95k | ixheaacd_mps_ecdatapairdec( |
763 | 5.95k | it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair, |
764 | 5.95k | frame_xxx_data->bs_quant_coarse_xxx[set_index], |
765 | 5.95k | !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag); |
766 | | |
767 | 30.5k | for (pb = 0; pb < data_bands; pb++) { |
768 | 72.7k | for (j = strides[pb]; j < strides[pb + 1]; j++) { |
769 | 48.1k | 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 | 48.1k | } else { |
776 | 48.1k | lastdata[j] = data[set_index + bs_data_pair][pb]; |
777 | 48.1k | } |
778 | 48.1k | } |
779 | 24.5k | } |
780 | | |
781 | 5.95k | old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
782 | | |
783 | 5.95k | if (bs_data_pair) { |
784 | 4.42k | frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] = |
785 | 4.42k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
786 | 4.42k | frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] = |
787 | 4.42k | frame_xxx_data->bs_freq_res_stride_xxx[set_index]; |
788 | 4.42k | } |
789 | 5.95k | set_index += bs_data_pair + 1; |
790 | 5.95k | } |
791 | 7.37k | } |
792 | 22.1k | } |
793 | 16.8k | } |
794 | | |
795 | | IA_ERRORCODE ixheaacd_ld_mps_frame_parsing( |
796 | 2.43k | ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) { |
797 | 2.43k | WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, |
798 | 2.43k | num_of_temp_shape_ch; |
799 | 2.43k | WORD32 ps, pg, ts, ic; |
800 | 2.43k | WORD32 env_shape_data[MAX_TIME_SLOTS]; |
801 | 2.43k | WORD32 alignment; |
802 | 2.43k | WORD32 bits_param_slot = 0; |
803 | | |
804 | 2.43k | ia_mps_bs_frame *frame = &(self->bs_frame); |
805 | 2.43k | alignment = it_bit_buff->cnt_bits; |
806 | 2.43k | if (self->parse_nxt_frame == 0) return IA_NO_ERROR; |
807 | | |
808 | 2.43k | self->num_parameter_sets_prev = self->num_parameter_sets; |
809 | | |
810 | 2.43k | bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1); |
811 | 2.43k | self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1; |
812 | | |
813 | 2.43k | if (self->time_slots == 32) |
814 | 231 | bits_param_slot = 5; |
815 | 2.20k | else if (self->time_slots == 64) |
816 | 0 | bits_param_slot = 6; |
817 | 2.20k | else if (self->time_slots == 8) |
818 | 23 | bits_param_slot = 3; |
819 | 2.18k | else if (self->time_slots == 16 || self->time_slots == 15) |
820 | 84 | bits_param_slot = 4; |
821 | | |
822 | 2.43k | if (bs_frame_type) { |
823 | 539 | WORD32 prev_param_slot = -1; |
824 | 1.08k | for (i = 0; i < self->num_parameter_sets; i++) { |
825 | 565 | self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot); |
826 | | |
827 | 565 | if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) { |
828 | 23 | return IA_FATAL_ERROR; |
829 | 23 | } |
830 | 542 | prev_param_slot = self->param_slots[i]; |
831 | 542 | } |
832 | 1.89k | } else { |
833 | 4.58k | for (i = 0; i < self->num_parameter_sets; i++) { |
834 | 2.68k | self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) / |
835 | 2.68k | self->num_parameter_sets) - |
836 | 2.68k | 1; |
837 | 2.68k | } |
838 | 1.89k | } |
839 | | |
840 | 2.41k | frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1); |
841 | | |
842 | 10.5k | for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) { |
843 | 8.11k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD, |
844 | 8.11k | 0); |
845 | 8.11k | } |
846 | | |
847 | 2.41k | if (self->ldmps_config.bs_one_icc) { |
848 | 1.52k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC, |
849 | 1.52k | 0); |
850 | 1.52k | } else { |
851 | 4.07k | for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) { |
852 | 3.18k | if (!self->ldmps_config.ott_mode_lfe[i]) |
853 | 2.66k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, |
854 | 2.66k | ICC, 0); |
855 | 3.18k | } |
856 | 887 | } |
857 | | |
858 | 5.58k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
859 | 3.16k | frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2); |
860 | 3.16k | if (frame->bs_smooth_mode[ps] >= 2) { |
861 | 1.23k | frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2); |
862 | 1.23k | } |
863 | 3.16k | if (frame->bs_smooth_mode[ps] == 3) { |
864 | 894 | frame->bs_freq_res_stride_smg[ps] = |
865 | 894 | ixheaacd_read_bits_buf(it_bit_buff, 2); |
866 | 894 | data_bands = |
867 | 894 | (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) / |
868 | 894 | ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] + |
869 | 894 | 1; |
870 | 2.69k | for (pg = 0; pg < data_bands; pg++) { |
871 | 1.80k | frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1); |
872 | 1.80k | } |
873 | 894 | } |
874 | 3.16k | } |
875 | | |
876 | 7.20k | for (i = 0; i < 2; i++) { |
877 | 4.78k | self->temp_shape_enable_ch_stp[i] = 0; |
878 | 4.78k | self->temp_shape_enable_ch_ges[i] = 0; |
879 | 4.78k | } |
880 | | |
881 | 2.41k | if (self->ldmps_config.bs_temp_shape_config != 0) { |
882 | 1.90k | bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1); |
883 | 1.90k | if (bs_temp_shape_enable) { |
884 | 967 | num_of_temp_shape_ch = 2; |
885 | 967 | switch (self->ldmps_config.bs_temp_shape_config) { |
886 | 137 | case 1: |
887 | 411 | for (i = 0; i < num_of_temp_shape_ch; i++) { |
888 | 274 | self->temp_shape_enable_ch_stp[i] = |
889 | 274 | ixheaacd_read_bits_buf(it_bit_buff, 1); |
890 | 274 | } |
891 | 137 | break; |
892 | 819 | case 2: |
893 | 2.45k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
894 | 1.63k | self->temp_shape_enable_ch_ges[i] = |
895 | 1.63k | ixheaacd_read_bits_buf(it_bit_buff, 1); |
896 | 1.63k | } |
897 | 2.45k | for (i = 0; i < num_of_temp_shape_ch; i++) { |
898 | 1.63k | if (self->temp_shape_enable_ch_ges[i]) { |
899 | 644 | ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data, |
900 | 644 | self->time_slots); |
901 | 1.66k | for (ts = 0; ts < self->time_slots; ts++) { |
902 | 1.02k | self->env_shape_data[i][ts] = (FLOAT32)pow( |
903 | 1.02k | 2, (FLOAT32)env_shape_data[ts] / |
904 | 1.02k | (self->ldmps_config.bs_env_quant_mode + 2) - |
905 | 1.02k | 1); |
906 | 1.02k | } |
907 | 644 | } |
908 | 1.63k | } |
909 | 819 | break; |
910 | 11 | default: |
911 | 11 | if (self->ec_flag == 0) { |
912 | 11 | return IA_FATAL_ERROR; |
913 | 11 | } |
914 | 0 | break; |
915 | 967 | } |
916 | 967 | } |
917 | 1.90k | } |
918 | | |
919 | 2.40k | if (self->ldmps_config.bs_arbitrary_downmix != 0) { |
920 | 6.56k | for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) { |
921 | 4.54k | ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, |
922 | 4.54k | CLD, 0); |
923 | 4.54k | } |
924 | 2.02k | } |
925 | | |
926 | 2.40k | ixheaacd_byte_align(it_bit_buff, &alignment); |
927 | | |
928 | 10.7M | while (it_bit_buff->cnt_bits > 8) { |
929 | 10.7M | ixheaacd_read_bits_buf(it_bit_buff, 8); |
930 | 10.7M | } |
931 | 2.40k | ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits); |
932 | 2.40k | return IA_NO_ERROR; |
933 | 2.41k | } |
934 | | |
935 | | static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1], |
936 | | WORD32 band_start, WORD32 band_stop, |
937 | 49.4k | WORD32 ch_fac) { |
938 | 49.4k | WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i; |
939 | 49.4k | WORD32 vdk[MAX_PARAMETER_BANDS + 1]; |
940 | 49.4k | input_bands = band_stop - band_start; |
941 | 49.4k | out_bands = (input_bands - 1) / ch_fac + 1; |
942 | 49.4k | if (out_bands < 1) { |
943 | 0 | out_bands = 1; |
944 | 0 | } |
945 | | |
946 | 49.4k | bands_achived = out_bands * ch_fac; |
947 | 49.4k | bands_diff = input_bands - bands_achived; |
948 | 394k | for (i = 0; i < out_bands; i++) { |
949 | 345k | vdk[i] = ch_fac; |
950 | 345k | } |
951 | | |
952 | 49.4k | if (bands_diff > 0) { |
953 | 0 | incr = -1; |
954 | 0 | k = out_bands - 1; |
955 | 49.4k | } else { |
956 | 49.4k | incr = 1; |
957 | 49.4k | k = 0; |
958 | 49.4k | } |
959 | | |
960 | 167k | while (bands_diff != 0) { |
961 | 118k | vdk[k] = vdk[k] - incr; |
962 | 118k | k = k + incr; |
963 | 118k | bands_diff = bands_diff + incr; |
964 | 118k | if (k >= out_bands) { |
965 | 96.8k | if (bands_diff > 0) { |
966 | 0 | k = out_bands - 1; |
967 | 96.8k | } else if (bands_diff < 0) { |
968 | 90.5k | k = 0; |
969 | 90.5k | } |
970 | 96.8k | } |
971 | 118k | } |
972 | 49.4k | map[0] = band_start; |
973 | 394k | for (i = 0; i < out_bands; i++) { |
974 | 345k | map[i + 1] = map[i] + vdk[i]; |
975 | 345k | } |
976 | 49.4k | } |
977 | | |
978 | | static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map, |
979 | 46.6k | WORD32 data_bands) { |
980 | 46.6k | WORD32 i, j, band_start, band_stop, value; |
981 | 46.6k | WORD32 start_band_0 = map[0]; |
982 | | |
983 | 369k | for (i = 0; i < data_bands; i++) { |
984 | 323k | value = in[i + start_band_0]; |
985 | | |
986 | 323k | band_start = map[i]; |
987 | 323k | band_stop = map[i + 1]; |
988 | 903k | for (j = band_start; j < band_stop; j++) { |
989 | 579k | out[j] = value; |
990 | 579k | } |
991 | 323k | } |
992 | 46.6k | } |
993 | | |
994 | 3.57M | static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) { |
995 | 3.57M | switch (param_type) { |
996 | 1.30M | case CLD: |
997 | 1.30M | return ixheaacd_cld_de_quant_table[(value + 15)]; |
998 | | |
999 | 1.30M | case ICC: |
1000 | 1.30M | return ixheaacd_icc_de_quant_table[value]; |
1001 | | |
1002 | 969k | case IPD: |
1003 | 969k | return ixheaacd_ipd_de_quant_table[(value & 15)]; |
1004 | | |
1005 | 0 | default: |
1006 | 0 | return 0; |
1007 | 0 | return 0; |
1008 | 3.57M | } |
1009 | 3.57M | } |
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 | 246k | WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) { |
1017 | 246k | WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0}; |
1018 | 246k | WORD32 map[MAX_PARAMETER_BANDS + 1]; |
1019 | | |
1020 | 246k | WORD32 set_index, i, band, parm_slot; |
1021 | 246k | WORD32 data_bands, ch_fac; |
1022 | 246k | WORD32 ps; |
1023 | | |
1024 | 246k | WORD32 i1, i2, x1, xi, x2; |
1025 | 246k | WORD32 band_start = 0; |
1026 | 246k | WORD32 ext_frame_flag = self->ext_frame_flag; |
1027 | 246k | WORD32 *param_slots = self->param_slots; |
1028 | 246k | WORD32 num_parameter_sets = self->num_parameter_sets; |
1029 | 246k | WORD32 band_stop = self->bs_param_bands; |
1030 | 246k | WORD32 default_val = 0; |
1031 | | |
1032 | 246k | set_index = 0; |
1033 | | |
1034 | 567k | for (i = 0; i < num_parameter_sets; i++) { |
1035 | 320k | if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { |
1036 | 202k | frame_xxx_data->quant_coarse_xxx_flag[i] = 0; |
1037 | 2.34M | for (band = band_start; band < band_stop; band++) { |
1038 | 2.13M | out_idx_data[i][band] = default_val; |
1039 | 2.13M | } |
1040 | 2.34M | for (band = band_start; band < band_stop; band++) { |
1041 | 2.13M | idx_prev[band] = out_idx_data[i][band]; |
1042 | 2.13M | } |
1043 | | |
1044 | 202k | frame_xxx_data->bs_quant_coarse_xxx_prev = 0; |
1045 | 202k | } |
1046 | | |
1047 | 320k | if (frame_xxx_data->bs_xxx_data_mode[i] == 1) { |
1048 | 485k | for (band = band_start; band < band_stop; band++) { |
1049 | 447k | out_idx_data[i][band] = idx_prev[band]; |
1050 | 447k | } |
1051 | 37.4k | frame_xxx_data->quant_coarse_xxx_flag[i] = |
1052 | 37.4k | frame_xxx_data->bs_quant_coarse_xxx_prev; |
1053 | 37.4k | } |
1054 | | |
1055 | 320k | if (frame_xxx_data->bs_xxx_data_mode[i] == 2) { |
1056 | 450k | for (band = band_start; band < band_stop; band++) { |
1057 | 416k | out_idx_data[i][band] = idx_prev[band]; |
1058 | 416k | } |
1059 | 33.4k | frame_xxx_data->quant_coarse_xxx_flag[i] = |
1060 | 33.4k | frame_xxx_data->bs_quant_coarse_xxx_prev; |
1061 | 33.4k | interpolate_local[i] = 1; |
1062 | 286k | } else { |
1063 | 286k | interpolate_local[i] = 0; |
1064 | 286k | } |
1065 | | |
1066 | 320k | if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { |
1067 | 46.6k | parm_slot = i; |
1068 | 46.6k | ch_fac = |
1069 | 46.6k | ixheaacd_mps_stride_table[frame_xxx_data |
1070 | 46.6k | ->bs_freq_res_stride_xxx[set_index]]; |
1071 | 46.6k | data_bands = (band_stop - band_start - 1) / ch_fac + 1; |
1072 | 46.6k | ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac); |
1073 | 46.6k | ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0], |
1074 | 46.6k | &out_idx_data[parm_slot][0], map, data_bands); |
1075 | | |
1076 | 626k | for (band = band_start; band < band_stop; band++) { |
1077 | 579k | idx_prev[band] = out_idx_data[parm_slot][band]; |
1078 | 579k | } |
1079 | | |
1080 | 46.6k | frame_xxx_data->bs_quant_coarse_xxx_prev = |
1081 | 46.6k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
1082 | 46.6k | frame_xxx_data->quant_coarse_xxx_flag[i] = |
1083 | 46.6k | frame_xxx_data->bs_quant_coarse_xxx[set_index]; |
1084 | | |
1085 | 46.6k | set_index++; |
1086 | 46.6k | } |
1087 | 320k | } |
1088 | | |
1089 | 567k | for (i = 0; i < num_parameter_sets; i++) { |
1090 | 320k | if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) { |
1091 | 40.0k | ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start, |
1092 | 40.0k | band_stop - band_start); |
1093 | 40.0k | frame_xxx_data->quant_coarse_xxx_flag[i] = 0; |
1094 | 40.0k | } |
1095 | 320k | } |
1096 | | |
1097 | 246k | i1 = -1; |
1098 | 246k | x1 = 0; |
1099 | 246k | i2 = 0; |
1100 | 566k | for (i = 0; i < num_parameter_sets; i++) { |
1101 | 320k | if (interpolate_local[i] != 1) { |
1102 | 286k | i1 = i; |
1103 | 286k | } |
1104 | 320k | i2 = i; |
1105 | 354k | while (interpolate_local[i2] == 1) { |
1106 | 34.1k | i2++; |
1107 | 34.1k | } |
1108 | 320k | if (i1 == -1) { |
1109 | 27.9k | x1 = 0; |
1110 | 27.9k | i1 = 0; |
1111 | 292k | } else { |
1112 | 292k | x1 = param_slots[i1]; |
1113 | 292k | } |
1114 | 320k | xi = param_slots[i]; |
1115 | 320k | x2 = param_slots[i2]; |
1116 | | |
1117 | 320k | if (interpolate_local[i] == 1) { |
1118 | 33.3k | if (i2 < num_parameter_sets) { |
1119 | 144 | if (self->ec_flag == 0) { |
1120 | 144 | return IA_FATAL_ERROR; |
1121 | 144 | } |
1122 | 144 | } |
1123 | | |
1124 | 447k | for (band = band_start; band < band_stop; band++) { |
1125 | 414k | WORD32 yi, y1, y2; |
1126 | 414k | yi = 0; |
1127 | 414k | y1 = out_idx_data[i1][band]; |
1128 | 414k | y2 = out_idx_data[i2][band]; |
1129 | 414k | if (param_type == IPD) { |
1130 | 115k | if (y2 - y1 > 8) y1 += 16; |
1131 | 115k | if (y1 - y2 > 8) y2 += 16; |
1132 | | |
1133 | 115k | if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16; |
1134 | 298k | } else { |
1135 | 298k | if (x2 != x1) { |
1136 | 56.2k | yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1); |
1137 | 56.2k | } |
1138 | 298k | } |
1139 | 414k | out_idx_data[i][band] = yi; |
1140 | 414k | } |
1141 | 33.2k | } |
1142 | 320k | } |
1143 | | |
1144 | 566k | for (ps = 0; ps < num_parameter_sets; ps++) { |
1145 | 3.89M | for (band = band_start; band < band_stop; band++) { |
1146 | 3.57M | if (param_type == CLD) { |
1147 | 1.30M | out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15); |
1148 | 2.27M | } else if (param_type == ICC) |
1149 | 1.30M | { |
1150 | 1.30M | out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7); |
1151 | 1.30M | } |
1152 | 3.57M | out_data[ps][band] = |
1153 | 3.57M | ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type); |
1154 | 3.57M | } |
1155 | 319k | } |
1156 | | |
1157 | 246k | if (ext_frame_flag) { |
1158 | 95.0k | for (band = band_start; band < band_stop; band++) { |
1159 | 84.7k | out_data[num_parameter_sets][band] = |
1160 | 84.7k | out_data[num_parameter_sets - 1][band]; |
1161 | 84.7k | out_idx_data[num_parameter_sets][band] = |
1162 | 84.7k | out_idx_data[num_parameter_sets - 1][band]; |
1163 | 84.7k | } |
1164 | 10.2k | } |
1165 | 246k | return IA_NO_ERROR; |
1166 | 246k | } |
1167 | | |
1168 | | static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott( |
1169 | 91.5k | ia_mps_dec_state_struct *self) { |
1170 | 91.5k | ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame); |
1171 | 91.5k | IA_ERRORCODE err_code = 0; |
1172 | | |
1173 | 91.5k | err_code = ixheaacd_mps_mapindexdata( |
1174 | 91.5k | self, &cur_bit_stream_ptr->cld_data, self->cld_data, |
1175 | 91.5k | cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx, |
1176 | 91.5k | cur_bit_stream_ptr->cld_idx_pre, CLD); |
1177 | 91.5k | if (err_code != IA_NO_ERROR) return err_code; |
1178 | 91.5k | err_code = ixheaacd_mps_mapindexdata( |
1179 | 91.5k | self, &cur_bit_stream_ptr->icc_data, self->icc_data, |
1180 | 91.5k | cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx, |
1181 | 91.5k | cur_bit_stream_ptr->icc_idx_pre, ICC); |
1182 | 91.5k | if (err_code != IA_NO_ERROR) return err_code; |
1183 | 91.4k | if ((self->config->bs_phase_coding)) { |
1184 | 63.5k | err_code = ixheaacd_mps_mapindexdata( |
1185 | 63.5k | self, &cur_bit_stream_ptr->ipd_data, self->ipd_data, |
1186 | 63.5k | cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data, |
1187 | 63.5k | cur_bit_stream_ptr->ipd_idx_prev, IPD); |
1188 | | |
1189 | 63.5k | if (err_code != IA_NO_ERROR) return err_code; |
1190 | 63.5k | } |
1191 | 91.4k | return IA_NO_ERROR; |
1192 | 91.4k | } |
1193 | | |
1194 | 91.4k | static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { |
1195 | 91.4k | WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop, |
1196 | 91.4k | group_to_band[MAX_PARAMETER_BANDS + 1]; |
1197 | 91.4k | ia_mps_bs_frame *frame = &(self->bs_frame); |
1198 | 209k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
1199 | 117k | switch (frame->bs_smooth_mode[ps]) { |
1200 | 101k | case 0: |
1201 | 101k | self->smoothing_time[ps] = 256; |
1202 | 101k | self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f); |
1203 | | |
1204 | 1.21M | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1205 | 1.11M | self->smoothing_data[ps][pb] = 0; |
1206 | 1.11M | } |
1207 | 101k | break; |
1208 | | |
1209 | 5.06k | case 1: |
1210 | 5.06k | if (ps > 0) { |
1211 | 2.46k | self->smoothing_time[ps] = self->smoothing_time[ps - 1]; |
1212 | 2.46k | self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1]; |
1213 | 2.60k | } else { |
1214 | 2.60k | self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time; |
1215 | 2.60k | self->inv_smoothing_time[ps] = |
1216 | 2.60k | self->smoothing_filt_state.inv_prev_smg_time; |
1217 | 2.60k | } |
1218 | | |
1219 | 56.5k | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1220 | 51.4k | if (ps > 0) |
1221 | 25.6k | self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb]; |
1222 | 25.8k | else |
1223 | 25.8k | self->smoothing_data[ps][pb] = |
1224 | 25.8k | self->smoothing_filt_state.prev_smg_data[pb]; |
1225 | 51.4k | } |
1226 | 5.06k | break; |
1227 | | |
1228 | 8.71k | case 2: |
1229 | 8.71k | self->smoothing_time[ps] = |
1230 | 8.71k | ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1231 | 8.71k | self->inv_smoothing_time[ps] = |
1232 | 8.71k | ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1233 | 105k | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1234 | 96.3k | self->smoothing_data[ps][pb] = 1; |
1235 | 96.3k | } |
1236 | 8.71k | break; |
1237 | | |
1238 | 2.74k | case 3: |
1239 | 2.74k | self->smoothing_time[ps] = |
1240 | 2.74k | ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1241 | 2.74k | self->inv_smoothing_time[ps] = |
1242 | 2.74k | ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]]; |
1243 | | |
1244 | 2.74k | ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]]; |
1245 | 2.74k | data_bands = (self->bs_param_bands - 1) / ch_fac + 1; |
1246 | 2.74k | ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands, |
1247 | 2.74k | ch_fac); |
1248 | 24.5k | for (pg = 0; pg < data_bands; pg++) { |
1249 | 21.8k | param_band_start = group_to_band[pg]; |
1250 | 21.8k | param_band_stop = group_to_band[pg + 1]; |
1251 | 63.6k | for (pb = param_band_start; pb < param_band_stop; pb++) { |
1252 | 41.8k | self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg]; |
1253 | 41.8k | } |
1254 | 21.8k | } |
1255 | 2.74k | break; |
1256 | 117k | } |
1257 | 117k | } |
1258 | | |
1259 | 91.4k | self->smoothing_filt_state.prev_smg_time = |
1260 | 91.4k | self->smoothing_time[self->num_parameter_sets - 1]; |
1261 | 91.4k | self->smoothing_filt_state.inv_prev_smg_time = |
1262 | 91.4k | self->inv_smoothing_time[self->num_parameter_sets - 1]; |
1263 | 1.09M | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1264 | 1.00M | self->smoothing_filt_state.prev_smg_data[pb] = |
1265 | 1.00M | self->smoothing_data[self->num_parameter_sets - 1][pb]; |
1266 | 1.00M | } |
1267 | | |
1268 | 91.4k | if (self->ext_frame_flag) { |
1269 | 4.27k | self->smoothing_time[self->num_parameter_sets] = |
1270 | 4.27k | self->smoothing_time[self->num_parameter_sets - 1]; |
1271 | 4.27k | self->inv_smoothing_time[self->num_parameter_sets] = |
1272 | 4.27k | self->inv_smoothing_time[self->num_parameter_sets - 1]; |
1273 | 40.2k | for (pb = 0; pb < self->bs_param_bands; pb++) { |
1274 | 35.9k | self->smoothing_data[self->num_parameter_sets][pb] = |
1275 | 35.9k | self->smoothing_data[self->num_parameter_sets - 1][pb]; |
1276 | 35.9k | } |
1277 | 4.27k | } |
1278 | 91.4k | } |
1279 | | |
1280 | 91.5k | IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) { |
1281 | 91.5k | WORD32 i; |
1282 | 91.5k | IA_ERRORCODE err_code = 0; |
1283 | 91.5k | if (self->ldmps_config.ldmps_present_flag != 1) |
1284 | 89.0k | if (self->parse_nxt_frame == 1) return err_code; |
1285 | 91.5k | self->ext_frame_flag = 0; |
1286 | 91.5k | if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) { |
1287 | 4.27k | self->ext_frame_flag = 1; |
1288 | 4.27k | } |
1289 | | |
1290 | 91.5k | err_code = ixheaacd_mps_dec_and_mapframeott(self); |
1291 | 91.5k | if (err_code != IA_NO_ERROR) return err_code; |
1292 | 91.4k | ixheaacd_mps_dec_and_mapframesmg(self); |
1293 | | |
1294 | 91.4k | if (self->ext_frame_flag) { |
1295 | 4.27k | self->num_parameter_sets++; |
1296 | 4.27k | self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1; |
1297 | 4.27k | } |
1298 | 91.4k | self->param_slot_diff[0] = self->param_slots[0] + 1; |
1299 | 91.4k | 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 | 91.4k | self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0]; |
1307 | 91.4k | self->inv_param_slot_diff_Q30[0] = |
1308 | 91.4k | (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5); |
1309 | 122k | for (i = 1; i < self->num_parameter_sets; i++) { |
1310 | 30.6k | self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1]; |
1311 | 30.6k | if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) || |
1312 | 30.6k | (self->param_slot_diff[i] == 0)) { |
1313 | 3 | if (self->ec_flag == 0) { |
1314 | 3 | return -1; |
1315 | 3 | } else { |
1316 | 0 | self->param_slot_diff[i] = 1; |
1317 | 0 | self->inv_param_slot_diff[i] = 1; |
1318 | 0 | } |
1319 | 3 | } |
1320 | 30.6k | self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i]; |
1321 | 30.6k | self->inv_param_slot_diff_Q30[i] = |
1322 | 30.6k | (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5); |
1323 | 30.6k | } |
1324 | 91.4k | return IA_NO_ERROR; |
1325 | 91.4k | } |
1326 | | |
1327 | 3.19k | WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) { |
1328 | 3.19k | WORD32 samp_freq; |
1329 | 3.19k | WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000, |
1330 | 3.19k | 24000, 22050, 16000, 12000, 11025, 8000, |
1331 | 3.19k | 7350, 0, 0, 0}; |
1332 | | |
1333 | 3.19k | if (self->ldmps_config.ldmps_present_flag == 1) |
1334 | 1.18k | self->time_slots = self->frame_length + 1; |
1335 | 2.00k | else |
1336 | 2.00k | self->time_slots = self->frame_length; |
1337 | | |
1338 | 3.19k | self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res]; |
1339 | | |
1340 | 3.19k | if (self->ldmps_config.ldmps_present_flag == 1) { |
1341 | 1.18k | if (self->ldmps_config.bs_sampling_freq_index == 15) { |
1342 | 19 | samp_freq = self->ldmps_config.bs_fampling_frequency; |
1343 | 1.16k | } else { |
1344 | 1.16k | samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index]; |
1345 | 1.16k | } |
1346 | | |
1347 | 1.18k | if (samp_freq < 27713.0) { |
1348 | 730 | self->qmf_band_count = 32; |
1349 | 730 | } else if (samp_freq >= 55426.0) { |
1350 | 35 | self->qmf_band_count = 128; |
1351 | 420 | } else { |
1352 | 420 | self->qmf_band_count = 64; |
1353 | 420 | } |
1354 | 1.18k | } |
1355 | | |
1356 | 3.19k | if (self->object_type == AOT_ER_AAC_ELD || |
1357 | 3.19k | self->object_type == AOT_ER_AAC_LD) { |
1358 | 1.18k | self->bs_param_bands = |
1359 | 1.18k | ixheaacd_freq_res_table_ld[self->config->bs_freq_res]; |
1360 | 1.18k | self->hyb_band_count_max = self->qmf_band_count; |
1361 | 1.18k | } else |
1362 | 2.00k | self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10; |
1363 | | |
1364 | 3.19k | if (self->object_type == AOT_ER_AAC_ELD || |
1365 | 3.19k | self->object_type == AOT_ER_AAC_LD) { |
1366 | 1.18k | switch (self->bs_param_bands) { |
1367 | 61 | case 4: |
1368 | | |
1369 | 61 | self->hyb_band_to_processing_band_table = |
1370 | 61 | ixheaacd_hybrid_band_64_to_processing_band_4_map; |
1371 | 61 | break; |
1372 | 35 | case 5: |
1373 | | |
1374 | 35 | self->hyb_band_to_processing_band_table = |
1375 | 35 | ixheaacd_hybrid_band_64_to_processing_band_5_map; |
1376 | 35 | break; |
1377 | 42 | case 7: |
1378 | | |
1379 | 42 | self->hyb_band_to_processing_band_table = |
1380 | 42 | ixheaacd_hybrid_band_64_to_processing_band_7_map; |
1381 | 42 | break; |
1382 | 123 | case 9: |
1383 | | |
1384 | 123 | self->hyb_band_to_processing_band_table = |
1385 | 123 | ixheaacd_hybrid_band_64_to_processing_band_9_map; |
1386 | 123 | break; |
1387 | 80 | case 12: |
1388 | | |
1389 | 80 | self->hyb_band_to_processing_band_table = |
1390 | 80 | ixheaacd_hybrid_band_64_to_processing_band_12_map; |
1391 | 80 | break; |
1392 | 126 | case 15: |
1393 | | |
1394 | 126 | self->hyb_band_to_processing_band_table = |
1395 | 126 | ixheaacd_hybrid_band_64_to_processing_band_15_map; |
1396 | 126 | break; |
1397 | 706 | case 23: |
1398 | | |
1399 | 706 | self->hyb_band_to_processing_band_table = |
1400 | 706 | ixheaacd_hybrid_band_64_to_processing_band_23_map; |
1401 | 706 | break; |
1402 | 12 | default: |
1403 | 12 | self->hyb_band_to_processing_band_table = NULL; |
1404 | 12 | return -1; |
1405 | 0 | break; |
1406 | 1.18k | } |
1407 | 2.00k | } else { |
1408 | 2.00k | switch (self->bs_param_bands) { |
1409 | 745 | case 4: |
1410 | 745 | self->hyb_band_to_processing_band_table = |
1411 | 745 | ixheaacd_hybrid_band_71_to_processing_band_4_map; |
1412 | 745 | break; |
1413 | 224 | case 5: |
1414 | 224 | self->hyb_band_to_processing_band_table = |
1415 | 224 | ixheaacd_hybrid_band_71_to_processing_band_5_map; |
1416 | 224 | break; |
1417 | 388 | case 7: |
1418 | 388 | self->hyb_band_to_processing_band_table = |
1419 | 388 | ixheaacd_hybrid_band_71_to_processing_band_7_map; |
1420 | 388 | break; |
1421 | 144 | case 10: |
1422 | 144 | self->hyb_band_to_processing_band_table = |
1423 | 144 | ixheaacd_hybrid_band_71_to_processing_band_10_map; |
1424 | 144 | break; |
1425 | 132 | case 14: |
1426 | 132 | self->hyb_band_to_processing_band_table = |
1427 | 132 | ixheaacd_hybrid_band_71_to_processing_band_14_map; |
1428 | 132 | break; |
1429 | 148 | case 20: |
1430 | 148 | self->hyb_band_to_processing_band_table = |
1431 | 148 | ixheaacd_hybrid_band_71_to_processing_band_20_map; |
1432 | 148 | break; |
1433 | 224 | case 28: |
1434 | 224 | self->hyb_band_to_processing_band_table = |
1435 | 224 | ixheaacd_hybrid_band_71_to_processing_band_28_map; |
1436 | 224 | break; |
1437 | 1 | default: |
1438 | 1 | self->hyb_band_to_processing_band_table = NULL; |
1439 | 1 | return -1; |
1440 | 0 | break; |
1441 | 2.00k | } |
1442 | 2.00k | } |
1443 | 3.17k | self->in_ch_count = 1; |
1444 | 3.17k | self->out_ch_count = 2; |
1445 | | |
1446 | 3.17k | self->input_gain = |
1447 | 3.17k | ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx]; |
1448 | | |
1449 | 3.17k | if (self->config->bs_ott_bands_phase_present) { |
1450 | 692 | self->num_bands_ipd = self->config->bs_ott_bands_phase; |
1451 | 2.48k | } else { |
1452 | 2.48k | if (!(self->object_type == AOT_ER_AAC_ELD || |
1453 | 2.48k | self->object_type == AOT_ER_AAC_LD)) { |
1454 | 1.31k | switch (self->bs_param_bands) { |
1455 | 471 | case 4: |
1456 | 660 | case 5: |
1457 | 660 | self->num_bands_ipd = 2; |
1458 | 660 | break; |
1459 | 320 | case 7: |
1460 | 320 | self->num_bands_ipd = 3; |
1461 | 320 | break; |
1462 | 34 | case 10: |
1463 | 34 | self->num_bands_ipd = 5; |
1464 | 34 | break; |
1465 | 122 | case 14: |
1466 | 122 | self->num_bands_ipd = 7; |
1467 | 122 | break; |
1468 | 69 | case 20: |
1469 | 177 | case 28: |
1470 | 177 | self->num_bands_ipd = 10; |
1471 | 177 | break; |
1472 | 0 | default: |
1473 | 0 | return -1; |
1474 | 0 | break; |
1475 | 1.31k | } |
1476 | 1.31k | } |
1477 | 2.48k | } |
1478 | | |
1479 | 3.17k | if (self->residual_coding) { |
1480 | 1.21k | self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd); |
1481 | 1.21k | self->max_res_bands = 0; |
1482 | 1.21k | if (self->bs_residual_present) { |
1483 | 1.21k | self->res_bands = self->bs_residual_bands; |
1484 | 1.21k | if (self->res_bands > self->max_res_bands) { |
1485 | 733 | self->max_res_bands = self->res_bands; |
1486 | 733 | } |
1487 | 1.21k | } else { |
1488 | 0 | self->res_bands = 0; |
1489 | 0 | } |
1490 | 1.21k | } |
1491 | | |
1492 | 3.17k | if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1; |
1493 | | |
1494 | 3.17k | self->dir_sig_count = 1; |
1495 | 3.17k | self->decor_sig_count = 1; |
1496 | | |
1497 | 3.17k | self->bs_high_rate_mode = self->config->bs_high_rate_mode; |
1498 | 3.17k | self->pre_mix_req = 1; |
1499 | | |
1500 | 3.17k | return 0; |
1501 | 3.17k | } |