Coverage Report

Created: 2025-10-10 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/encoder/ixheaace_sbr_frame_info_gen.c
Line
Count
Source
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
91.5k
                                   ixheaace_freq_res value) {
45
91.5k
  memmove(ptr_vector + 1, ptr_vector, *ptr_length_vector * sizeof(ptr_vector[0]));
46
91.5k
  ptr_vector[0] = value;
47
91.5k
  (*ptr_length_vector)++;
48
91.5k
}
49
50
static VOID ixheaace_add_freq_vec_left(ixheaace_freq_res *ptr_dst, WORD32 *length_dst,
51
30.1k
                                       ixheaace_freq_res *ptr_src, WORD32 length_src) {
52
30.1k
  WORD32 i;
53
30.1k
  i = length_src - 1;
54
83.7k
  while (i >= 0) {
55
53.6k
    ixheaace_add_freq_left(ptr_dst, length_dst, ptr_src[i]);
56
53.6k
    i--;
57
53.6k
  }
58
30.1k
}
59
60
static VOID ixheaace_add_freq_right(ixheaace_freq_res *ptr_vector, WORD32 *ptr_length_vector,
61
396k
                                    ixheaace_freq_res value) {
62
396k
  ptr_vector[*ptr_length_vector] = value;
63
64
396k
  (*ptr_length_vector)++;
65
396k
}
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
120k
                                     ixheaace_freq_res *ptr_tuning_freq) {
72
120k
  WORD32 bord, i;
73
74
120k
  *ptr_length_v_bord = 0;
75
120k
  *ptr_length_v_freq = 0;
76
77
120k
  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
120k
  bord = tran;
84
85
120k
  ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, tran);
86
87
120k
  if (ptr_ptr_v_tuning_segm[1]) {
88
120k
    bord += ptr_ptr_v_tuning_segm[1];
89
90
120k
    ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, bord);
91
92
120k
    ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, ptr_tuning_freq[1]);
93
120k
  }
94
95
120k
  if (ptr_ptr_v_tuning_segm[2] != 0) {
96
120k
    bord += ptr_ptr_v_tuning_segm[2];
97
98
120k
    ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, bord);
99
100
120k
    ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, ptr_tuning_freq[2]);
101
120k
  }
102
103
120k
  ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, FREQ_RES_HIGH);
104
105
120k
  *ptr_bmin = ptr_v_bord[0];
106
120k
  *ptr_bmax = ptr_v_bord[0];
107
108
482k
  for (i = 0; i < *ptr_length_v_bord; i++) {
109
361k
    if (ptr_v_bord[i] < *ptr_bmin) {
110
0
      *ptr_bmin = ptr_v_bord[i];
111
0
    }
112
361k
    if (ptr_v_bord[i] > *ptr_bmax) {
113
241k
      *ptr_bmax = ptr_v_bord[i];
114
241k
    }
115
361k
  }
116
120k
}
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
45.9k
                                    WORD32 bmin, WORD32 rest) {
121
45.9k
  WORD32 ptr_parts, ptr_d, j, S, s = 0, segm, bord;
122
123
45.9k
  ptr_parts = 1;
124
45.9k
  ptr_d = rest;
125
126
83.8k
  while (ptr_d > dmax) {
127
37.8k
    ptr_parts++;
128
129
37.8k
    segm = rest / ptr_parts;
130
131
37.8k
    S = ixheaac_shr32((segm - 2), 1);
132
133
37.8k
    s = ixheaac_min32(8, 2 * S + 2);
134
135
37.8k
    ptr_d = rest - (ptr_parts - 1) * s;
136
37.8k
  }
137
138
45.9k
  bord = bmin;
139
45.9k
  j = 0;
140
83.8k
  while (j <= ptr_parts - 2) {
141
37.8k
    bord = bord - s;
142
143
37.8k
    ixheaace_add_left(ptr_v_bord, ptr_length_v_bord, bord);
144
145
37.8k
    ixheaace_add_freq_left(ptr_v_freq, ptr_length_v_freq, FREQ_RES_HIGH);
146
37.8k
    j++;
147
37.8k
  }
148
45.9k
}
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.1k
                                     WORD32 bmax, WORD32 fmax) {
154
75.1k
  WORD32 j, rest, segm, S, s = 0, bord;
155
156
75.1k
  rest = 32 - bmax;
157
158
75.1k
  *ptr_d = rest;
159
160
75.1k
  if (*ptr_d > 0) {
161
75.1k
    *ptr_parts = 1; /* start with one envelope */
162
163
109k
    while (*ptr_d > dmax) {
164
34.5k
      *ptr_parts = *ptr_parts + 1;
165
166
34.5k
      segm = rest / (*ptr_parts);
167
168
34.5k
      S = ixheaac_shr32((segm - 2), 1);
169
170
34.5k
      s = ixheaac_min32(fmax, 2 * S + 2);
171
172
34.5k
      *ptr_d = rest - (*ptr_parts - 1) * s;
173
34.5k
    }
174
175
75.1k
    bord = bmax;
176
177
109k
    for (j = 0; j <= *ptr_parts - 2; j++) {
178
34.5k
      bord += s;
179
180
34.5k
      ixheaace_add_right(ptr_v_bord, ptr_length_v_bord, bord);
181
182
34.5k
      ixheaace_add_freq_right(ptr_v_freq, ptr_length_v_freq, FREQ_RES_HIGH);
183
34.5k
    }
184
75.1k
  } 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.1k
}
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
30.1k
                                      WORD32 dmin, WORD32 dmax) {
199
30.1k
  WORD32 middle, b_new, num_bord_follow, bord_max_follow;
200
201
30.1k
  if (fill_follow >= 1) {
202
26.6k
    *ptr_length_v_bord_follow = fill_follow;
203
26.6k
    *ptr_length_v_freq_follow = fill_follow;
204
26.6k
  }
205
206
30.1k
  num_bord_follow = *ptr_length_v_bord_follow;
207
208
30.1k
  bord_max_follow = ptr_v_bord_follow[num_bord_follow - 1];
209
210
30.1k
  middle = bmin - bord_max_follow;
211
212
32.7k
  while (middle < 0) {
213
2.62k
    num_bord_follow--;
214
215
2.62k
    bord_max_follow = ptr_v_bord_follow[num_bord_follow - 1];
216
217
2.62k
    middle = bmin - bord_max_follow;
218
2.62k
  }
219
220
30.1k
  *ptr_length_v_bord_follow = num_bord_follow;
221
30.1k
  *ptr_length_v_freq_follow = num_bord_follow;
222
223
30.1k
  *ptr_n_l = num_bord_follow - 1;
224
225
30.1k
  b_new = *ptr_length_v_bord;
226
227
30.1k
  if ((middle <= dmax) && (middle >= dmin)) {
228
24.4k
    ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow,
229
24.4k
                          *ptr_length_v_bord_follow);
230
231
24.4k
    ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow,
232
24.4k
                               *ptr_length_v_freq_follow);
233
24.4k
  }
234
235
5.64k
  else if ((middle <= dmax) && (middle < dmin)) {
236
4.61k
    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.61k
    } else {
247
4.61k
      if (*ptr_length_v_bord_follow > 1) {
248
3.92k
        ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow,
249
3.92k
                              *ptr_length_v_bord_follow - 1);
250
251
3.92k
        ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow,
252
3.92k
                                   *ptr_length_v_bord_follow - 1);
253
254
3.92k
        *ptr_n_l = *ptr_n_l - 1;
255
3.92k
      } else {
256
683
        memmove(ptr_v_bord, ptr_v_bord + 1, (*ptr_length_v_bord - 1) * sizeof(*ptr_v_bord));
257
258
683
        memmove(ptr_v_freq, ptr_v_freq + 1, (*ptr_length_v_freq - 1) * sizeof(*ptr_v_freq));
259
683
        *ptr_length_v_bord = b_new - 1;
260
683
        *ptr_length_v_freq = b_new - 1;
261
262
683
        ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow,
263
683
                              *ptr_length_v_bord_follow);
264
265
683
        ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow,
266
683
                                   *ptr_length_v_freq_follow);
267
683
      }
268
4.61k
    }
269
4.61k
  } else {
270
1.03k
    ixheaace_fill_frame_pre(dmax, ptr_v_bord, ptr_length_v_bord, ptr_v_freq, ptr_length_v_freq,
271
1.03k
                            bmin, middle);
272
273
1.03k
    ixheaace_add_vec_left(ptr_v_bord, ptr_length_v_bord, ptr_v_bord_follow,
274
1.03k
                          *ptr_length_v_bord_follow);
275
276
1.03k
    ixheaace_add_freq_vec_left(ptr_v_freq, ptr_length_v_freq, ptr_v_freq_follow,
277
1.03k
                               *ptr_length_v_freq_follow);
278
1.03k
  }
279
30.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
586k
                                      WORD32 *ptr_spread_flag, WORD32 is_ld_sbr) {
284
586k
  if (0 == is_ld_sbr) {
285
441k
    switch (*ptr_frame_type_old) {
286
325k
      case IXHEAACE_FIXFIX:
287
288
325k
        *ptr_frame_type = (tran_flag ? IXHEAACE_FIXVAR : IXHEAACE_FIXFIX);
289
325k
        break;
290
291
43.8k
      case IXHEAACE_FIXVAR:
292
293
43.8k
        if (tran_flag) {
294
20.1k
          *ptr_frame_type = IXHEAACE_VARVAR;
295
20.1k
          *ptr_spread_flag = 0;
296
23.6k
        } else {
297
23.6k
          *ptr_frame_type = (*ptr_spread_flag ? IXHEAACE_VARVAR : IXHEAACE_VARFIX);
298
23.6k
        }
299
43.8k
        break;
300
301
42.2k
      case IXHEAACE_VARFIX:
302
303
42.2k
        *ptr_frame_type = (tran_flag ? IXHEAACE_FIXVAR : IXHEAACE_FIXFIX);
304
42.2k
        break;
305
306
29.4k
      case IXHEAACE_VARVAR:
307
308
29.4k
        if (tran_flag) {
309
9.97k
          *ptr_frame_type = IXHEAACE_VARVAR;
310
9.97k
          *ptr_spread_flag = 0;
311
19.4k
        } else {
312
19.4k
          *ptr_frame_type = (*ptr_spread_flag ? IXHEAACE_VARVAR : IXHEAACE_VARFIX);
313
19.4k
        }
314
29.4k
        break;
315
0
      default:
316
0
        break;
317
441k
    }
318
441k
  } else {
319
145k
    *ptr_frame_type = (tran_flag ? IXHEAACE_LD_TRAN : IXHEAACE_FIXFIX);
320
145k
  }
321
586k
  *ptr_frame_type_old = *ptr_frame_type;
322
586k
}
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.1k
) {
359
75.1k
  WORD32 i;
360
361
266k
  for (i = 0; i < *ptr_border_vec_len; i++) {
362
266k
    if (ptr_a_borders[i] >= 16) {
363
75.1k
      *ptr_cmon_border_idx = i;
364
75.1k
      break;
365
75.1k
    }
366
266k
  }
367
75.1k
  i = 0;
368
166k
  while (i < *ptr_border_vec_len) {
369
166k
    if (ptr_a_borders[i] >= tran) {
370
75.1k
      *ptr_tran_idx = i;
371
75.1k
      break;
372
91.5k
    } else {
373
91.5k
      *ptr_tran_idx = IXHEAACE_EMPTY;
374
91.5k
    }
375
91.5k
    i++;
376
91.5k
  }
377
75.1k
}
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.1k
) {
389
75.1k
  WORD32 L, i, j;
390
391
75.1k
  L = *ptr_border_vec_len;
392
393
75.1k
  (*ptr_border_vec_len_follow) = 0;
394
75.1k
  (*ptr_freq_res_vec_len_follow) = 0;
395
396
75.1k
  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.1k
  *ptr_tran_idx_follow =
409
75.1k
      (tran_idx != IXHEAACE_EMPTY ? tran_idx - cmon_border_idx : IXHEAACE_EMPTY);
410
411
75.1k
  *ptr_fill_idx_follow = L - (num_parts - 1) - cmon_border_idx;
412
75.1k
}
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
44.9k
    case IXHEAACE_FIXVAR:
433
434
44.9k
      a = ptr_v_bord[i_cmon];
435
436
44.9k
      length_v_r = 0;
437
44.9k
      i = i_cmon;
438
439
137k
      while (i >= 1) {
440
92.3k
        r = ptr_v_bord[i] - ptr_v_bord[i - 1];
441
442
92.3k
        ixheaace_add_right(ptr_v_r, &length_v_r, r);
443
444
92.3k
        i--;
445
92.3k
      }
446
447
44.9k
      n = length_v_r;
448
449
137k
      for (i = 0; i < i_cmon; i++) {
450
92.3k
        ptr_v_f[i] = ptr_v_freq[i_cmon - 1 - i];
451
92.3k
      }
452
453
44.9k
      ptr_v_f[i_cmon] = FREQ_RES_HIGH;
454
455
44.9k
      if ((i_cmon >= i_tran) && (i_tran != IXHEAACE_EMPTY)) {
456
44.9k
        p = i_cmon - i_tran + 1;
457
44.9k
      } else {
458
0
        p = 0;
459
0
      }
460
461
44.9k
      pstr_sbr_grid->frame_type = frame_type;
462
44.9k
      pstr_sbr_grid->bs_abs_bord = a;
463
44.9k
      pstr_sbr_grid->n = n;
464
44.9k
      pstr_sbr_grid->p = p;
465
466
44.9k
      break;
467
43.1k
    case IXHEAACE_VARFIX:
468
469
43.1k
      a = ptr_v_bord[0];
470
471
43.1k
      length_v_r = 0;
472
473
43.1k
      i = 1;
474
90.4k
      while (i < length_v_bord) {
475
47.2k
        r = ptr_v_bord[i] - ptr_v_bord[i - 1];
476
477
47.2k
        ixheaace_add_right(ptr_v_r, &length_v_r, r);
478
479
47.2k
        i++;
480
47.2k
      }
481
482
43.1k
      n = length_v_r;
483
484
43.1k
      memcpy(ptr_v_f, ptr_v_freq, length_v_freq * sizeof(ixheaace_freq_res));
485
486
43.1k
      if ((i_tran >= 0) && (i_tran != IXHEAACE_EMPTY)) {
487
4.14k
        p = i_tran + 1;
488
38.9k
      } else {
489
38.9k
        p = 0;
490
38.9k
      }
491
492
43.1k
      pstr_sbr_grid->frame_type = frame_type;
493
43.1k
      pstr_sbr_grid->bs_abs_bord = a;
494
43.1k
      pstr_sbr_grid->n = n;
495
43.1k
      pstr_sbr_grid->p = p;
496
497
43.1k
      break;
498
30.1k
    case IXHEAACE_VARVAR:
499
500
30.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
30.1k
      } else {
552
30.1k
        length_v_bord = i_cmon + 1;
553
554
30.1k
        b = length_v_bord;
555
556
30.1k
        a_l = ptr_v_bord[0];
557
558
30.1k
        a_r = ptr_v_bord[b - 1];
559
560
30.1k
        ntot = b - 2;
561
30.1k
        n_r = ntot - ptr_n_l;
562
563
30.1k
        length_v_rl = 0;
564
565
30.1k
        i = 1;
566
53.6k
        while (i <= ptr_n_l) {
567
23.5k
          r = ptr_v_bord[i] - ptr_v_bord[i - 1];
568
569
23.5k
          ixheaace_add_right(ptr_v_rl, &length_v_rl, r);
570
571
23.5k
          i++;
572
23.5k
        }
573
574
30.1k
        length_v_rr = 0;
575
576
30.1k
        i = b - 1;
577
578
75.1k
        while (i >= b - n_r) {
579
45.0k
          r = ptr_v_bord[i] - ptr_v_bord[i - 1];
580
581
45.0k
          ixheaace_add_right(ptr_v_rr, &length_v_rr, r);
582
583
45.0k
          i--;
584
45.0k
        }
585
586
30.1k
        if ((i_cmon >= i_tran) && (i_tran != IXHEAACE_EMPTY)) {
587
30.1k
          p = i_cmon - i_tran + 1;
588
30.1k
        } else {
589
0
          p = 0;
590
0
        }
591
592
128k
        for (i = 0; i < b - 1; i++) {
593
98.7k
          ptr_v_f_lr[i] = ptr_v_freq[i];
594
98.7k
        }
595
30.1k
      }
596
597
30.1k
      pstr_sbr_grid->frame_type = frame_type;
598
30.1k
      pstr_sbr_grid->bs_abs_bord_0 = a_l;
599
30.1k
      pstr_sbr_grid->bs_abs_bord_1 = a_r;
600
30.1k
      pstr_sbr_grid->bs_num_rel_0 = ptr_n_l;
601
30.1k
      pstr_sbr_grid->bs_num_rel_1 = n_r;
602
30.1k
      pstr_sbr_grid->p = p;
603
604
30.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
342k
                                           WORD32 n_env, ixheaace_str_qmf_tabs *ptr_qmf_tab) {
613
342k
  switch (n_env) {
614
323k
    case NUM_ENVELOPE_1:
615
616
323k
      memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_info1_2048),
617
323k
             sizeof(ixheaace_str_frame_info_sbr));
618
619
323k
      break;
620
621
19.2k
    case NUM_ENVELOPE_2:
622
623
19.2k
      memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_info2_2048),
624
19.2k
             sizeof(ixheaace_str_frame_info_sbr));
625
626
19.2k
      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
342k
  }
635
342k
}
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
45.4k
    WORD32 tran_pos, WORD32 num_time_slots, WORD32 low_tran_flag) {
639
45.4k
  WORD32 num_env, i, diff;
640
45.4k
  const WORD32 *env_tab = NULL;
641
642
45.4k
  switch (num_time_slots)
643
644
45.4k
  {
645
20.8k
    case TIME_SLOTS_15:
646
20.8k
      env_tab = ixheaace_ld_env_tab_480[tran_pos];
647
20.8k
      break;
648
649
24.5k
    default:
650
24.5k
      env_tab = ixheaace_ld_env_tab_512[tran_pos];
651
24.5k
      break;
652
45.4k
  }
653
654
45.4k
  num_env = env_tab[0];
655
656
133k
  for (i = 1; i < num_env; i++) {
657
87.5k
    pstr_sbr_frame_info->borders[i] = env_tab[i];
658
87.5k
  }
659
660
45.4k
  pstr_sbr_frame_info->borders[0] = 0;
661
45.4k
  pstr_sbr_frame_info->borders[num_env] = num_time_slots;
662
663
45.4k
  i = 0;
664
178k
  while (i < num_env) {
665
133k
    diff = pstr_sbr_frame_info->borders[i + 1] - pstr_sbr_frame_info->borders[i];
666
667
133k
    if (low_tran_flag) {
668
90.5k
      pstr_sbr_frame_info->freq_res[i] = FREQ_RES_LOW;
669
90.5k
    } else {
670
42.4k
      pstr_sbr_frame_info->freq_res[i] = (diff <= 5) ? FREQ_RES_LOW : FREQ_RES_HIGH;
671
42.4k
    }
672
673
133k
    pstr_sbr_grid->v_f[i] = pstr_sbr_frame_info->freq_res[i];
674
675
133k
    i++;
676
133k
  }
677
678
45.4k
  pstr_sbr_frame_info->n_envelopes = num_env;
679
45.4k
  pstr_sbr_frame_info->short_env = env_tab[IXHEAACE_SBR_ENVT_TRANIDX];
680
45.4k
  pstr_sbr_frame_info->borders_noise[0] = pstr_sbr_frame_info->borders[0];
681
45.4k
  pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[1];
682
45.4k
  pstr_sbr_frame_info->borders_noise[2] = num_time_slots;
683
45.4k
  pstr_sbr_frame_info->n_noise_envelopes = 2;
684
45.4k
  pstr_sbr_grid->frame_type = IXHEAACE_LD_TRAN;
685
45.4k
  pstr_sbr_grid->bs_transient_position = tran_pos;
686
45.4k
  pstr_sbr_grid->bs_num_env = num_env;
687
45.4k
}
688
static VOID ixheaace_create_def_frame_480_info(ixheaace_pstr_sbr_frame_info pstr_sbr_frame_info,
689
80.6k
                                               WORD32 n_env, ixheaace_str_qmf_tabs *ptr_qmf_tab) {
690
80.6k
  switch (n_env) {
691
76.9k
    case NUM_ENVELOPE_1:
692
693
76.9k
      memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_480_info1_2048),
694
76.9k
             sizeof(ixheaace_str_frame_info_sbr));
695
696
76.9k
      break;
697
698
3.68k
    case NUM_ENVELOPE_2:
699
700
3.68k
      memcpy(pstr_sbr_frame_info, &(ptr_qmf_tab->frame_480_info2_2048),
701
3.68k
             sizeof(ixheaace_str_frame_info_sbr));
702
703
3.68k
      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
80.6k
  }
712
80.6k
}
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
441k
    ixheaace_freq_res freq_res_fix, ixheaace_str_qmf_tabs *ptr_qmf_tab, WORD32 frame_length_480) {
717
441k
  WORD32 n_env = 0, border = 0, i, k, p;
718
441k
  WORD32 *ptr_v_r = pstr_sbr_grid->bs_rel_bord;
719
441k
  ixheaace_freq_res *ptr_v_f = pstr_sbr_grid->v_f;
720
721
441k
  ixheaace_frame_class frame_type = pstr_sbr_grid->frame_type;
722
723
441k
  switch (frame_type) {
724
322k
    case IXHEAACE_FIXFIX:
725
322k
      if (frame_length_480) {
726
28.5k
        ixheaace_create_def_frame_480_info(pstr_sbr_frame_info, pstr_sbr_grid->bs_num_env,
727
28.5k
                                           ptr_qmf_tab);
728
294k
      } else {
729
294k
        ixheaace_create_def_frame_info(pstr_sbr_frame_info, pstr_sbr_grid->bs_num_env,
730
294k
                                       ptr_qmf_tab);
731
294k
      }
732
733
322k
      if (freq_res_fix == FREQ_RES_LOW) {
734
111k
        for (i = 0; i < pstr_sbr_frame_info->n_envelopes; i++) {
735
56.9k
          pstr_sbr_frame_info->freq_res[i] = FREQ_RES_LOW;
736
56.9k
        }
737
54.3k
      }
738
322k
      break;
739
740
44.9k
    case IXHEAACE_FIXVAR:
741
88.1k
    case IXHEAACE_VARFIX:
742
743
88.1k
      n_env = pstr_sbr_grid->n + 1;
744
745
88.1k
      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
88.1k
      pstr_sbr_frame_info->n_envelopes = n_env;
750
751
88.1k
      border = pstr_sbr_grid->bs_abs_bord;
752
753
88.1k
      pstr_sbr_frame_info->n_noise_envelopes = (n_env == 1 ? 1 : 2);
754
755
88.1k
      break;
756
757
30.1k
    case IXHEAACE_VARVAR:
758
30.1k
      break;
759
0
    default:
760
0
      return IA_EXHEAACE_EXE_FATAL_INVALID_SBR_FRAME_TYPE;
761
0
      break;
762
441k
  }
763
764
441k
  switch (frame_type) {
765
44.9k
    case IXHEAACE_FIXVAR:
766
767
44.9k
      pstr_sbr_frame_info->borders[0] = 0;
768
769
44.9k
      pstr_sbr_frame_info->borders[n_env] = border;
770
771
44.9k
      k = 0;
772
44.9k
      i = n_env - 1;
773
137k
      while (k < n_env - 1) {
774
92.3k
        border -= ptr_v_r[k];
775
776
92.3k
        pstr_sbr_frame_info->borders[i] = border;
777
92.3k
        k++;
778
92.3k
        i--;
779
92.3k
      }
780
781
44.9k
      p = pstr_sbr_grid->p;
782
783
44.9k
      if (p == 0) {
784
0
        pstr_sbr_frame_info->short_env = 0;
785
44.9k
      } else {
786
44.9k
        pstr_sbr_frame_info->short_env = n_env + 1 - p;
787
44.9k
      }
788
789
182k
      for (k = 0, i = n_env - 1; k < n_env; k++, i--) {
790
137k
        pstr_sbr_frame_info->freq_res[i] = ptr_v_f[k];
791
137k
      }
792
793
44.9k
      if (p == 0 || p == 1) {
794
4.78k
        pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env - 1];
795
40.1k
      } else {
796
40.1k
        pstr_sbr_frame_info->borders_noise[1] =
797
40.1k
            pstr_sbr_frame_info->borders[pstr_sbr_frame_info->short_env];
798
40.1k
      }
799
800
44.9k
      break;
801
802
43.1k
    case IXHEAACE_VARFIX:
803
43.1k
      pstr_sbr_frame_info->borders[0] = border;
804
805
90.4k
      for (k = 0; k < n_env - 1; k++) {
806
47.2k
        border += ptr_v_r[k];
807
808
47.2k
        pstr_sbr_frame_info->borders[k + 1] = border;
809
47.2k
      }
810
811
43.1k
      pstr_sbr_frame_info->borders[n_env] = 16;
812
813
43.1k
      p = pstr_sbr_grid->p;
814
815
43.1k
      if (p == 0 || p == 1) {
816
43.1k
        pstr_sbr_frame_info->short_env = 0;
817
43.1k
      } else {
818
0
        pstr_sbr_frame_info->short_env = p - 1;
819
0
      }
820
821
133k
      for (k = 0; k < n_env; k++) {
822
90.4k
        pstr_sbr_frame_info->freq_res[k] = ptr_v_f[k];
823
90.4k
      }
824
825
43.1k
      switch (p) {
826
38.9k
        case 0:
827
38.9k
          pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[1];
828
38.9k
          break;
829
4.14k
        case 1:
830
4.14k
          pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env - 1];
831
4.14k
          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.1k
      }
837
43.1k
      break;
838
839
43.1k
    case IXHEAACE_VARVAR:
840
30.1k
      n_env = pstr_sbr_grid->bs_num_rel_0 + pstr_sbr_grid->bs_num_rel_1 + 1;
841
842
30.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
30.1k
      pstr_sbr_frame_info->n_envelopes = n_env;
846
847
30.1k
      pstr_sbr_frame_info->borders[0] = border = pstr_sbr_grid->bs_abs_bord_0;
848
849
53.6k
      for (k = 0, i = 1; k < pstr_sbr_grid->bs_num_rel_0; k++, i++) {
850
23.5k
        border += pstr_sbr_grid->bs_rel_bord_0[k];
851
852
23.5k
        pstr_sbr_frame_info->borders[i] = border;
853
23.5k
      }
854
855
30.1k
      border = pstr_sbr_grid->bs_abs_bord_1;
856
857
30.1k
      pstr_sbr_frame_info->borders[n_env] = border;
858
859
75.1k
      for (k = 0, i = n_env - 1; k < pstr_sbr_grid->bs_num_rel_1; k++, i--) {
860
45.0k
        border -= pstr_sbr_grid->bs_rel_bord_1[k];
861
862
45.0k
        pstr_sbr_frame_info->borders[i] = border;
863
45.0k
      }
864
865
30.1k
      p = pstr_sbr_grid->p;
866
867
30.1k
      pstr_sbr_frame_info->short_env = (p == 0 ? 0 : n_env + 1 - p);
868
869
128k
      for (k = 0; k < n_env; k++) {
870
98.7k
        pstr_sbr_frame_info->freq_res[k] = pstr_sbr_grid->v_f_lr[k];
871
98.7k
      }
872
873
30.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
30.1k
      } else {
878
30.1k
        pstr_sbr_frame_info->n_noise_envelopes = 2;
879
30.1k
        pstr_sbr_frame_info->borders_noise[0] = pstr_sbr_grid->bs_abs_bord_0;
880
881
30.1k
        if (p == 0 || p == 1) {
882
4.68k
          pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env - 1];
883
25.4k
        } else {
884
25.4k
          pstr_sbr_frame_info->borders_noise[1] =
885
25.4k
              pstr_sbr_frame_info->borders[pstr_sbr_frame_info->short_env];
886
25.4k
        }
887
888
30.1k
        pstr_sbr_frame_info->borders_noise[2] = pstr_sbr_grid->bs_abs_bord_1;
889
30.1k
      }
890
30.1k
      break;
891
892
322k
    default:
893
322k
      break;
894
441k
  }
895
896
441k
  if (frame_type == IXHEAACE_VARFIX || frame_type == IXHEAACE_FIXVAR) {
897
88.1k
    pstr_sbr_frame_info->borders_noise[0] = pstr_sbr_frame_info->borders[0];
898
899
88.1k
    if (n_env == 1) {
900
0
      pstr_sbr_frame_info->borders_noise[1] = pstr_sbr_frame_info->borders[n_env];
901
88.1k
    } else {
902
88.1k
      pstr_sbr_frame_info->borders_noise[2] = pstr_sbr_frame_info->borders[n_env];
903
88.1k
    }
904
88.1k
  }
905
441k
  return IA_NO_ERROR;
906
441k
}
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
586k
                              WORD32 flag_framelength_small) {
915
586k
  IA_ERRORCODE err_code = IA_NO_ERROR;
916
586k
  WORD32 num_env, tran = 0, bmin = 0, bmax = 0;
917
586k
  WORD32 ptr_parts, ptr_d, i_cmon = 0, i_tran = IXHEAACE_EMPTY, ptr_n_l;
918
586k
  WORD32 fmax = 0;
919
920
586k
  WORD32 *ptr_v_bord = pstr_sbr_env_frame->v_bord;
921
586k
  ixheaace_freq_res *ptr_v_freq = pstr_sbr_env_frame->v_freq;
922
586k
  WORD32 *ptr_v_bord_follow = pstr_sbr_env_frame->v_bord_follow;
923
586k
  ixheaace_freq_res *ptr_v_freq_follow = pstr_sbr_env_frame->v_freq_follow;
924
925
586k
  WORD32 *ptr_length_v_bord_follow = &pstr_sbr_env_frame->length_v_bord_follow;
926
586k
  WORD32 *ptr_length_v_freq_follow = &pstr_sbr_env_frame->length_v_freq_follow;
927
586k
  WORD32 *ptr_length_v_bord = &pstr_sbr_env_frame->length_v_bord;
928
586k
  WORD32 *ptr_length_v_freq = &pstr_sbr_env_frame->length_v_freq;
929
586k
  WORD32 *ptr_spread_flag = &pstr_sbr_env_frame->spread_flag;
930
586k
  WORD32 *ptr_tran_follow = &pstr_sbr_env_frame->i_tran_follow;
931
586k
  WORD32 *ptr_fill_follow = &pstr_sbr_env_frame->i_fill_follow;
932
586k
  ixheaace_frame_class *ptr_frame_type_old = &pstr_sbr_env_frame->frame_type_old;
933
586k
  ixheaace_frame_class frame_type = IXHEAACE_FIXFIX;
934
935
586k
  WORD32 allow_spread = pstr_sbr_env_frame->allow_spread;
936
586k
  WORD32 num_env_static = pstr_sbr_env_frame->num_env_static;
937
586k
  WORD32 static_framing = pstr_sbr_env_frame->static_framing;
938
586k
  WORD32 dmin = pstr_sbr_env_frame->dmin;
939
586k
  WORD32 dmax = pstr_sbr_env_frame->dmax;
940
941
586k
  WORD32 tran_pos = ptr_v_transient_info[0];
942
586k
  WORD32 tran_flag = ptr_v_transient_info[1];
943
944
586k
  WORD32 *ptr_ptr_v_tuning_segm = ptr_v_tuning;
945
586k
  ixheaace_freq_res *ptr_tuning_freq = (ixheaace_freq_res *)(ptr_v_tuning + 3);
946
947
586k
  ixheaace_freq_res freq_res_fix = pstr_sbr_env_frame->freq_res_fix;
948
949
586k
  if (is_ld_sbr) {
950
145k
    if ((!tran_flag && ptr_v_pre_transient_info[1]) &&
951
13.9k
        (num_time_slots - ptr_v_pre_transient_info[0] < 4)) {
952
256
      tran_flag = 1;
953
256
      tran_pos = 0;
954
256
    }
955
145k
  }
956
586k
  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
586k
  } else {
963
586k
    ixheaace_calc_frame_class(&frame_type, ptr_frame_type_old, tran_flag, ptr_spread_flag,
964
586k
                              is_ld_sbr);
965
586k
    if (is_ld_sbr && tran_flag) {
966
45.4k
      frame_type = IXHEAACE_LD_TRAN;
967
45.4k
      *ptr_frame_type_old = IXHEAACE_FIXFIX;
968
45.4k
    }
969
586k
    if (tran_flag) {
970
120k
      if (tran_pos < 4) {
971
11.0k
        fmax = 6;
972
109k
      } else if (tran_pos == 4 || tran_pos == 5) {
973
5.98k
        fmax = 4;
974
5.98k
      } else
975
103k
        fmax = 8;
976
977
120k
      tran = tran_pos + 4;
978
979
120k
      ixheaace_fill_frame_tran(ptr_v_bord, ptr_length_v_bord, ptr_v_freq, ptr_length_v_freq,
980
120k
                               &bmin, &bmax, tran, ptr_ptr_v_tuning_segm, ptr_tuning_freq);
981
120k
    }
982
586k
    if (0 == is_ld_sbr) {
983
441k
      switch (frame_type) {
984
44.9k
        case IXHEAACE_FIXVAR:
985
986
44.9k
          ixheaace_fill_frame_pre(dmax, ptr_v_bord, ptr_length_v_bord, ptr_v_freq,
987
44.9k
                                  ptr_length_v_freq, bmin, bmin);
988
989
44.9k
          ixheaace_fill_Frame_Post(&ptr_parts, &ptr_d, dmax, ptr_v_bord, ptr_length_v_bord,
990
44.9k
                                   ptr_v_freq, ptr_length_v_freq, bmax, fmax);
991
992
44.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
44.9k
          ixheaace_calc_cmon_border(&i_cmon, &i_tran, ptr_v_bord, ptr_length_v_bord, tran);
998
44.9k
          ixheaace_keep_for_follow_up(ptr_v_bord_follow, ptr_length_v_bord_follow,
999
44.9k
                                      ptr_v_freq_follow, ptr_length_v_freq_follow,
1000
44.9k
                                      ptr_tran_follow, ptr_fill_follow, ptr_v_bord,
1001
44.9k
                                      ptr_length_v_bord, ptr_v_freq, i_cmon, i_tran, ptr_parts);
1002
1003
44.9k
          ixheaace_calc_ctrl_signal(&pstr_sbr_env_frame->sbr_grid, frame_type, ptr_v_bord,
1004
44.9k
                                    *ptr_length_v_bord, ptr_v_freq, *ptr_length_v_freq, i_cmon,
1005
44.9k
                                    i_tran, *ptr_spread_flag, IXHEAACE_DC);
1006
44.9k
          break;
1007
43.1k
        case IXHEAACE_VARFIX:
1008
43.1k
          ixheaace_calc_ctrl_signal(&pstr_sbr_env_frame->sbr_grid, frame_type, ptr_v_bord_follow,
1009
43.1k
                                    *ptr_length_v_bord_follow, ptr_v_freq_follow,
1010
43.1k
                                    *ptr_length_v_freq_follow, IXHEAACE_DC, *ptr_tran_follow,
1011
43.1k
                                    *ptr_spread_flag, IXHEAACE_DC);
1012
43.1k
          break;
1013
30.1k
        case IXHEAACE_VARVAR:
1014
1015
30.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
30.1k
          } else {
1032
30.1k
            ixheaace_fill_frame_inter(
1033
30.1k
                &ptr_n_l, ptr_ptr_v_tuning_segm, ptr_v_bord, ptr_length_v_bord, bmin, ptr_v_freq,
1034
30.1k
                ptr_length_v_freq, ptr_v_bord_follow, ptr_length_v_bord_follow, ptr_v_freq_follow,
1035
30.1k
                ptr_length_v_freq_follow, *ptr_fill_follow, dmin, dmax);
1036
1037
30.1k
            ixheaace_fill_Frame_Post(&ptr_parts, &ptr_d, dmax, ptr_v_bord, ptr_length_v_bord,
1038
30.1k
                                     ptr_v_freq, ptr_length_v_freq, bmax, fmax);
1039
1040
30.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
30.1k
            ixheaace_calc_cmon_border(&i_cmon, &i_tran, ptr_v_bord, ptr_length_v_bord, tran);
1046
1047
30.1k
            ixheaace_keep_for_follow_up(ptr_v_bord_follow, ptr_length_v_bord_follow,
1048
30.1k
                                        ptr_v_freq_follow, ptr_length_v_freq_follow,
1049
30.1k
                                        ptr_tran_follow, ptr_fill_follow, ptr_v_bord,
1050
30.1k
                                        ptr_length_v_bord, ptr_v_freq, i_cmon, i_tran, ptr_parts);
1051
1052
30.1k
            ixheaace_calc_ctrl_signal(&pstr_sbr_env_frame->sbr_grid, frame_type, ptr_v_bord,
1053
30.1k
                                      *ptr_length_v_bord, ptr_v_freq, *ptr_length_v_freq, i_cmon,
1054
30.1k
                                      i_tran, 0, ptr_n_l);
1055
30.1k
          }
1056
30.1k
          break;
1057
322k
        case IXHEAACE_FIXFIX:
1058
1059
322k
          num_env = (tran_pos == 0 ? 1 : 2);
1060
1061
322k
          pstr_sbr_env_frame->sbr_grid.bs_num_env = num_env;
1062
322k
          pstr_sbr_env_frame->sbr_grid.frame_type = frame_type;
1063
1064
322k
          break;
1065
0
        default:
1066
0
          break;
1067
441k
      }
1068
441k
      err_code = ixheaace_ctrl_signal2_frame_info(
1069
441k
          &pstr_sbr_env_frame->sbr_grid, &pstr_sbr_env_frame->sbr_frame_info, freq_res_fix,
1070
441k
          ptr_qmf_tab, flag_framelength_small);
1071
441k
      if (err_code) {
1072
0
        return err_code;
1073
0
      }
1074
441k
    } else {
1075
145k
      WORD32 i;
1076
1077
145k
      switch (frame_type) {
1078
100k
        case IXHEAACE_FIXFIX: {
1079
100k
          pstr_sbr_env_frame->sbr_grid.frame_type = frame_type;
1080
100k
          pstr_sbr_env_frame->sbr_grid.bs_transient_position = tran_pos;
1081
100k
          pstr_sbr_env_frame->sbr_frame_info.n_envelopes = 1;
1082
100k
          pstr_sbr_env_frame->sbr_grid.bs_num_env = 1;
1083
100k
          if (tran_pos == 1) {
1084
4.74k
            pstr_sbr_env_frame->sbr_grid.bs_num_env = 2;
1085
4.74k
          }
1086
100k
          pstr_sbr_env_frame->sbr_frame_info.short_env = 0;
1087
100k
          if (flag_framelength_small) {
1088
52.1k
            ixheaace_create_def_frame_480_info(&pstr_sbr_env_frame->sbr_frame_info,
1089
52.1k
                                               pstr_sbr_env_frame->sbr_grid.bs_num_env,
1090
52.1k
                                               ptr_qmf_tab);
1091
52.1k
          } else {
1092
48.1k
            ixheaace_create_def_frame_info(&pstr_sbr_env_frame->sbr_frame_info,
1093
48.1k
                                           pstr_sbr_env_frame->sbr_grid.bs_num_env, ptr_qmf_tab);
1094
48.1k
          }
1095
1096
100k
          if (pstr_sbr_env_frame->sbr_frame_info.n_envelopes > 1) {
1097
14.2k
            for (i = 0; i < pstr_sbr_env_frame->sbr_frame_info.n_envelopes; i++) {
1098
9.48k
              pstr_sbr_env_frame->sbr_frame_info.freq_res[i] = FREQ_RES_LOW;
1099
9.48k
              pstr_sbr_env_frame->sbr_grid.v_f[i] = FREQ_RES_LOW;
1100
9.48k
            }
1101
95.5k
          } else {
1102
191k
            for (i = 0; i < pstr_sbr_env_frame->sbr_frame_info.n_envelopes; i++) {
1103
95.5k
              pstr_sbr_env_frame->sbr_frame_info.freq_res[i] = FREQ_RES_HIGH;
1104
95.5k
              pstr_sbr_env_frame->sbr_grid.v_f[i] = FREQ_RES_HIGH;
1105
95.5k
            }
1106
95.5k
          }
1107
100k
        } break;
1108
1109
45.4k
        case IXHEAACE_LD_TRAN: {
1110
45.4k
          ixheaace_create_ld_transient_frame_info(&pstr_sbr_env_frame->sbr_frame_info,
1111
45.4k
                                                  &pstr_sbr_env_frame->sbr_grid, tran_pos,
1112
45.4k
                                                  num_time_slots,
1113
45.4k
                                                  pstr_sbr_env_frame->use_low_freq_res);
1114
45.4k
        } break;
1115
0
        default:
1116
0
          break;
1117
145k
      }
1118
145k
    }
1119
586k
  }
1120
1121
586k
  *ptr_frame_info = &pstr_sbr_env_frame->sbr_frame_info;
1122
586k
  return err_code;
1123
586k
}
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
10.3k
                                          WORD32 use_low_freq_res) {
1129
10.3k
  memset(pstr_sbr_env_frame, 0, sizeof(ixheaace_str_sbr_env_frame));
1130
1131
10.3k
  pstr_sbr_env_frame->frame_type_old = IXHEAACE_FIXFIX;
1132
10.3k
  pstr_sbr_env_frame->spread_flag = 0;
1133
1134
10.3k
  pstr_sbr_env_frame->allow_spread = allow_spread;
1135
10.3k
  pstr_sbr_env_frame->num_env_static = num_env_static;
1136
10.3k
  pstr_sbr_env_frame->static_framing = static_framing;
1137
10.3k
  pstr_sbr_env_frame->freq_res_fix = freq_res_fix;
1138
10.3k
  pstr_sbr_env_frame->use_low_freq_res = use_low_freq_res;
1139
1140
10.3k
  pstr_sbr_env_frame->length_v_bord = 0;
1141
10.3k
  pstr_sbr_env_frame->length_v_bord_follow = 0;
1142
1143
10.3k
  pstr_sbr_env_frame->length_v_freq = 0;
1144
10.3k
  pstr_sbr_env_frame->length_v_freq_follow = 0;
1145
1146
10.3k
  pstr_sbr_env_frame->i_tran_follow = 0;
1147
10.3k
  pstr_sbr_env_frame->i_fill_follow = 0;
1148
1149
10.3k
  pstr_sbr_env_frame->dmin = 4;
1150
10.3k
  pstr_sbr_env_frame->dmax = 12;
1151
10.3k
}