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, data_set, set_index, bs_data_pair, data_bands,
692 old_quant_coarse_xxx;
693 WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
694 WORD32 band_stop = 0;
695
696 WORD32 *lastdata = NULL;
697 ia_mps_data_struct *frame_xxx_data = NULL;
698 WORD32 default_val = 0;
699
700 ia_mps_bs_frame *frame = &(self->bs_frame);
701
702 if (datatype == CLD) {
703 frame_xxx_data = &frame->cld_data;
704 lastdata = frame->cmp_cld_idx_prev;
705 band_stop = self->bs_param_bands;
706 } else if (datatype == ICC) {
707 frame_xxx_data = &frame->icc_data;
708 lastdata = frame->cmp_icc_idx_prev;
709 band_stop = self->bs_param_bands;
710 } else if (datatype == IPD) {
711 frame_xxx_data = &frame->ipd_data;
712 lastdata = frame->ipd_idx_data_prev;
713 band_stop = self->num_bands_ipd;
714 } else {
715 frame_xxx_data = &frame->cld_data;
716 lastdata = frame->cmp_cld_idx_prev;
717 band_stop = self->bs_param_bands;
718 }
719 data_set = 0;
720 for (i = 0; i < self->num_parameter_sets; i++) {
721 frame_xxx_data->bs_xxx_data_mode[i] =
722 ixheaacd_read_bits_buf(it_bit_buff, 2);
723 if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
724 data_set++;
725 }
726 }
727
728 set_index = 0;
729 bs_data_pair = 0;
730 old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
731
732 for (i = 0; i < self->num_parameter_sets; i++) {
733 if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
734 for (pb = 0; pb < band_stop; pb++) {
735 lastdata[pb] = default_val;
736 }
737
738 old_quant_coarse_xxx = 0;
739 }
740
741 if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
742 if (bs_data_pair) {
743 bs_data_pair = 0;
744 } else {
745 bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1);
746 frame_xxx_data->bs_quant_coarse_xxx[set_index] =
747 ixheaacd_read_bits_buf(it_bit_buff, 1);
748 frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
749 ixheaacd_read_bits_buf(it_bit_buff, 2);
750
751 if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
752 old_quant_coarse_xxx) {
753 if (old_quant_coarse_xxx) {
754 ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
755 } else {
756 ixheaacd_mps_fine2coarse(lastdata, band_stop);
757 }
758 }
759
760 data_bands = ixheaacd_mps_getstridemap(
761 frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band,
762 band_stop, strides);
763 for (pb = 0; pb < data_bands; pb++) {
764 lastdata[pb] = lastdata[strides[pb]];
765 }
766
767 ixheaacd_mps_ecdatapairdec(
768 it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
769 frame_xxx_data->bs_quant_coarse_xxx[set_index],
770 !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag);
771
772 for (pb = 0; pb < data_bands; pb++) {
773 for (j = strides[pb]; j < strides[pb + 1]; j++) {
774 if (datatype == IPD) {
775 if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
776 lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
777 } else {
778 lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
779 }
780 } else {
781 lastdata[j] = data[set_index + bs_data_pair][pb];
782 }
783 }
784 }
785
786 old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
787
788 if (bs_data_pair) {
789 frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
790 frame_xxx_data->bs_quant_coarse_xxx[set_index];
791 frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
792 frame_xxx_data->bs_freq_res_stride_xxx[set_index];
793 }
794 set_index += bs_data_pair + 1;
795 }
796 }
797 }
798 }
799
ixheaacd_ld_mps_frame_parsing(ia_mps_dec_state_struct * self,ia_bit_buf_struct * it_bit_buff)800 IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
801 ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) {
802 WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable,
803 num_of_temp_shape_ch;
804 WORD32 ps, pg, ts, ic;
805 WORD32 env_shape_data[MAX_TIME_SLOTS];
806 WORD32 alignment;
807 WORD32 bits_param_slot = 0;
808
809 ia_mps_bs_frame *frame = &(self->bs_frame);
810 alignment = it_bit_buff->cnt_bits;
811 if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
812
813 self->num_parameter_sets_prev = self->num_parameter_sets;
814
815 bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1);
816 self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1;
817
818 if (self->time_slots == 32)
819 bits_param_slot = 5;
820 else if (self->time_slots == 64)
821 bits_param_slot = 6;
822 else if (self->time_slots == 8)
823 bits_param_slot = 3;
824 else if (self->time_slots == 16 || self->time_slots == 15)
825 bits_param_slot = 4;
826
827 if (bs_frame_type) {
828 WORD32 prev_param_slot = -1;
829 for (i = 0; i < self->num_parameter_sets; i++) {
830 self->param_slots[i] = ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot);
831
832 if (prev_param_slot >= self->param_slots[i] || self->param_slots[i] >= self->time_slots) {
833 return IA_FATAL_ERROR;
834 }
835 prev_param_slot = self->param_slots[i];
836 }
837 } else {
838 for (i = 0; i < self->num_parameter_sets; i++) {
839 self->param_slots[i] = (((self->time_slots * (i + 1)) + self->num_parameter_sets - 1) /
840 self->num_parameter_sets) -
841 1;
842 }
843 }
844
845 frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
846
847 for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
848 ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD,
849 0);
850 }
851
852 if (self->ldmps_config.bs_one_icc) {
853 ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC,
854 0);
855 } else {
856 for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
857 if (!self->ldmps_config.ott_mode_lfe[i])
858 ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx,
859 ICC, 0);
860 }
861 }
862
863 for (ps = 0; ps < self->num_parameter_sets; ps++) {
864 frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
865 if (frame->bs_smooth_mode[ps] >= 2) {
866 frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
867 }
868 if (frame->bs_smooth_mode[ps] == 3) {
869 frame->bs_freq_res_stride_smg[ps] =
870 ixheaacd_read_bits_buf(it_bit_buff, 2);
871 data_bands =
872 (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) /
873 ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
874 1;
875 for (pg = 0; pg < data_bands; pg++) {
876 frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1);
877 }
878 }
879 }
880
881 for (i = 0; i < 2; i++) {
882 self->temp_shape_enable_ch_stp[i] = 0;
883 self->temp_shape_enable_ch_ges[i] = 0;
884 }
885
886 if (self->ldmps_config.bs_temp_shape_config != 0) {
887 bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1);
888 if (bs_temp_shape_enable) {
889 num_of_temp_shape_ch = 2;
890 switch (self->ldmps_config.bs_temp_shape_config) {
891 case 1:
892 for (i = 0; i < num_of_temp_shape_ch; i++) {
893 self->temp_shape_enable_ch_stp[i] =
894 ixheaacd_read_bits_buf(it_bit_buff, 1);
895 }
896 break;
897 case 2:
898 for (i = 0; i < num_of_temp_shape_ch; i++) {
899 self->temp_shape_enable_ch_ges[i] =
900 ixheaacd_read_bits_buf(it_bit_buff, 1);
901 }
902 for (i = 0; i < num_of_temp_shape_ch; i++) {
903 if (self->temp_shape_enable_ch_ges[i]) {
904 ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data,
905 self->time_slots);
906 for (ts = 0; ts < self->time_slots; ts++) {
907 self->env_shape_data[i][ts] = (FLOAT32)pow(
908 2, (FLOAT32)env_shape_data[ts] /
909 (self->ldmps_config.bs_env_quant_mode + 2) -
910 1);
911 }
912 }
913 }
914 break;
915 default:
916 if (self->ec_flag == 0) {
917 return IA_FATAL_ERROR;
918 }
919 break;
920 }
921 }
922 }
923
924 if (self->ldmps_config.bs_arbitrary_downmix != 0) {
925 for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) {
926 ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx,
927 CLD, 0);
928 }
929 }
930
931 ixheaacd_byte_align(it_bit_buff, &alignment);
932
933 while (it_bit_buff->cnt_bits > 8) {
934 ixheaacd_read_bits_buf(it_bit_buff, 8);
935 }
936 ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
937 return IA_NO_ERROR;
938 }
939
ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS+1],WORD32 band_start,WORD32 band_stop,WORD32 ch_fac)940 static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1],
941 WORD32 band_start, WORD32 band_stop,
942 WORD32 ch_fac) {
943 WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
944 WORD32 vdk[MAX_PARAMETER_BANDS + 1];
945 input_bands = band_stop - band_start;
946 out_bands = (input_bands - 1) / ch_fac + 1;
947 if (out_bands < 1) {
948 out_bands = 1;
949 }
950
951 bands_achived = out_bands * ch_fac;
952 bands_diff = input_bands - bands_achived;
953 for (i = 0; i < out_bands; i++) {
954 vdk[i] = ch_fac;
955 }
956
957 if (bands_diff > 0) {
958 incr = -1;
959 k = out_bands - 1;
960 } else {
961 incr = 1;
962 k = 0;
963 }
964
965 while (bands_diff != 0) {
966 vdk[k] = vdk[k] - incr;
967 k = k + incr;
968 bands_diff = bands_diff + incr;
969 if (k >= out_bands) {
970 if (bands_diff > 0) {
971 k = out_bands - 1;
972 } else if (bands_diff < 0) {
973 k = 0;
974 }
975 }
976 }
977 map[0] = band_start;
978 for (i = 0; i < out_bands; i++) {
979 map[i + 1] = map[i] + vdk[i];
980 }
981 }
982
ixheaacd_mps_mapfrequency(WORD32 * in,WORD32 * out,WORD32 * map,WORD32 data_bands)983 static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map,
984 WORD32 data_bands) {
985 WORD32 i, j, band_start, band_stop, value;
986 WORD32 start_band_0 = map[0];
987
988 for (i = 0; i < data_bands; i++) {
989 value = in[i + start_band_0];
990
991 band_start = map[i];
992 band_stop = map[i + 1];
993 for (j = band_start; j < band_stop; j++) {
994 out[j] = value;
995 }
996 }
997 }
998
ixheaacd_mps_de_quantize(WORD32 value,WORD32 param_type)999 static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) {
1000 switch (param_type) {
1001 case CLD:
1002 return ixheaacd_cld_de_quant_table[(value + 15)];
1003
1004 case ICC:
1005 return ixheaacd_icc_de_quant_table[value];
1006
1007 case IPD:
1008 return ixheaacd_ipd_de_quant_table[(value & 15)];
1009
1010 default:
1011 return 0;
1012 return 0;
1013 }
1014 }
1015
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)1016 static IA_ERRORCODE ixheaacd_mps_mapindexdata(
1017 ia_mps_dec_state_struct *self, ia_mps_data_struct *frame_xxx_data,
1018 FLOAT32 out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1019 WORD32 out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1020 WORD32 cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
1021 WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) {
1022 WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0};
1023 WORD32 map[MAX_PARAMETER_BANDS + 1];
1024
1025 WORD32 set_index, i, band, parm_slot;
1026 WORD32 data_bands, ch_fac;
1027 WORD32 ps;
1028
1029 WORD32 i1, i2, x1, xi, x2;
1030 WORD32 band_start = 0;
1031 WORD32 ext_frame_flag = self->ext_frame_flag;
1032 WORD32 *param_slots = self->param_slots;
1033 WORD32 num_parameter_sets = self->num_parameter_sets;
1034 WORD32 band_stop = self->bs_param_bands;
1035 WORD32 default_val = 0;
1036
1037 set_index = 0;
1038
1039 for (i = 0; i < num_parameter_sets; i++) {
1040 if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
1041 frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1042 for (band = band_start; band < band_stop; band++) {
1043 out_idx_data[i][band] = default_val;
1044 }
1045 for (band = band_start; band < band_stop; band++) {
1046 idx_prev[band] = out_idx_data[i][band];
1047 }
1048
1049 frame_xxx_data->bs_quant_coarse_xxx_prev = 0;
1050 }
1051
1052 if (frame_xxx_data->bs_xxx_data_mode[i] == 1) {
1053 for (band = band_start; band < band_stop; band++) {
1054 out_idx_data[i][band] = idx_prev[band];
1055 }
1056 frame_xxx_data->quant_coarse_xxx_flag[i] =
1057 frame_xxx_data->bs_quant_coarse_xxx_prev;
1058 }
1059
1060 if (frame_xxx_data->bs_xxx_data_mode[i] == 2) {
1061 for (band = band_start; band < band_stop; band++) {
1062 out_idx_data[i][band] = idx_prev[band];
1063 }
1064 frame_xxx_data->quant_coarse_xxx_flag[i] =
1065 frame_xxx_data->bs_quant_coarse_xxx_prev;
1066 interpolate_local[i] = 1;
1067 } else {
1068 interpolate_local[i] = 0;
1069 }
1070
1071 if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
1072 parm_slot = i;
1073 ch_fac =
1074 ixheaacd_mps_stride_table[frame_xxx_data
1075 ->bs_freq_res_stride_xxx[set_index]];
1076 data_bands = (band_stop - band_start - 1) / ch_fac + 1;
1077 ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac);
1078 ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0],
1079 &out_idx_data[parm_slot][0], map, data_bands);
1080
1081 for (band = band_start; band < band_stop; band++) {
1082 idx_prev[band] = out_idx_data[parm_slot][band];
1083 }
1084
1085 frame_xxx_data->bs_quant_coarse_xxx_prev =
1086 frame_xxx_data->bs_quant_coarse_xxx[set_index];
1087 frame_xxx_data->quant_coarse_xxx_flag[i] =
1088 frame_xxx_data->bs_quant_coarse_xxx[set_index];
1089
1090 set_index++;
1091 }
1092 }
1093
1094 for (i = 0; i < num_parameter_sets; i++) {
1095 if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) {
1096 ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start,
1097 band_stop - band_start);
1098 frame_xxx_data->quant_coarse_xxx_flag[i] = 0;
1099 }
1100 }
1101
1102 i1 = -1;
1103 x1 = 0;
1104 i2 = 0;
1105 for (i = 0; i < num_parameter_sets; i++) {
1106 if (interpolate_local[i] != 1) {
1107 i1 = i;
1108 }
1109 i2 = i;
1110 while (interpolate_local[i2] == 1) {
1111 i2++;
1112 }
1113 if (i1 == -1) {
1114 x1 = 0;
1115 i1 = 0;
1116 } else {
1117 x1 = param_slots[i1];
1118 }
1119 xi = param_slots[i];
1120 x2 = param_slots[i2];
1121
1122 if (interpolate_local[i] == 1) {
1123 if (i2 < num_parameter_sets) {
1124 if (self->ec_flag == 0) {
1125 return IA_FATAL_ERROR;
1126 }
1127 }
1128
1129 for (band = band_start; band < band_stop; band++) {
1130 WORD32 yi, y1, y2;
1131 yi = 0;
1132 y1 = out_idx_data[i1][band];
1133 y2 = out_idx_data[i2][band];
1134 if (param_type == IPD) {
1135 if (y2 - y1 > 8) y1 += 16;
1136 if (y1 - y2 > 8) y2 += 16;
1137
1138 if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
1139 } else {
1140 if (x2 != x1) {
1141 yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
1142 }
1143 }
1144 out_idx_data[i][band] = yi;
1145 }
1146 }
1147 }
1148
1149 for (ps = 0; ps < num_parameter_sets; ps++) {
1150 for (band = band_start; band < band_stop; band++) {
1151 if (param_type == CLD) {
1152 out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15);
1153 } else if (param_type == ICC)
1154 {
1155 out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7);
1156 }
1157 out_data[ps][band] =
1158 ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type);
1159 }
1160 }
1161
1162 if (ext_frame_flag) {
1163 for (band = band_start; band < band_stop; band++) {
1164 out_data[num_parameter_sets][band] =
1165 out_data[num_parameter_sets - 1][band];
1166 out_idx_data[num_parameter_sets][band] =
1167 out_idx_data[num_parameter_sets - 1][band];
1168 }
1169 }
1170 return IA_NO_ERROR;
1171 }
1172
ixheaacd_mps_dec_and_mapframeott(ia_mps_dec_state_struct * self)1173 static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott(
1174 ia_mps_dec_state_struct *self) {
1175 ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame);
1176 IA_ERRORCODE err_code = 0;
1177
1178 err_code = ixheaacd_mps_mapindexdata(
1179 self, &cur_bit_stream_ptr->cld_data, self->cld_data,
1180 cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx,
1181 cur_bit_stream_ptr->cld_idx_pre, CLD);
1182 if (err_code != IA_NO_ERROR) return err_code;
1183 err_code = ixheaacd_mps_mapindexdata(
1184 self, &cur_bit_stream_ptr->icc_data, self->icc_data,
1185 cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx,
1186 cur_bit_stream_ptr->icc_idx_pre, ICC);
1187 if (err_code != IA_NO_ERROR) return err_code;
1188 if ((self->config->bs_phase_coding)) {
1189 err_code = ixheaacd_mps_mapindexdata(
1190 self, &cur_bit_stream_ptr->ipd_data, self->ipd_data,
1191 cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data,
1192 cur_bit_stream_ptr->ipd_idx_prev, IPD);
1193
1194 if (err_code != IA_NO_ERROR) return err_code;
1195 }
1196 return IA_NO_ERROR;
1197 }
1198
ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct * self)1199 static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) {
1200 WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop,
1201 group_to_band[MAX_PARAMETER_BANDS + 1];
1202 ia_mps_bs_frame *frame = &(self->bs_frame);
1203 for (ps = 0; ps < self->num_parameter_sets; ps++) {
1204 switch (frame->bs_smooth_mode[ps]) {
1205 case 0:
1206 self->smoothing_time[ps] = 256;
1207 self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
1208
1209 for (pb = 0; pb < self->bs_param_bands; pb++) {
1210 self->smoothing_data[ps][pb] = 0;
1211 }
1212 break;
1213
1214 case 1:
1215 if (ps > 0) {
1216 self->smoothing_time[ps] = self->smoothing_time[ps - 1];
1217 self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1];
1218 } else {
1219 self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time;
1220 self->inv_smoothing_time[ps] =
1221 self->smoothing_filt_state.inv_prev_smg_time;
1222 }
1223
1224 for (pb = 0; pb < self->bs_param_bands; pb++) {
1225 if (ps > 0)
1226 self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb];
1227 else
1228 self->smoothing_data[ps][pb] =
1229 self->smoothing_filt_state.prev_smg_data[pb];
1230 }
1231 break;
1232
1233 case 2:
1234 self->smoothing_time[ps] =
1235 ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1236 self->inv_smoothing_time[ps] =
1237 ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1238 for (pb = 0; pb < self->bs_param_bands; pb++) {
1239 self->smoothing_data[ps][pb] = 1;
1240 }
1241 break;
1242
1243 case 3:
1244 self->smoothing_time[ps] =
1245 ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
1246 self->inv_smoothing_time[ps] =
1247 ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
1248
1249 ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
1250 data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
1251 ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands,
1252 ch_fac);
1253 for (pg = 0; pg < data_bands; pg++) {
1254 param_band_start = group_to_band[pg];
1255 param_band_stop = group_to_band[pg + 1];
1256 for (pb = param_band_start; pb < param_band_stop; pb++) {
1257 self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg];
1258 }
1259 }
1260 break;
1261 }
1262 }
1263
1264 self->smoothing_filt_state.prev_smg_time =
1265 self->smoothing_time[self->num_parameter_sets - 1];
1266 self->smoothing_filt_state.inv_prev_smg_time =
1267 self->inv_smoothing_time[self->num_parameter_sets - 1];
1268 for (pb = 0; pb < self->bs_param_bands; pb++) {
1269 self->smoothing_filt_state.prev_smg_data[pb] =
1270 self->smoothing_data[self->num_parameter_sets - 1][pb];
1271 }
1272
1273 if (self->ext_frame_flag) {
1274 self->smoothing_time[self->num_parameter_sets] =
1275 self->smoothing_time[self->num_parameter_sets - 1];
1276 self->inv_smoothing_time[self->num_parameter_sets] =
1277 self->inv_smoothing_time[self->num_parameter_sets - 1];
1278 for (pb = 0; pb < self->bs_param_bands; pb++) {
1279 self->smoothing_data[self->num_parameter_sets][pb] =
1280 self->smoothing_data[self->num_parameter_sets - 1][pb];
1281 }
1282 }
1283 }
1284
ixheaacd_mps_frame_decode(ia_mps_dec_state_struct * self)1285 IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) {
1286 WORD32 i;
1287 IA_ERRORCODE err_code = 0;
1288 if (self->ldmps_config.ldmps_present_flag != 1)
1289 if (self->parse_nxt_frame == 1) return err_code;
1290 self->ext_frame_flag = 0;
1291 if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) {
1292 self->ext_frame_flag = 1;
1293 }
1294
1295 err_code = ixheaacd_mps_dec_and_mapframeott(self);
1296 if (err_code != IA_NO_ERROR) return err_code;
1297 ixheaacd_mps_dec_and_mapframesmg(self);
1298
1299 if (self->ext_frame_flag) {
1300 self->num_parameter_sets++;
1301 self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1;
1302 }
1303 self->param_slot_diff[0] = self->param_slots[0] + 1;
1304 if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) {
1305 if (self->ec_flag == 0) {
1306 return -1;
1307 } else {
1308 self->param_slot_diff[0] = MAX_TIME_SLOTS;
1309 }
1310 }
1311 self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0];
1312 self->inv_param_slot_diff_Q30[0] =
1313 (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5);
1314 for (i = 1; i < self->num_parameter_sets; i++) {
1315 self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1];
1316 if ((MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) ||
1317 (self->param_slot_diff[i] == 0)) {
1318 if (self->ec_flag == 0) {
1319 return -1;
1320 } else {
1321 self->param_slot_diff[i] = 1;
1322 self->inv_param_slot_diff[i] = 1;
1323 }
1324 }
1325 self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i];
1326 self->inv_param_slot_diff_Q30[i] =
1327 (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
1328 }
1329 return IA_NO_ERROR;
1330 }
1331
ixheaacd_mps_header_decode(ia_mps_dec_state_struct * self)1332 WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
1333 WORD32 samp_freq;
1334 WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
1335 24000, 22050, 16000, 12000, 11025, 8000,
1336 7350, 0, 0, 0};
1337
1338 if (self->ldmps_config.ldmps_present_flag == 1)
1339 self->time_slots = self->frame_length + 1;
1340 else
1341 self->time_slots = self->frame_length;
1342
1343 self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
1344
1345 if (self->ldmps_config.ldmps_present_flag == 1) {
1346 if (self->ldmps_config.bs_sampling_freq_index == 15) {
1347 samp_freq = self->ldmps_config.bs_fampling_frequency;
1348 } else {
1349 samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index];
1350 }
1351
1352 if (samp_freq < 27713.0) {
1353 self->qmf_band_count = 32;
1354 } else if (samp_freq >= 55426.0) {
1355 self->qmf_band_count = 128;
1356 } else {
1357 self->qmf_band_count = 64;
1358 }
1359 }
1360
1361 if (self->object_type == AOT_ER_AAC_ELD ||
1362 self->object_type == AOT_ER_AAC_LD) {
1363 self->bs_param_bands =
1364 ixheaacd_freq_res_table_ld[self->config->bs_freq_res];
1365 self->hyb_band_count_max = self->qmf_band_count;
1366 } else
1367 self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
1368
1369 if (self->object_type == AOT_ER_AAC_ELD ||
1370 self->object_type == AOT_ER_AAC_LD) {
1371 switch (self->bs_param_bands) {
1372 case 4:
1373
1374 self->hyb_band_to_processing_band_table =
1375 ixheaacd_hybrid_band_64_to_processing_band_4_map;
1376 break;
1377 case 5:
1378
1379 self->hyb_band_to_processing_band_table =
1380 ixheaacd_hybrid_band_64_to_processing_band_5_map;
1381 break;
1382 case 7:
1383
1384 self->hyb_band_to_processing_band_table =
1385 ixheaacd_hybrid_band_64_to_processing_band_7_map;
1386 break;
1387 case 9:
1388
1389 self->hyb_band_to_processing_band_table =
1390 ixheaacd_hybrid_band_64_to_processing_band_9_map;
1391 break;
1392 case 12:
1393
1394 self->hyb_band_to_processing_band_table =
1395 ixheaacd_hybrid_band_64_to_processing_band_12_map;
1396 break;
1397 case 15:
1398
1399 self->hyb_band_to_processing_band_table =
1400 ixheaacd_hybrid_band_64_to_processing_band_15_map;
1401 break;
1402 case 23:
1403
1404 self->hyb_band_to_processing_band_table =
1405 ixheaacd_hybrid_band_64_to_processing_band_23_map;
1406 break;
1407 default:
1408 self->hyb_band_to_processing_band_table = NULL;
1409 return -1;
1410 break;
1411 }
1412 } else {
1413 switch (self->bs_param_bands) {
1414 case 4:
1415 self->hyb_band_to_processing_band_table =
1416 ixheaacd_hybrid_band_71_to_processing_band_4_map;
1417 break;
1418 case 5:
1419 self->hyb_band_to_processing_band_table =
1420 ixheaacd_hybrid_band_71_to_processing_band_5_map;
1421 break;
1422 case 7:
1423 self->hyb_band_to_processing_band_table =
1424 ixheaacd_hybrid_band_71_to_processing_band_7_map;
1425 break;
1426 case 10:
1427 self->hyb_band_to_processing_band_table =
1428 ixheaacd_hybrid_band_71_to_processing_band_10_map;
1429 break;
1430 case 14:
1431 self->hyb_band_to_processing_band_table =
1432 ixheaacd_hybrid_band_71_to_processing_band_14_map;
1433 break;
1434 case 20:
1435 self->hyb_band_to_processing_band_table =
1436 ixheaacd_hybrid_band_71_to_processing_band_20_map;
1437 break;
1438 case 28:
1439 self->hyb_band_to_processing_band_table =
1440 ixheaacd_hybrid_band_71_to_processing_band_28_map;
1441 break;
1442 default:
1443 self->hyb_band_to_processing_band_table = NULL;
1444 return -1;
1445 break;
1446 }
1447 }
1448 self->in_ch_count = 1;
1449 self->out_ch_count = 2;
1450
1451 self->input_gain =
1452 ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx];
1453
1454 if (self->config->bs_ott_bands_phase_present) {
1455 self->num_bands_ipd = self->config->bs_ott_bands_phase;
1456 } else {
1457 if (!(self->object_type == AOT_ER_AAC_ELD ||
1458 self->object_type == AOT_ER_AAC_LD)) {
1459 switch (self->bs_param_bands) {
1460 case 4:
1461 case 5:
1462 self->num_bands_ipd = 2;
1463 break;
1464 case 7:
1465 self->num_bands_ipd = 3;
1466 break;
1467 case 10:
1468 self->num_bands_ipd = 5;
1469 break;
1470 case 14:
1471 self->num_bands_ipd = 7;
1472 break;
1473 case 20:
1474 case 28:
1475 self->num_bands_ipd = 10;
1476 break;
1477 default:
1478 return -1;
1479 break;
1480 }
1481 }
1482 }
1483
1484 if (self->residual_coding) {
1485 self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd);
1486 self->max_res_bands = 0;
1487 if (self->bs_residual_present) {
1488 self->res_bands = self->bs_residual_bands;
1489 if (self->res_bands > self->max_res_bands) {
1490 self->max_res_bands = self->res_bands;
1491 }
1492 } else {
1493 self->res_bands = 0;
1494 }
1495 }
1496
1497 if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1;
1498
1499 self->dir_sig_count = 1;
1500 self->decor_sig_count = 1;
1501
1502 self->bs_high_rate_mode = self->config->bs_high_rate_mode;
1503 self->pre_mix_req = 1;
1504
1505 return 0;
1506 }
1507