xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_mps_parse.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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