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