Coverage Report

Created: 2026-01-25 06:51

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