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