Coverage Report

Created: 2025-07-18 06:38

/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
}