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