Coverage Report

Created: 2026-09-01 06:32

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