/src/libxaac/encoder/ixheaace_sbr_frame_info_gen.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2023 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 | | |
21 | | #include <string.h> |
22 | | |
23 | | #include "ixheaac_type_def.h" |
24 | | #include "ixheaac_constants.h" |
25 | | #include "ixheaace_aac_constants.h" |
26 | | #include "ixheaac_basic_ops32.h" |
27 | | #include "ixheaac_basic_ops16.h" |
28 | | #include "ixheaac_basic_ops40.h" |
29 | | #include "ixheaac_basic_ops.h" |
30 | | |
31 | | #include "ixheaac_error_standards.h" |
32 | | #include "ixheaace_error_codes.h" |
33 | | |
34 | | #include "ixheaace_sbr_header.h" |
35 | | #include "ixheaace_sbr_def.h" |
36 | | #include "ixheaace_resampler.h" |
37 | | #include "ixheaace_sbr_rom.h" |
38 | | #include "ixheaace_common_rom.h" |
39 | | #include "ixheaace_sbr_main.h" |
40 | | #include "ixheaace_sbr_frame_info_gen.h" |
41 | | #include "ixheaace_sbr_misc.h" |
42 | | |
43 | | static VOID ixheaace_add_freq_left(ixheaace_freq_res *ptr_vector, WORD32 *ptr_length_vector, |
44 | 88.1k | ixheaace_freq_res value) { |
45 | 88.1k | memmove(ptr_vector + 1, ptr_vector, *ptr_length_vector * sizeof(ptr_vector[0])); |
46 | 88.1k | ptr_vector[0] = value; |
47 | 88.1k | (*ptr_length_vector)++; |
48 | 88.1k | } |
49 | | |
50 | | static VOID ixheaace_add_freq_vec_left(ixheaace_freq_res *ptr_dst, WORD32 *length_dst, |
51 | 29.1k | ixheaace_freq_res *ptr_src, WORD32 length_src) { |
52 | 29.1k | WORD32 i; |
53 | 29.1k | i = length_src - 1; |
54 | 77.5k | while (i >= 0) { |
55 | 48.3k | ixheaace_add_freq_left(ptr_dst, length_dst, ptr_src[i]); |
56 | 48.3k | i--; |
57 | 48.3k | } |
58 | 29.1k | } |
59 | | |
60 | | static VOID ixheaace_add_freq_right(ixheaace_freq_res *ptr_vector, WORD32 *ptr_length_vector, |
61 | 380k | ixheaace_freq_res value) { |
62 | 380k | ptr_vector[*ptr_length_vector] = value; |
63 | | |
64 | 380k | (*ptr_length_vector)++; |
65 | 380k | } |
66 | | |
67 | | static VOID ixheaace_fill_frame_tran(WORD32 *ptr_v_bord, WORD32 *ptr_length_v_bord, |
68 | | ixheaace_freq_res *ptr_v_freq, WORD32 *ptr_length_v_freq, |
69 | | WORD32 *ptr_bmin, WORD32 *ptr_bmax, WORD32 tran, |
70 | | WORD32 *ptr_ptr_v_tuning_segm, |
71 | 111k | ixheaace_freq_res *ptr_tuning_freq) { |
72 | 111k | WORD32 bord, i; |
73 | | |
74 | 111k | *ptr_length_v_bord = 0; |
75 | 111k | *ptr_length_v_freq = 0; |
76 | | |
77 | 111k | if (ptr_ptr_v_tuning_segm[0]) { |
78 | 0 | ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, (tran - ptr_ptr_v_tuning_segm[0])); |
79 | |
|
80 | 0 | ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, ptr_tuning_freq[0]); |
81 | 0 | } |
82 | | |
83 | 111k | bord = tran; |
84 | | |
85 | 111k | ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, tran); |
86 | | |
87 | 111k | if (ptr_ptr_v_tuning_segm[1]) { |
88 | 111k | bord += ptr_ptr_v_tuning_segm[1]; |
89 | | |
90 | 111k | ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, bord); |
91 | | |
92 | 111k | ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, ptr_tuning_freq[1]); |
93 | 111k | } |
94 | | |
95 | 111k | if (ptr_ptr_v_tuning_segm[2] != 0) { |
96 | 111k | bord += ptr_ptr_v_tuning_segm[2]; |
97 | | |
98 | 111k | ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, bord); |
99 | | |
100 | 111k | ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, ptr_tuning_freq[2]); |
101 | 111k | } |
102 | | |
103 | 111k | ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, FREQ_RES_HIGH); |
104 | | |
105 | 111k | *ptr_bmin = ptr_v_bord[0]; |
106 | 111k | *ptr_bmax = ptr_v_bord[0]; |
107 | | |
108 | 446k | for (i = 0; i < *ptr_length_v_bord; i++) { |
109 | 335k | if (ptr_v_bord[i] < *ptr_bmin) { |
110 | 0 | *ptr_bmin = ptr_v_bord[i]; |
111 | 0 | } |
112 | 335k | if (ptr_v_bord[i] > *ptr_bmax) { |
113 | 223k | *ptr_bmax = ptr_v_bord[i]; |
114 | 223k | } |
115 | 335k | } |
116 | 111k | } |
117 | | |
118 | | static VOID ixheaace_fill_frame_pre(WORD32 dmax, WORD32 *ptr_v_bord, WORD32 *ptr_length_v_bord, |
119 | | ixheaace_freq_res *ptr_v_freq, WORD32 *ptr_length_v_freq, |
120 | 47.0k | WORD32 bmin, WORD32 rest) { |
121 | 47.0k | WORD32 ptr_parts, ptr_d, j, S, s = 0, segm, bord; |
122 | | |
123 | 47.0k | ptr_parts = 1; |
124 | 47.0k | ptr_d = rest; |
125 | | |
126 | 86.7k | while (ptr_d > dmax) { |
127 | 39.7k | ptr_parts++; |
128 | | |
129 | 39.7k | segm = rest / ptr_parts; |
130 | | |
131 | 39.7k | S = ixheaac_shr32((segm - 2), 1); |
132 | | |
133 | 39.7k | s = ixheaac_min32(8, 2 * S + 2); |
134 | | |
135 | 39.7k | ptr_d = rest - (ptr_parts - 1) * s; |
136 | 39.7k | } |
137 | | |
138 | 47.0k | bord = bmin; |
139 | 47.0k | j = 0; |
140 | 86.7k | while (j <= ptr_parts - 2) { |
141 | 39.7k | bord = bord - s; |
142 | | |
143 | 39.7k | ixheaace_add_left(ptr_v_bord, ptr_length_v_bord, bord); |
144 | | |
145 | 39.7k | ixheaace_add_freq_left(ptr_v_freq, ptr_length_v_freq, FREQ_RES_HIGH); |
146 | 39.7k | j++; |
147 | 39.7k | } |
148 | 47.0k | } |
149 | | |
150 | | static VOID ixheaace_fill_Frame_Post(WORD32 *ptr_parts, WORD32 *ptr_d, WORD32 dmax, |
151 | | WORD32 *ptr_v_bord, WORD32 *ptr_length_v_bord, |
152 | | ixheaace_freq_res *ptr_v_freq, WORD32 *ptr_length_v_freq, |
153 | 75.0k | WORD32 bmax, WORD32 fmax) { |
154 | 75.0k | WORD32 j, rest, segm, S, s = 0, bord; |
155 | | |
156 | 75.0k | rest = 32 - bmax; |
157 | | |
158 | 75.0k | *ptr_d = rest; |
159 | | |
160 | 75.0k | if (*ptr_d > 0) { |
161 | 75.0k | *ptr_parts = 1; /* start with one envelope */ |
162 | | |
163 | 120k | while (*ptr_d > dmax) { |
164 | 44.9k | *ptr_parts = *ptr_parts + 1; |
165 | | |
166 | 44.9k | segm = rest / (*ptr_parts); |
167 | | |
168 | 44.9k | S = ixheaac_shr32((segm - 2), 1); |
169 | | |
170 | 44.9k | s = ixheaac_min32(fmax, 2 * S + 2); |
171 | | |
172 | 44.9k | *ptr_d = rest - (*ptr_parts - 1) * s; |
173 | 44.9k | } |
174 | | |
175 | 75.0k | bord = bmax; |
176 | | |
177 | 120k | for (j = 0; j <= *ptr_parts - 2; j++) { |
178 | 44.9k | bord += s; |
179 | | |
180 | 44.9k | ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, bord); |
181 | | |
182 | 44.9k | ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, FREQ_RES_HIGH); |
183 | 44.9k | } |
184 | 75.0k | } else { |
185 | 0 | *ptr_parts = 1; |
186 | |
|
187 | 0 | *ptr_length_v_bord = *ptr_length_v_bord - 1; |
188 | 0 | *ptr_length_v_freq = *ptr_length_v_freq - 1; |
189 | 0 | } |
190 | 75.0k | } |
191 | | |
192 | | static VOID ixheaace_fill_frame_inter(WORD32 *ptr_n_l, WORD32 *ptr_ptr_v_tuning_segm, |
193 | | WORD32 *ptr_v_bord, WORD32 *ptr_length_v_bord, WORD32 bmin, |
194 | | ixheaace_freq_res *ptr_v_freq, WORD32 *ptr_length_v_freq, |
195 | | WORD32 *ptr_v_bord_follow, WORD32 *ptr_length_v_bord_follow, |
196 | | ixheaace_freq_res *ptr_v_freq_follow, |
197 | | WORD32 *ptr_length_v_freq_follow, WORD32 fill_follow, |
198 | 29.1k | WORD32 dmin, WORD32 dmax) { |
199 | 29.1k | WORD32 middle, b_new, num_bord_follow, bord_max_follow; |
200 | | |
201 | 29.1k | if (fill_follow >= 1) { |
202 | 26.0k | *ptr_length_v_bord_follow = fill_follow; |
203 | 26.0k | *ptr_length_v_freq_follow = fill_follow; |
204 | 26.0k | } |
205 | | |
206 | 29.1k | num_bord_follow = *ptr_length_v_bord_follow; |
207 | | |
208 | 29.1k | bord_max_follow = ptr_v_bord_follow[num_bord_follow - 1]; |
209 | | |
210 | 29.1k | middle = bmin - bord_max_follow; |
211 | | |
212 | 31.5k | while (middle < 0) { |
213 | 2.40k | num_bord_follow--; |
214 | | |
215 | 2.40k | bord_max_follow = ptr_v_bord_follow[num_bord_follow - 1]; |
216 | | |
217 | 2.40k | middle = bmin - bord_max_follow; |
218 | 2.40k | } |
219 | | |
220 | 29.1k | *ptr_length_v_bord_follow = num_bord_follow; |
221 | 29.1k | *ptr_length_v_freq_follow = num_bord_follow; |
222 | | |
223 | 29.1k | *ptr_n_l = num_bord_follow - 1; |
224 | | |
225 | 29.1k | b_new = *ptr_length_v_bord; |
226 | | |
227 | 29.1k | if ((middle <= dmax) && (middle >= dmin)) { |
228 | 24.0k | ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow, |
229 | 24.0k | *ptr_length_v_bord_follow); |
230 | | |
231 | 24.0k | ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow, |
232 | 24.0k | *ptr_length_v_freq_follow); |
233 | 24.0k | } |
234 | | |
235 | 5.08k | else if ((middle <= dmax) && (middle < dmin)) { |
236 | 4.01k | if (ptr_ptr_v_tuning_segm[0] != 0) { |
237 | 0 | *ptr_length_v_bord = b_new - 1; |
238 | |
|
239 | 0 | ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow, |
240 | 0 | *ptr_length_v_bord_follow); |
241 | |
|
242 | 0 | *ptr_length_v_freq = b_new - 1; |
243 | |
|
244 | 0 | ixheaace_add_freq_vec_left(ptr_v_freq + 1, ptr_length_v_freq, ptr_v_freq_follow, |
245 | 0 | *ptr_length_v_freq_follow); |
246 | 4.01k | } else { |
247 | 4.01k | if (*ptr_length_v_bord_follow > 1) { |
248 | 3.15k | ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow, |
249 | 3.15k | *ptr_length_v_bord_follow - 1); |
250 | | |
251 | 3.15k | ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow, |
252 | 3.15k | *ptr_length_v_bord_follow - 1); |
253 | | |
254 | 3.15k | *ptr_n_l = *ptr_n_l - 1; |
255 | 3.15k | } else { |
256 | 859 | memmove(ptr_v_bord, ptr_v_bord + 1, (*ptr_length_v_bord - 1) * sizeof(*ptr_v_bord)); |
257 | | |
258 | 859 | memmove(ptr_v_freq, ptr_v_freq + 1, (*ptr_length_v_freq - 1) * sizeof(*ptr_v_freq)); |
259 | 859 | *ptr_length_v_bord = b_new - 1; |
260 | 859 | *ptr_length_v_freq = b_new - 1; |
261 | | |
262 | 859 | ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow, |
263 | 859 | *ptr_length_v_bord_follow); |
264 | | |
265 | 859 | ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow, |
266 | 859 | *ptr_length_v_freq_follow); |
267 | 859 | } |
268 | 4.01k | } |
269 | 4.01k | } else { |
270 | 1.07k | ixheaace_fill_frame_pre(dmax, ptr_v_bord, ptr_length_v_bord, ptr_v_freq, ptr_length_v_freq, |
271 | 1.07k | bmin, middle); |
272 | | |
273 | 1.07k | ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow, |
274 | 1.07k | *ptr_length_v_bord_follow); |
275 | | |
276 | 1.07k | ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow, |
277 | 1.07k | *ptr_length_v_freq_follow); |
278 | 1.07k | } |
279 | 29.1k | } |
280 | | |
281 | | static VOID ixheaace_calc_frame_class(ixheaace_frame_class *ptr_frame_type, |
282 | | ixheaace_frame_class *ptr_frame_type_old, WORD32 tran_flag, |
283 | 572k | WORD32 *ptr_spread_flag, WORD32 is_ld_sbr) { |
284 | 572k | if (0 == is_ld_sbr) { |
285 | 429k | switch (*ptr_frame_type_old) { |
286 | 313k | case IXHEAACE_FIXFIX: |
287 | | |
288 | 313k | *ptr_frame_type = (tran_flag ? IXHEAACE_FIXVAR : IXHEAACE_FIXFIX); |
289 | 313k | break; |
290 | | |
291 | 44.5k | case IXHEAACE_FIXVAR: |
292 | | |
293 | 44.5k | if (tran_flag) { |
294 | 19.1k | *ptr_frame_type = IXHEAACE_VARVAR; |
295 | 19.1k | *ptr_spread_flag = 0; |
296 | 25.3k | } else { |
297 | 25.3k | *ptr_frame_type = (*ptr_spread_flag ? IXHEAACE_VARVAR : IXHEAACE_VARFIX); |
298 | 25.3k | } |
299 | 44.5k | break; |
300 | | |
301 | 42.7k | case IXHEAACE_VARFIX: |
302 | | |
303 | 42.7k | *ptr_frame_type = (tran_flag ? IXHEAACE_FIXVAR : IXHEAACE_FIXFIX); |
304 | 42.7k | break; |
305 | | |
306 | 28.2k | case IXHEAACE_VARVAR: |
307 | | |
308 | 28.2k | if (tran_flag) { |
309 | 9.95k | *ptr_frame_type = IXHEAACE_VARVAR; |
310 | 9.95k | *ptr_spread_flag = 0; |
311 | 18.3k | } else { |
312 | 18.3k | *ptr_frame_type = (*ptr_spread_flag ? IXHEAACE_VARVAR : IXHEAACE_VARFIX); |
313 | 18.3k | } |
314 | 28.2k | break; |
315 | 0 | default: |
316 | 0 | break; |
317 | 429k | } |
318 | 429k | } else { |
319 | 143k | *ptr_frame_type = (tran_flag ? IXHEAACE_LD_TRAN : IXHEAACE_FIXFIX); |
320 | 143k | } |
321 | 572k | *ptr_frame_type_old = *ptr_frame_type; |
322 | 572k | } |
323 | | |
324 | | static VOID ixheaace_special_case(WORD32 *ptr_spread_flag, WORD32 allow_spread, |
325 | | WORD32 *ptr_a_borders, WORD32 *ptr_border_vec_len, |
326 | | ixheaace_freq_res *ptr_freq_res, WORD32 *ptr_freq_res_vec_len, |
327 | 0 | WORD32 *ptr_num_parts, WORD32 ptr_d) { |
328 | 0 | WORD32 L; |
329 | |
|
330 | 0 | L = *ptr_border_vec_len; |
331 | |
|
332 | 0 | if (allow_spread) { |
333 | 0 | *ptr_spread_flag = 1; |
334 | |
|
335 | 0 | ixheaace_add_right(ptr_a_borders, ptr_border_vec_len, ptr_a_borders[L - 1] + 8); |
336 | |
|
337 | 0 | ixheaace_add_freq_right(ptr_freq_res, ptr_freq_res_vec_len, FREQ_RES_HIGH); |
338 | |
|
339 | 0 | (*ptr_num_parts)++; |
340 | 0 | } else { |
341 | 0 | if (ptr_d == 1) { |
342 | 0 | *ptr_border_vec_len = L - 1; |
343 | 0 | *ptr_freq_res_vec_len = L - 1; |
344 | 0 | } else { |
345 | 0 | if ((ptr_a_borders[L - 1] - ptr_a_borders[L - 2]) > 2) { |
346 | 0 | ptr_a_borders[L - 1] = ptr_a_borders[L - 1] - 2; |
347 | |
|
348 | 0 | ptr_freq_res[*ptr_freq_res_vec_len - 1] = FREQ_RES_LOW; |
349 | 0 | } |
350 | 0 | } |
351 | 0 | } |
352 | 0 | } |
353 | | |
354 | | static VOID ixheaace_calc_cmon_border(WORD32 *ptr_cmon_border_idx, WORD32 *ptr_tran_idx, |
355 | | WORD32 *ptr_a_borders, WORD32 *ptr_border_vec_len, |
356 | | WORD32 tran |
357 | | |
358 | 75.0k | ) { |
359 | 75.0k | WORD32 i; |
360 | | |
361 | 273k | for (i = 0; i < *ptr_border_vec_len; i++) { |
362 | 273k | if (ptr_a_borders[i] >= 16) { |
363 | 75.0k | *ptr_cmon_border_idx = i; |
364 | 75.0k | break; |
365 | 75.0k | } |
366 | 273k | } |
367 | 75.0k | i = 0; |
368 | 163k | while (i < *ptr_border_vec_len) { |
369 | 163k | if (ptr_a_borders[i] >= tran) { |
370 | 75.0k | *ptr_tran_idx = i; |
371 | 75.0k | break; |
372 | 88.1k | } else { |
373 | 88.1k | *ptr_tran_idx = IXHEAACE_EMPTY; |
374 | 88.1k | } |
375 | 88.1k | i++; |
376 | 88.1k | } |
377 | 75.0k | } |
378 | | |
379 | | static VOID ixheaace_keep_for_follow_up(WORD32 *ptr_a_borders_follow, |
380 | | WORD32 *ptr_border_vec_len_follow, |
381 | | ixheaace_freq_res *ptr_a_freq_res_follow, |
382 | | WORD32 *ptr_freq_res_vec_len_follow, |
383 | | WORD32 *ptr_tran_idx_follow, WORD32 *ptr_fill_idx_follow, |
384 | | WORD32 *ptr_a_borders, WORD32 *ptr_border_vec_len, |
385 | | ixheaace_freq_res *ptr_freq_res, WORD32 cmon_border_idx, |
386 | | WORD32 tran_idx, WORD32 num_parts |
387 | | |
388 | 75.0k | ) { |
389 | 75.0k | WORD32 L, i, j; |
390 | | |
391 | 75.0k | L = *ptr_border_vec_len; |
392 | | |
393 | 75.0k | (*ptr_border_vec_len_follow) = 0; |
394 | 75.0k | (*ptr_freq_res_vec_len_follow) = 0; |
395 | | |
396 | 75.0k | j = 0, i = cmon_border_idx; |
397 | | |
398 | 234k | while (i < L) { |
399 | 159k | ptr_a_borders_follow[j] = ptr_a_borders[i] - 16; |
400 | | |
401 | 159k | ptr_a_freq_res_follow[j] = ptr_freq_res[i]; |
402 | | |
403 | 159k | (*ptr_border_vec_len_follow)++; |
404 | 159k | (*ptr_freq_res_vec_len_follow)++; |
405 | 159k | i++, j++; |
406 | 159k | } |
407 | | |
408 | 75.0k | *ptr_tran_idx_follow = |
409 | 75.0k | (tran_idx != IXHEAACE_EMPTY ? tran_idx - cmon_border_idx : IXHEAACE_EMPTY); |
410 | | |
411 | 75.0k | *ptr_fill_idx_follow = L - (num_parts - 1) - cmon_border_idx; |
412 | 75.0k | } |
413 | | |
414 | | static VOID ixheaace_calc_ctrl_signal(ixheaace_pstr_sbr_grid pstr_sbr_grid, |
415 | | ixheaace_frame_class frame_type, WORD32 *ptr_v_bord, |
416 | | WORD32 length_v_bord, ixheaace_freq_res *ptr_v_freq, |
417 | | WORD32 length_v_freq, WORD32 i_cmon, WORD32 i_tran, |
418 | 118k | WORD32 spread_flag, WORD32 ptr_n_l) { |
419 | 118k | WORD32 i, r, a, n, p, b, a_l, a_r, ntot, nmax, n_r; |
420 | | |
421 | 118k | ixheaace_freq_res *ptr_v_f = pstr_sbr_grid->v_f; |
422 | 118k | ixheaace_freq_res *ptr_v_f_lr = pstr_sbr_grid->v_f_lr; |
423 | 118k | WORD32 *ptr_v_r = pstr_sbr_grid->bs_rel_bord; |
424 | 118k | WORD32 *ptr_v_rl = pstr_sbr_grid->bs_rel_bord_0; |
425 | 118k | WORD32 *ptr_v_rr = pstr_sbr_grid->bs_rel_bord_1; |
426 | | |
427 | 118k | WORD32 length_v_r = 0; |
428 | 118k | WORD32 length_v_rr = 0; |
429 | 118k | WORD32 length_v_rl = 0; |
430 | | |
431 | 118k | switch (frame_type) { |
432 | 45.9k | case IXHEAACE_FIXVAR: |
433 | | |
434 | 45.9k | a = ptr_v_bord[i_cmon]; |
435 | | |
436 | 45.9k | length_v_r = 0; |
437 | 45.9k | i = i_cmon; |
438 | | |
439 | 150k | while (i >= 1) { |
440 | 104k | r = ptr_v_bord[i] - ptr_v_bord[i - 1]; |
441 | | |
442 | 104k | ixheaace_add_right(ptr_v_r, &length_v_r, r); |
443 | | |
444 | 104k | i--; |
445 | 104k | } |
446 | | |
447 | 45.9k | n = length_v_r; |
448 | | |
449 | 150k | for (i = 0; i < i_cmon; i++) { |
450 | 104k | ptr_v_f[i] = ptr_v_freq[i_cmon - 1 - i]; |
451 | 104k | } |
452 | | |
453 | 45.9k | ptr_v_f[i_cmon] = FREQ_RES_HIGH; |
454 | | |
455 | 45.9k | if ((i_cmon >= i_tran) && (i_tran != IXHEAACE_EMPTY)) { |
456 | 45.9k | p = i_cmon - i_tran + 1; |
457 | 45.9k | } else { |
458 | 0 | p = 0; |
459 | 0 | } |
460 | | |
461 | 45.9k | pstr_sbr_grid->frame_type = frame_type; |
462 | 45.9k | pstr_sbr_grid->bs_abs_bord = a; |
463 | 45.9k | pstr_sbr_grid->n = n; |
464 | 45.9k | pstr_sbr_grid->p = p; |
465 | | |
466 | 45.9k | break; |
467 | 43.7k | case IXHEAACE_VARFIX: |
468 | | |
469 | 43.7k | a = ptr_v_bord[0]; |
470 | | |
471 | 43.7k | length_v_r = 0; |
472 | | |
473 | 43.7k | i = 1; |
474 | 91.7k | while (i < length_v_bord) { |
475 | 47.9k | r = ptr_v_bord[i] - ptr_v_bord[i - 1]; |
476 | | |
477 | 47.9k | ixheaace_add_right(ptr_v_r, &length_v_r, r); |
478 | | |
479 | 47.9k | i++; |
480 | 47.9k | } |
481 | | |
482 | 43.7k | n = length_v_r; |
483 | | |
484 | 43.7k | memcpy(ptr_v_f, ptr_v_freq, length_v_freq * sizeof(ixheaace_freq_res)); |
485 | | |
486 | 43.7k | if ((i_tran >= 0) && (i_tran != IXHEAACE_EMPTY)) { |
487 | 4.27k | p = i_tran + 1; |
488 | 39.4k | } else { |
489 | 39.4k | p = 0; |
490 | 39.4k | } |
491 | | |
492 | 43.7k | pstr_sbr_grid->frame_type = frame_type; |
493 | 43.7k | pstr_sbr_grid->bs_abs_bord = a; |
494 | 43.7k | pstr_sbr_grid->n = n; |
495 | 43.7k | pstr_sbr_grid->p = p; |
496 | | |
497 | 43.7k | break; |
498 | 29.1k | case IXHEAACE_VARVAR: |
499 | | |
500 | 29.1k | if (spread_flag) { |
501 | 0 | b = length_v_bord; |
502 | |
|
503 | 0 | a_l = ptr_v_bord[0]; |
504 | |
|
505 | 0 | a_r = ptr_v_bord[b - 1]; |
506 | |
|
507 | 0 | ntot = b - 2; |
508 | |
|
509 | 0 | nmax = 2; |
510 | |
|
511 | 0 | if (ntot > nmax) { |
512 | 0 | ptr_n_l = nmax; |
513 | 0 | n_r = ntot - nmax; |
514 | 0 | } else { |
515 | 0 | ptr_n_l = ntot; |
516 | 0 | n_r = 0; |
517 | 0 | } |
518 | |
|
519 | 0 | length_v_rl = 0; |
520 | |
|
521 | 0 | i = 1; |
522 | 0 | while (i <= ptr_n_l) { |
523 | 0 | r = ptr_v_bord[i] - ptr_v_bord[i - 1]; |
524 | |
|
525 | 0 | ixheaace_add_right(ptr_v_rl, &length_v_rl, r); |
526 | |
|
527 | 0 | i++; |
528 | 0 | } |
529 | |
|
530 | 0 | length_v_rr = 0; |
531 | |
|
532 | 0 | i = b - 1; |
533 | |
|
534 | 0 | while (i >= b - n_r) { |
535 | 0 | r = ptr_v_bord[i] - ptr_v_bord[i - 1]; |
536 | |
|
537 | 0 | ixheaace_add_right(ptr_v_rr, &length_v_rr, r); |
538 | |
|
539 | 0 | i--; |
540 | 0 | } |
541 | |
|
542 | 0 | if ((i_tran > 0) && (i_tran != IXHEAACE_EMPTY)) { |
543 | 0 | p = b - i_tran; |
544 | 0 | } else { |
545 | 0 | p = 0; |
546 | 0 | } |
547 | |
|
548 | 0 | for (i = 0; i < b - 1; i++) { |
549 | 0 | ptr_v_f_lr[i] = ptr_v_freq[i]; |
550 | 0 | } |
551 | 29.1k | } else { |
552 | 29.1k | length_v_bord = i_cmon + 1; |
553 | | |
554 | 29.1k | b = length_v_bord; |
555 | | |
556 | 29.1k | a_l = ptr_v_bord[0]; |
557 | | |
558 | 29.1k | a_r = ptr_v_bord[b - 1]; |
559 | | |
560 | 29.1k | ntot = b - 2; |
561 | 29.1k | n_r = ntot - ptr_n_l; |
562 | | |
563 | 29.1k | length_v_rl = 0; |
564 | | |
565 | 29.1k | i = 1; |
566 | 48.3k | while (i <= ptr_n_l) { |
567 | 19.2k | r = ptr_v_bord[i] - ptr_v_bord[i - 1]; |
568 | | |
569 | 19.2k | ixheaace_add_right(ptr_v_rl, &length_v_rl, r); |
570 | | |
571 | 19.2k | i++; |
572 | 19.2k | } |
573 | | |
574 | 29.1k | length_v_rr = 0; |
575 | | |
576 | 29.1k | i = b - 1; |
577 | | |
578 | 74.9k | while (i >= b - n_r) { |
579 | 45.8k | r = ptr_v_bord[i] - ptr_v_bord[i - 1]; |
580 | | |
581 | 45.8k | ixheaace_add_right(ptr_v_rr, &length_v_rr, r); |
582 | | |
583 | 45.8k | i--; |
584 | 45.8k | } |
585 | | |
586 | 29.1k | if ((i_cmon >= i_tran) && (i_tran != IXHEAACE_EMPTY)) { |
587 | 29.1k | p = i_cmon - i_tran + 1; |
588 | 29.1k | } else { |
589 | 0 | p = 0; |
590 | 0 | } |
591 | | |
592 | 123k | for (i = 0; i < b - 1; i++) { |
593 | 94.1k | ptr_v_f_lr[i] = ptr_v_freq[i]; |
594 | 94.1k | } |
595 | 29.1k | } |
596 | | |
597 | 29.1k | pstr_sbr_grid->frame_type = frame_type; |
598 | 29.1k | pstr_sbr_grid->bs_abs_bord_0 = a_l; |
599 | 29.1k | pstr_sbr_grid->bs_abs_bord_1 = a_r; |
600 | 29.1k | pstr_sbr_grid->bs_num_rel_0 = ptr_n_l; |
601 | 29.1k | pstr_sbr_grid->bs_num_rel_1 = n_r; |
602 | 29.1k | pstr_sbr_grid->p = p; |
603 | | |
604 | 29.1k | break; |
605 | | |
606 | 0 | default: |
607 | 0 | break; |
608 | 118k | } |
609 | 118k | } |
610 | | |
611 | | static VOID ixheaace_create_def_frame_info(ixheaace_pstr_sbr_frame_info pstr_sbr_frame_info, |
612 | 332k | WORD32 n_env, ixheaace_str_qmf_tabs *ptr_qmf_tab) { |
613 | 332k | switch (n_env) { |
614 | 313k | case NUM_ENVELOPE_1: |
615 | | |
616 | 313k | memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_info1_2048), |
617 | 313k | sizeof(ixheaace_str_frame_info_sbr)); |
618 | | |
619 | 313k | break; |
620 | | |
621 | 18.8k | case NUM_ENVELOPE_2: |
622 | | |
623 | 18.8k | memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_info2_2048), |
624 | 18.8k | sizeof(ixheaace_str_frame_info_sbr)); |
625 | | |
626 | 18.8k | break; |
627 | | |
628 | 0 | case NUM_ENVELOPE_4: |
629 | |
|
630 | 0 | memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_info4_2048), |
631 | 0 | sizeof(ixheaace_str_frame_info_sbr)); |
632 | |
|
633 | 0 | break; |
634 | 332k | } |
635 | 332k | } |
636 | | static VOID ixheaace_create_ld_transient_frame_info( |
637 | | ixheaace_pstr_sbr_frame_info pstr_sbr_frame_info, ixheaace_pstr_sbr_grid pstr_sbr_grid, |
638 | 36.6k | WORD32 tran_pos, WORD32 num_time_slots, WORD32 low_tran_flag) { |
639 | 36.6k | WORD32 num_env, i, diff; |
640 | 36.6k | const WORD32 *env_tab = NULL; |
641 | | |
642 | 36.6k | switch (num_time_slots) |
643 | | |
644 | 36.6k | { |
645 | 19.4k | case TIME_SLOTS_15: |
646 | 19.4k | env_tab = ixheaace_ld_env_tab_480[tran_pos]; |
647 | 19.4k | break; |
648 | | |
649 | 17.2k | default: |
650 | 17.2k | env_tab = ixheaace_ld_env_tab_512[tran_pos]; |
651 | 17.2k | break; |
652 | 36.6k | } |
653 | | |
654 | 36.6k | num_env = env_tab[0]; |
655 | | |
656 | 107k | for (i = 1; i < num_env; i++) { |
657 | 70.8k | pstr_sbr_frame_info->borders[i] = env_tab[i]; |
658 | 70.8k | } |
659 | | |
660 | 36.6k | pstr_sbr_frame_info->borders[0] = 0; |
661 | 36.6k | pstr_sbr_frame_info->borders[num_env] = num_time_slots; |
662 | | |
663 | 36.6k | i = 0; |
664 | 144k | while (i < num_env) { |
665 | 107k | diff = pstr_sbr_frame_info->borders[i + 1] - pstr_sbr_frame_info->borders[i]; |
666 | | |
667 | 107k | if (low_tran_flag) { |
668 | 68.4k | pstr_sbr_frame_info->freq_res[i] = FREQ_RES_LOW; |
669 | 68.4k | } else { |
670 | 39.1k | pstr_sbr_frame_info->freq_res[i] = (diff <= 5) ? FREQ_RES_LOW : FREQ_RES_HIGH; |
671 | 39.1k | } |
672 | | |
673 | 107k | pstr_sbr_grid->v_f[i] = pstr_sbr_frame_info->freq_res[i]; |
674 | | |
675 | 107k | i++; |
676 | 107k | } |
677 | | |
678 | 36.6k | pstr_sbr_frame_info->n_envelopes = num_env; |
679 | 36.6k | pstr_sbr_frame_info->short_env = env_tab[IXHEAACE_SBR_ENVT_TRANIDX]; |
680 | 36.6k | pstr_sbr_frame_info->borders_noise[0] = pstr_sbr_frame_info->borders[0]; |
681 | 36.6k | pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[1]; |
682 | 36.6k | pstr_sbr_frame_info->borders_noise[2] = num_time_slots; |
683 | 36.6k | pstr_sbr_frame_info->n_noise_envelopes = 2; |
684 | 36.6k | pstr_sbr_grid->frame_type = IXHEAACE_LD_TRAN; |
685 | 36.6k | pstr_sbr_grid->bs_transient_position = tran_pos; |
686 | 36.6k | pstr_sbr_grid->bs_num_env = num_env; |
687 | 36.6k | } |
688 | | static VOID ixheaace_create_def_frame_480_info(ixheaace_pstr_sbr_frame_info pstr_sbr_frame_info, |
689 | 84.7k | WORD32 n_env, ixheaace_str_qmf_tabs *ptr_qmf_tab) { |
690 | 84.7k | switch (n_env) { |
691 | 81.3k | case NUM_ENVELOPE_1: |
692 | | |
693 | 81.3k | memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_480_info1_2048), |
694 | 81.3k | sizeof(ixheaace_str_frame_info_sbr)); |
695 | | |
696 | 81.3k | break; |
697 | | |
698 | 3.41k | case NUM_ENVELOPE_2: |
699 | | |
700 | 3.41k | memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_480_info2_2048), |
701 | 3.41k | sizeof(ixheaace_str_frame_info_sbr)); |
702 | | |
703 | 3.41k | break; |
704 | | |
705 | 0 | case NUM_ENVELOPE_4: |
706 | |
|
707 | 0 | memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_480_info4_2048), |
708 | 0 | sizeof(ixheaace_str_frame_info_sbr)); |
709 | |
|
710 | 0 | break; |
711 | 84.7k | } |
712 | 84.7k | } |
713 | | |
714 | | static IA_ERRORCODE ixheaace_ctrl_signal2_frame_info( |
715 | | ixheaace_pstr_sbr_grid pstr_sbr_grid, ixheaace_pstr_sbr_frame_info pstr_sbr_frame_info, |
716 | 429k | ixheaace_freq_res freq_res_fix, ixheaace_str_qmf_tabs *ptr_qmf_tab, WORD32 frame_length_480) { |
717 | 429k | WORD32 n_env = 0, border = 0, i, k, p; |
718 | 429k | WORD32 *ptr_v_r = pstr_sbr_grid->bs_rel_bord; |
719 | 429k | ixheaace_freq_res *ptr_v_f = pstr_sbr_grid->v_f; |
720 | | |
721 | 429k | ixheaace_frame_class frame_type = pstr_sbr_grid->frame_type; |
722 | | |
723 | 429k | switch (frame_type) { |
724 | 310k | case IXHEAACE_FIXFIX: |
725 | 310k | if (frame_length_480) { |
726 | 26.4k | ixheaace_create_def_frame_480_info(pstr_sbr_frame_info, pstr_sbr_grid->bs_num_env, |
727 | 26.4k | ptr_qmf_tab); |
728 | 284k | } else { |
729 | 284k | ixheaace_create_def_frame_info(pstr_sbr_frame_info, pstr_sbr_grid->bs_num_env, |
730 | 284k | ptr_qmf_tab); |
731 | 284k | } |
732 | | |
733 | 310k | if (freq_res_fix == FREQ_RES_LOW) { |
734 | 98.1k | for (i = 0; i < pstr_sbr_frame_info->n_envelopes; i++) { |
735 | 49.9k | pstr_sbr_frame_info->freq_res[i] = FREQ_RES_LOW; |
736 | 49.9k | } |
737 | 48.2k | } |
738 | 310k | break; |
739 | | |
740 | 45.9k | case IXHEAACE_FIXVAR: |
741 | 89.6k | case IXHEAACE_VARFIX: |
742 | | |
743 | 89.6k | n_env = pstr_sbr_grid->n + 1; |
744 | | |
745 | 89.6k | if ((n_env <= 0) || (n_env > IXHEAACE_MAX_ENV_FIXVAR_VARFIX)) { |
746 | 0 | return IA_EXHEAACE_EXE_FATAL_INVALID_SBR_NUM_ENVELOPES; |
747 | 0 | } |
748 | | |
749 | 89.6k | pstr_sbr_frame_info->n_envelopes = n_env; |
750 | | |
751 | 89.6k | border = pstr_sbr_grid->bs_abs_bord; |
752 | | |
753 | 89.6k | pstr_sbr_frame_info->n_noise_envelopes = (n_env == 1 ? 1 : 2); |
754 | | |
755 | 89.6k | break; |
756 | | |
757 | 29.1k | case IXHEAACE_VARVAR: |
758 | 29.1k | break; |
759 | 0 | default: |
760 | 0 | return IA_EXHEAACE_EXE_FATAL_INVALID_SBR_FRAME_TYPE; |
761 | 0 | break; |
762 | 429k | } |
763 | | |
764 | 429k | switch (frame_type) { |
765 | 45.9k | case IXHEAACE_FIXVAR: |
766 | | |
767 | 45.9k | pstr_sbr_frame_info->borders[0] = 0; |
768 | | |
769 | 45.9k | pstr_sbr_frame_info->borders[n_env] = border; |
770 | | |
771 | 45.9k | k = 0; |
772 | 45.9k | i = n_env - 1; |
773 | 150k | while (k < n_env - 1) { |
774 | 104k | border -= ptr_v_r[k]; |
775 | | |
776 | 104k | pstr_sbr_frame_info->borders[i] = border; |
777 | 104k | k++; |
778 | 104k | i--; |
779 | 104k | } |
780 | | |
781 | 45.9k | p = pstr_sbr_grid->p; |
782 | | |
783 | 45.9k | if (p == 0) { |
784 | 0 | pstr_sbr_frame_info->short_env = 0; |
785 | 45.9k | } else { |
786 | 45.9k | pstr_sbr_frame_info->short_env = n_env + 1 - p; |
787 | 45.9k | } |
788 | | |
789 | 196k | for (k = 0, i = n_env - 1; k < n_env; k++, i--) { |
790 | 150k | pstr_sbr_frame_info->freq_res[i] = ptr_v_f[k]; |
791 | 150k | } |
792 | | |
793 | 45.9k | if (p == 0 || p == 1) { |
794 | 4.62k | pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env - 1]; |
795 | 41.3k | } else { |
796 | 41.3k | pstr_sbr_frame_info->borders_noise[1] = |
797 | 41.3k | pstr_sbr_frame_info->borders[pstr_sbr_frame_info->short_env]; |
798 | 41.3k | } |
799 | | |
800 | 45.9k | break; |
801 | | |
802 | 43.7k | case IXHEAACE_VARFIX: |
803 | 43.7k | pstr_sbr_frame_info->borders[0] = border; |
804 | | |
805 | 91.7k | for (k = 0; k < n_env - 1; k++) { |
806 | 47.9k | border += ptr_v_r[k]; |
807 | | |
808 | 47.9k | pstr_sbr_frame_info->borders[k + 1] = border; |
809 | 47.9k | } |
810 | | |
811 | 43.7k | pstr_sbr_frame_info->borders[n_env] = 16; |
812 | | |
813 | 43.7k | p = pstr_sbr_grid->p; |
814 | | |
815 | 43.7k | if (p == 0 || p == 1) { |
816 | 43.7k | pstr_sbr_frame_info->short_env = 0; |
817 | 43.7k | } else { |
818 | 0 | pstr_sbr_frame_info->short_env = p - 1; |
819 | 0 | } |
820 | | |
821 | 135k | for (k = 0; k < n_env; k++) { |
822 | 91.7k | pstr_sbr_frame_info->freq_res[k] = ptr_v_f[k]; |
823 | 91.7k | } |
824 | | |
825 | 43.7k | switch (p) { |
826 | 39.4k | case 0: |
827 | 39.4k | pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[1]; |
828 | 39.4k | break; |
829 | 4.27k | case 1: |
830 | 4.27k | pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env - 1]; |
831 | 4.27k | break; |
832 | 0 | default: |
833 | 0 | pstr_sbr_frame_info->borders_noise[1] = |
834 | 0 | pstr_sbr_frame_info->borders[pstr_sbr_frame_info->short_env]; |
835 | 0 | break; |
836 | 43.7k | } |
837 | 43.7k | break; |
838 | | |
839 | 43.7k | case IXHEAACE_VARVAR: |
840 | 29.1k | n_env = pstr_sbr_grid->bs_num_rel_0 + pstr_sbr_grid->bs_num_rel_1 + 1; |
841 | | |
842 | 29.1k | if ((n_env < 1) || (n_env > IXHEAACE_MAX_ENV_VARVAR)) { |
843 | 0 | return IA_EXHEAACE_EXE_FATAL_INVALID_SBR_NUM_ENVELOPES; |
844 | 0 | } |
845 | 29.1k | pstr_sbr_frame_info->n_envelopes = n_env; |
846 | | |
847 | 29.1k | pstr_sbr_frame_info->borders[0] = border = pstr_sbr_grid->bs_abs_bord_0; |
848 | | |
849 | 48.3k | for (k = 0, i = 1; k < pstr_sbr_grid->bs_num_rel_0; k++, i++) { |
850 | 19.2k | border += pstr_sbr_grid->bs_rel_bord_0[k]; |
851 | | |
852 | 19.2k | pstr_sbr_frame_info->borders[i] = border; |
853 | 19.2k | } |
854 | | |
855 | 29.1k | border = pstr_sbr_grid->bs_abs_bord_1; |
856 | | |
857 | 29.1k | pstr_sbr_frame_info->borders[n_env] = border; |
858 | | |
859 | 74.9k | for (k = 0, i = n_env - 1; k < pstr_sbr_grid->bs_num_rel_1; k++, i--) { |
860 | 45.8k | border -= pstr_sbr_grid->bs_rel_bord_1[k]; |
861 | | |
862 | 45.8k | pstr_sbr_frame_info->borders[i] = border; |
863 | 45.8k | } |
864 | | |
865 | 29.1k | p = pstr_sbr_grid->p; |
866 | | |
867 | 29.1k | pstr_sbr_frame_info->short_env = (p == 0 ? 0 : n_env + 1 - p); |
868 | | |
869 | 123k | for (k = 0; k < n_env; k++) { |
870 | 94.1k | pstr_sbr_frame_info->freq_res[k] = pstr_sbr_grid->v_f_lr[k]; |
871 | 94.1k | } |
872 | | |
873 | 29.1k | if (n_env == 1) { |
874 | 0 | pstr_sbr_frame_info->n_noise_envelopes = 1; |
875 | 0 | pstr_sbr_frame_info->borders_noise[0] = pstr_sbr_grid->bs_abs_bord_0; |
876 | 0 | pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_grid->bs_abs_bord_1; |
877 | 29.1k | } else { |
878 | 29.1k | pstr_sbr_frame_info->n_noise_envelopes = 2; |
879 | 29.1k | pstr_sbr_frame_info->borders_noise[0] = pstr_sbr_grid->bs_abs_bord_0; |
880 | | |
881 | 29.1k | if (p == 0 || p == 1) { |
882 | 4.26k | pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env - 1]; |
883 | 24.8k | } else { |
884 | 24.8k | pstr_sbr_frame_info->borders_noise[1] = |
885 | 24.8k | pstr_sbr_frame_info->borders[pstr_sbr_frame_info->short_env]; |
886 | 24.8k | } |
887 | | |
888 | 29.1k | pstr_sbr_frame_info->borders_noise[2] = pstr_sbr_grid->bs_abs_bord_1; |
889 | 29.1k | } |
890 | 29.1k | break; |
891 | | |
892 | 310k | default: |
893 | 310k | break; |
894 | 429k | } |
895 | | |
896 | 429k | if (frame_type == IXHEAACE_VARFIX || frame_type == IXHEAACE_FIXVAR) { |
897 | 89.6k | pstr_sbr_frame_info->borders_noise[0] = pstr_sbr_frame_info->borders[0]; |
898 | | |
899 | 89.6k | if (n_env == 1) { |
900 | 0 | pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env]; |
901 | 89.6k | } else { |
902 | 89.6k | pstr_sbr_frame_info->borders_noise[2] = pstr_sbr_frame_info->borders[n_env]; |
903 | 89.6k | } |
904 | 89.6k | } |
905 | 429k | return IA_NO_ERROR; |
906 | 429k | } |
907 | | |
908 | | IA_ERRORCODE |
909 | | ixheaace_frame_info_generator(ixheaace_pstr_sbr_env_frame pstr_sbr_env_frame, |
910 | | WORD32 *ptr_v_pre_transient_info, WORD32 *ptr_v_transient_info, |
911 | | WORD32 *ptr_v_tuning, ixheaace_str_qmf_tabs *ptr_qmf_tab, |
912 | | WORD32 num_time_slots, WORD32 is_ld_sbr, |
913 | | ixheaace_pstr_sbr_frame_info *ptr_frame_info, |
914 | 572k | WORD32 flag_framelength_small) { |
915 | 572k | IA_ERRORCODE err_code = IA_NO_ERROR; |
916 | 572k | WORD32 num_env, tran = 0, bmin = 0, bmax = 0; |
917 | 572k | WORD32 ptr_parts, ptr_d, i_cmon = 0, i_tran = IXHEAACE_EMPTY, ptr_n_l; |
918 | 572k | WORD32 fmax = 0; |
919 | | |
920 | 572k | WORD32 *ptr_v_bord = pstr_sbr_env_frame->v_bord; |
921 | 572k | ixheaace_freq_res *ptr_v_freq = pstr_sbr_env_frame->v_freq; |
922 | 572k | WORD32 *ptr_v_bord_follow = pstr_sbr_env_frame->v_bord_follow; |
923 | 572k | ixheaace_freq_res *ptr_v_freq_follow = pstr_sbr_env_frame->v_freq_follow; |
924 | | |
925 | 572k | WORD32 *ptr_length_v_bord_follow = &pstr_sbr_env_frame->length_v_bord_follow; |
926 | 572k | WORD32 *ptr_length_v_freq_follow = &pstr_sbr_env_frame->length_v_freq_follow; |
927 | 572k | WORD32 *ptr_length_v_bord = &pstr_sbr_env_frame->length_v_bord; |
928 | 572k | WORD32 *ptr_length_v_freq = &pstr_sbr_env_frame->length_v_freq; |
929 | 572k | WORD32 *ptr_spread_flag = &pstr_sbr_env_frame->spread_flag; |
930 | 572k | WORD32 *ptr_tran_follow = &pstr_sbr_env_frame->i_tran_follow; |
931 | 572k | WORD32 *ptr_fill_follow = &pstr_sbr_env_frame->i_fill_follow; |
932 | 572k | ixheaace_frame_class *ptr_frame_type_old = &pstr_sbr_env_frame->frame_type_old; |
933 | 572k | ixheaace_frame_class frame_type = IXHEAACE_FIXFIX; |
934 | | |
935 | 572k | WORD32 allow_spread = pstr_sbr_env_frame->allow_spread; |
936 | 572k | WORD32 num_env_static = pstr_sbr_env_frame->num_env_static; |
937 | 572k | WORD32 static_framing = pstr_sbr_env_frame->static_framing; |
938 | 572k | WORD32 dmin = pstr_sbr_env_frame->dmin; |
939 | 572k | WORD32 dmax = pstr_sbr_env_frame->dmax; |
940 | | |
941 | 572k | WORD32 tran_pos = ptr_v_transient_info[0]; |
942 | 572k | WORD32 tran_flag = ptr_v_transient_info[1]; |
943 | | |
944 | 572k | WORD32 *ptr_ptr_v_tuning_segm = ptr_v_tuning; |
945 | 572k | ixheaace_freq_res *ptr_tuning_freq = (ixheaace_freq_res *)(ptr_v_tuning + 3); |
946 | | |
947 | 572k | ixheaace_freq_res freq_res_fix = pstr_sbr_env_frame->freq_res_fix; |
948 | | |
949 | 572k | if (is_ld_sbr) { |
950 | 143k | if ((!tran_flag && ptr_v_pre_transient_info[1]) && |
951 | 143k | (num_time_slots - ptr_v_pre_transient_info[0] < 4)) { |
952 | 190 | tran_flag = 1; |
953 | 190 | tran_pos = 0; |
954 | 190 | } |
955 | 143k | } |
956 | 572k | if (static_framing) { |
957 | 0 | frame_type = IXHEAACE_FIXFIX; |
958 | 0 | num_env = num_env_static; |
959 | 0 | *ptr_frame_type_old = IXHEAACE_FIXFIX; |
960 | 0 | pstr_sbr_env_frame->sbr_grid.bs_num_env = num_env; |
961 | 0 | pstr_sbr_env_frame->sbr_grid.frame_type = frame_type; |
962 | 572k | } else { |
963 | 572k | ixheaace_calc_frame_class(&frame_type, ptr_frame_type_old, tran_flag, ptr_spread_flag, |
964 | 572k | is_ld_sbr); |
965 | 572k | if (is_ld_sbr && tran_flag) { |
966 | 36.6k | frame_type = IXHEAACE_LD_TRAN; |
967 | 36.6k | *ptr_frame_type_old = IXHEAACE_FIXFIX; |
968 | 36.6k | } |
969 | 572k | if (tran_flag) { |
970 | 111k | if (tran_pos < 4) { |
971 | 9.40k | fmax = 6; |
972 | 102k | } else if (tran_pos == 4 || tran_pos == 5) { |
973 | 4.66k | fmax = 4; |
974 | 4.66k | } else |
975 | 97.6k | fmax = 8; |
976 | | |
977 | 111k | tran = tran_pos + 4; |
978 | | |
979 | 111k | ixheaace_fill_frame_tran(ptr_v_bord, ptr_length_v_bord, ptr_v_freq, ptr_length_v_freq, |
980 | 111k | &bmin, &bmax, tran, ptr_ptr_v_tuning_segm, ptr_tuning_freq); |
981 | 111k | } |
982 | 572k | if (0 == is_ld_sbr) { |
983 | 429k | switch (frame_type) { |
984 | 45.9k | case IXHEAACE_FIXVAR: |
985 | | |
986 | 45.9k | ixheaace_fill_frame_pre(dmax, ptr_v_bord, ptr_length_v_bord, ptr_v_freq, |
987 | 45.9k | ptr_length_v_freq, bmin, bmin); |
988 | | |
989 | 45.9k | ixheaace_fill_Frame_Post(&ptr_parts, &ptr_d, dmax, ptr_v_bord, ptr_length_v_bord, |
990 | 45.9k | ptr_v_freq, ptr_length_v_freq, bmax, fmax); |
991 | | |
992 | 45.9k | if (ptr_parts == 1 && ptr_d < dmin) { |
993 | 0 | ixheaace_special_case(ptr_spread_flag, allow_spread, ptr_v_bord, ptr_length_v_bord, |
994 | 0 | ptr_v_freq, ptr_length_v_freq, &ptr_parts, ptr_d); |
995 | 0 | } |
996 | | |
997 | 45.9k | ixheaace_calc_cmon_border(&i_cmon, &i_tran, ptr_v_bord, ptr_length_v_bord, tran); |
998 | 45.9k | ixheaace_keep_for_follow_up(ptr_v_bord_follow, ptr_length_v_bord_follow, |
999 | 45.9k | ptr_v_freq_follow, ptr_length_v_freq_follow, |
1000 | 45.9k | ptr_tran_follow, ptr_fill_follow, ptr_v_bord, |
1001 | 45.9k | ptr_length_v_bord, ptr_v_freq, i_cmon, i_tran, ptr_parts); |
1002 | | |
1003 | 45.9k | ixheaace_calc_ctrl_signal(&pstr_sbr_env_frame->sbr_grid, frame_type, ptr_v_bord, |
1004 | 45.9k | *ptr_length_v_bord, ptr_v_freq, *ptr_length_v_freq, i_cmon, |
1005 | 45.9k | i_tran, *ptr_spread_flag, IXHEAACE_DC); |
1006 | 45.9k | break; |
1007 | 43.7k | case IXHEAACE_VARFIX: |
1008 | 43.7k | ixheaace_calc_ctrl_signal(&pstr_sbr_env_frame->sbr_grid, frame_type, ptr_v_bord_follow, |
1009 | 43.7k | *ptr_length_v_bord_follow, ptr_v_freq_follow, |
1010 | 43.7k | *ptr_length_v_freq_follow, IXHEAACE_DC, *ptr_tran_follow, |
1011 | 43.7k | *ptr_spread_flag, IXHEAACE_DC); |
1012 | 43.7k | break; |
1013 | 29.1k | case IXHEAACE_VARVAR: |
1014 | | |
1015 | 29.1k | if (*ptr_spread_flag) { |
1016 | 0 | ixheaace_calc_ctrl_signal(&pstr_sbr_env_frame->sbr_grid, frame_type, |
1017 | 0 | ptr_v_bord_follow, *ptr_length_v_bord_follow, |
1018 | 0 | ptr_v_freq_follow, *ptr_length_v_freq_follow, IXHEAACE_DC, |
1019 | 0 | *ptr_tran_follow, *ptr_spread_flag, IXHEAACE_DC); |
1020 | |
|
1021 | 0 | *ptr_spread_flag = 0; |
1022 | |
|
1023 | 0 | ptr_v_bord_follow[0] = pstr_sbr_env_frame->sbr_grid.bs_abs_bord_1 - 16; |
1024 | |
|
1025 | 0 | ptr_v_freq_follow[0] = FREQ_RES_HIGH; |
1026 | 0 | *ptr_length_v_bord_follow = 1; |
1027 | 0 | *ptr_length_v_freq_follow = 1; |
1028 | |
|
1029 | 0 | *ptr_tran_follow = -IXHEAACE_DC; |
1030 | 0 | *ptr_fill_follow = -IXHEAACE_DC; |
1031 | 29.1k | } else { |
1032 | 29.1k | ixheaace_fill_frame_inter( |
1033 | 29.1k | &ptr_n_l, ptr_ptr_v_tuning_segm, ptr_v_bord, ptr_length_v_bord, bmin, ptr_v_freq, |
1034 | 29.1k | ptr_length_v_freq, ptr_v_bord_follow, ptr_length_v_bord_follow, ptr_v_freq_follow, |
1035 | 29.1k | ptr_length_v_freq_follow, *ptr_fill_follow, dmin, dmax); |
1036 | | |
1037 | 29.1k | ixheaace_fill_Frame_Post(&ptr_parts, &ptr_d, dmax, ptr_v_bord, ptr_length_v_bord, |
1038 | 29.1k | ptr_v_freq, ptr_length_v_freq, bmax, fmax); |
1039 | | |
1040 | 29.1k | if (ptr_parts == 1 && ptr_d < dmin) { |
1041 | 0 | ixheaace_special_case(ptr_spread_flag, allow_spread, ptr_v_bord, ptr_length_v_bord, |
1042 | 0 | ptr_v_freq, ptr_length_v_freq, &ptr_parts, ptr_d); |
1043 | 0 | } |
1044 | | |
1045 | 29.1k | ixheaace_calc_cmon_border(&i_cmon, &i_tran, ptr_v_bord, ptr_length_v_bord, tran); |
1046 | | |
1047 | 29.1k | ixheaace_keep_for_follow_up(ptr_v_bord_follow, ptr_length_v_bord_follow, |
1048 | 29.1k | ptr_v_freq_follow, ptr_length_v_freq_follow, |
1049 | 29.1k | ptr_tran_follow, ptr_fill_follow, ptr_v_bord, |
1050 | 29.1k | ptr_length_v_bord, ptr_v_freq, i_cmon, i_tran, ptr_parts); |
1051 | | |
1052 | 29.1k | ixheaace_calc_ctrl_signal(&pstr_sbr_env_frame->sbr_grid, frame_type, ptr_v_bord, |
1053 | 29.1k | *ptr_length_v_bord, ptr_v_freq, *ptr_length_v_freq, i_cmon, |
1054 | 29.1k | i_tran, 0, ptr_n_l); |
1055 | 29.1k | } |
1056 | 29.1k | break; |
1057 | 310k | case IXHEAACE_FIXFIX: |
1058 | | |
1059 | 310k | num_env = (tran_pos == 0 ? 1 : 2); |
1060 | | |
1061 | 310k | pstr_sbr_env_frame->sbr_grid.bs_num_env = num_env; |
1062 | 310k | pstr_sbr_env_frame->sbr_grid.frame_type = frame_type; |
1063 | | |
1064 | 310k | break; |
1065 | 0 | default: |
1066 | 0 | break; |
1067 | 429k | } |
1068 | 429k | err_code = ixheaace_ctrl_signal2_frame_info( |
1069 | 429k | &pstr_sbr_env_frame->sbr_grid, &pstr_sbr_env_frame->sbr_frame_info, freq_res_fix, |
1070 | 429k | ptr_qmf_tab, flag_framelength_small); |
1071 | 429k | if (err_code) { |
1072 | 0 | return err_code; |
1073 | 0 | } |
1074 | 429k | } else { |
1075 | 143k | WORD32 i; |
1076 | | |
1077 | 143k | switch (frame_type) { |
1078 | 106k | case IXHEAACE_FIXFIX: { |
1079 | 106k | pstr_sbr_env_frame->sbr_grid.frame_type = frame_type; |
1080 | 106k | pstr_sbr_env_frame->sbr_grid.bs_transient_position = tran_pos; |
1081 | 106k | pstr_sbr_env_frame->sbr_frame_info.n_envelopes = 1; |
1082 | 106k | pstr_sbr_env_frame->sbr_grid.bs_num_env = 1; |
1083 | 106k | if (tran_pos == 1) { |
1084 | 2.44k | pstr_sbr_env_frame->sbr_grid.bs_num_env = 2; |
1085 | 2.44k | } |
1086 | 106k | pstr_sbr_env_frame->sbr_frame_info.short_env = 0; |
1087 | 106k | if (flag_framelength_small) { |
1088 | 58.3k | ixheaace_create_def_frame_480_info(&pstr_sbr_env_frame->sbr_frame_info, |
1089 | 58.3k | pstr_sbr_env_frame->sbr_grid.bs_num_env, |
1090 | 58.3k | ptr_qmf_tab); |
1091 | 58.3k | } else { |
1092 | 48.0k | ixheaace_create_def_frame_info(&pstr_sbr_env_frame->sbr_frame_info, |
1093 | 48.0k | pstr_sbr_env_frame->sbr_grid.bs_num_env, ptr_qmf_tab); |
1094 | 48.0k | } |
1095 | | |
1096 | 106k | if (pstr_sbr_env_frame->sbr_frame_info.n_envelopes > 1) { |
1097 | 7.32k | for (i = 0; i < pstr_sbr_env_frame->sbr_frame_info.n_envelopes; i++) { |
1098 | 4.88k | pstr_sbr_env_frame->sbr_frame_info.freq_res[i] = FREQ_RES_LOW; |
1099 | 4.88k | pstr_sbr_env_frame->sbr_grid.v_f[i] = FREQ_RES_LOW; |
1100 | 4.88k | } |
1101 | 103k | } else { |
1102 | 207k | for (i = 0; i < pstr_sbr_env_frame->sbr_frame_info.n_envelopes; i++) { |
1103 | 103k | pstr_sbr_env_frame->sbr_frame_info.freq_res[i] = FREQ_RES_HIGH; |
1104 | 103k | pstr_sbr_env_frame->sbr_grid.v_f[i] = FREQ_RES_HIGH; |
1105 | 103k | } |
1106 | 103k | } |
1107 | 106k | } break; |
1108 | | |
1109 | 36.6k | case IXHEAACE_LD_TRAN: { |
1110 | 36.6k | ixheaace_create_ld_transient_frame_info(&pstr_sbr_env_frame->sbr_frame_info, |
1111 | 36.6k | &pstr_sbr_env_frame->sbr_grid, tran_pos, |
1112 | 36.6k | num_time_slots, |
1113 | 36.6k | pstr_sbr_env_frame->use_low_freq_res); |
1114 | 36.6k | } break; |
1115 | 0 | default: |
1116 | 0 | break; |
1117 | 143k | } |
1118 | 143k | } |
1119 | 572k | } |
1120 | | |
1121 | 572k | *ptr_frame_info = &pstr_sbr_env_frame->sbr_frame_info; |
1122 | 572k | return err_code; |
1123 | 572k | } |
1124 | | |
1125 | | VOID ixheaace_create_frame_info_generator(ixheaace_pstr_sbr_env_frame pstr_sbr_env_frame, |
1126 | | WORD32 allow_spread, WORD32 num_env_static, |
1127 | | WORD32 static_framing, ixheaace_freq_res freq_res_fix, |
1128 | 11.3k | WORD32 use_low_freq_res) { |
1129 | 11.3k | memset(pstr_sbr_env_frame, 0, sizeof(ixheaace_str_sbr_env_frame)); |
1130 | | |
1131 | 11.3k | pstr_sbr_env_frame->frame_type_old = IXHEAACE_FIXFIX; |
1132 | 11.3k | pstr_sbr_env_frame->spread_flag = 0; |
1133 | | |
1134 | 11.3k | pstr_sbr_env_frame->allow_spread = allow_spread; |
1135 | 11.3k | pstr_sbr_env_frame->num_env_static = num_env_static; |
1136 | 11.3k | pstr_sbr_env_frame->static_framing = static_framing; |
1137 | 11.3k | pstr_sbr_env_frame->freq_res_fix = freq_res_fix; |
1138 | 11.3k | pstr_sbr_env_frame->use_low_freq_res = use_low_freq_res; |
1139 | | |
1140 | 11.3k | pstr_sbr_env_frame->length_v_bord = 0; |
1141 | 11.3k | pstr_sbr_env_frame->length_v_bord_follow = 0; |
1142 | | |
1143 | 11.3k | pstr_sbr_env_frame->length_v_freq = 0; |
1144 | 11.3k | pstr_sbr_env_frame->length_v_freq_follow = 0; |
1145 | | |
1146 | 11.3k | pstr_sbr_env_frame->i_tran_follow = 0; |
1147 | 11.3k | pstr_sbr_env_frame->i_fill_follow = 0; |
1148 | | |
1149 | 11.3k | pstr_sbr_env_frame->dmin = 4; |
1150 | 11.3k | pstr_sbr_env_frame->dmax = 12; |
1151 | 11.3k | } |