Coverage Report

Created: 2026-08-31 07:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/encoder/iusace_esbr_pvc.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
#include <math.h>
23
24
#include "ixheaac_type_def.h"
25
#include "ixheaac_constants.h"
26
#include "ixheaace_aac_constants.h"
27
#include "ixheaac_basic_ops32.h"
28
#include "ixheaac_basic_ops16.h"
29
#include "ixheaac_basic_ops40.h"
30
#include "ixheaac_error_standards.h"
31
#include "ixheaace_error_codes.h"
32
33
#include "ixheaace_bitbuffer.h"
34
#include "iusace_esbr_pvc.h"
35
#include "ixheaace_common_utils.h"
36
#include "ixheaace_sbr_cmondata.h"
37
38
2.91k
IA_ERRORCODE ixheaace_pvc_enc_init(ixheaace_pvc_enc *pstr_pvc_enc, WORD32 sbr_pvc_rate) {
39
2.91k
  pstr_pvc_enc->pvc_prv_param.pvc_flag = IXHEAACE_ESBR_PVC_FLAG_PREV_DFLT;
40
2.91k
  pstr_pvc_enc->pvc_prv_param.pvc_id = IXHEAACE_ESBR_PVC_ID_PREV_DFLT;
41
2.91k
  pstr_pvc_enc->pvc_prv_param.pvc_rate = IXHEAACE_ESBR_PVC_RATE_PREV_DFLT;
42
2.91k
  pstr_pvc_enc->pvc_prv_param.start_band = IXHEAACE_ESBR_PVC_STRT_BAND_PREV_DFLT;
43
2.91k
  pstr_pvc_enc->pvc_param.pvc_rate = (UWORD8)sbr_pvc_rate;
44
45
2.91k
  return IA_NO_ERROR;
46
2.91k
}
47
48
static VOID ixheaace_pvc_sb_grouping(ixheaace_pvc_enc *pstr_pvc_enc, UWORD8 start_band,
49
                                     FLOAT32 *ptr_qmf_low, FLOAT32 *ptr_sb_grp_energy,
50
25.3k
                                     WORD32 first_pvc_ts) {
51
25.3k
  WORD32 ksg, ts, band;
52
25.3k
  FLOAT32 tmp_sb_grp_energy;
53
25.3k
  WORD32 lbw, sb;
54
25.3k
  WORD32 nqmf_lb;
55
25.3k
  FLOAT32 *ptr_tmp_qmfl;
56
57
25.3k
  ixheaace_pvc_params *pstr_params = &pstr_pvc_enc->pvc_param;
58
25.3k
  ixheaace_pvc_prv_frm_params *pstr_prv_params = &pstr_pvc_enc->pvc_prv_param;
59
60
25.3k
  nqmf_lb = IXHEAACE_ESBR_PVC_NUM_QMF_BANDS / pstr_params->pvc_rate;
61
25.3k
  lbw = 8 / pstr_params->pvc_rate;
62
63
431k
  for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
64
405k
    sb = start_band - lbw * pstr_params->num_grp_core;
65
405k
    ksg = 0;
66
1.62M
    while (ksg < pstr_params->num_grp_core) {
67
1.21M
      tmp_sb_grp_energy = 0.0f;
68
1.21M
      if (sb >= 0) {
69
1.21M
        ptr_tmp_qmfl = &ptr_qmf_low[ts * nqmf_lb + sb];
70
1.21M
        band = 0;
71
5.20M
        while (band < lbw) {
72
3.98M
          tmp_sb_grp_energy += ptr_tmp_qmfl[band];
73
3.98M
          band++;
74
3.98M
        }
75
1.21M
        tmp_sb_grp_energy /= lbw;
76
1.21M
      }
77
78
1.21M
      tmp_sb_grp_energy = max(IXHEAACE_ESBR_PVC_POW_THRS, tmp_sb_grp_energy);
79
1.21M
      ptr_sb_grp_energy[(ts + IXHEAACE_ESBR_PVC_NUM_TS - 1) * 3 + ksg] =
80
1.21M
          10 * (FLOAT32)log10(tmp_sb_grp_energy);
81
1.21M
      sb += lbw;
82
1.21M
      ksg++;
83
1.21M
    }
84
405k
  }
85
86
25.3k
  if ((pstr_prv_params->pvc_flag == 0) ||
87
24.7k
      ((start_band * pstr_params->pvc_rate) !=
88
24.7k
       (pstr_prv_params->start_band * pstr_prv_params->pvc_rate))) {
89
9.47k
    for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS - 1 + first_pvc_ts; ts++) {
90
8.88k
      memcpy(&ptr_sb_grp_energy[ts * 3],
91
8.88k
             &ptr_sb_grp_energy[(IXHEAACE_ESBR_PVC_NUM_TS - 1 + first_pvc_ts) * 3],
92
8.88k
             pstr_params->num_grp_core * sizeof(ptr_sb_grp_energy[0]));
93
8.88k
    }
94
592
  }
95
96
25.3k
  return;
97
25.3k
}
98
99
static IA_ERRORCODE ixheaace_set_pvc_mode_param(ixheaace_pvc_params *pstr_pvc_param,
100
25.3k
                                                ixheaace_pvc_coef_tabs *pstr_pvc_tabs) {
101
25.3k
  pstr_pvc_param->num_grp_core = IXHEAACE_ESBR_PVC_NUM_BANDS_CORE;
102
25.3k
  pstr_pvc_param->num_pvc_id = IXHEAACE_ESBR_PVC_NUM_PVCID;
103
104
25.3k
  switch (pstr_pvc_param->pvc_mode) {
105
0
    case IXHEAACE_ESBR_PVC_MODE_1:
106
0
      pstr_pvc_param->num_grp_sbr = IXHEAACE_ESBR_PVC_NUM_BANDS_SBR_MODE1;
107
0
      pstr_pvc_param->hbw = 8 / pstr_pvc_param->pvc_rate;
108
0
      pstr_pvc_tabs->pvc_pred_coef_kb_012 =
109
0
          (UWORD8 *)ixheaace_pvc_tabs.pvc_prd_coef_kb_012_mode_1;
110
0
      pstr_pvc_tabs->pvc_pred_coef_kb_3 = (UWORD8 *)ixheaace_pvc_tabs.pvc_prd_coef_kb_3_mode_1;
111
0
      pstr_pvc_tabs->pvc_idx_tab = ixheaace_pvc_tabs.pvc_idx_mode_1;
112
0
      pstr_pvc_tabs->scaling_coef = ixheaace_pvc_tabs.pvc_scaling_coef_mode_1;
113
0
      break;
114
115
25.3k
    case IXHEAACE_ESBR_PVC_MODE_2:
116
25.3k
      pstr_pvc_param->num_grp_sbr = IXHEAACE_ESBR_PVC_NUM_BANDS_SBR_MODE2;
117
25.3k
      pstr_pvc_param->hbw = 12 / pstr_pvc_param->pvc_rate;
118
25.3k
      pstr_pvc_tabs->pvc_pred_coef_kb_012 =
119
25.3k
          (UWORD8 *)ixheaace_pvc_tabs.pvc_prd_coef_kb_012_mode_2;
120
25.3k
      pstr_pvc_tabs->pvc_pred_coef_kb_3 = (UWORD8 *)ixheaace_pvc_tabs.pvc_prd_coef_kb_3_mode_2;
121
25.3k
      pstr_pvc_tabs->pvc_idx_tab = ixheaace_pvc_tabs.pvc_idx_mode_2;
122
25.3k
      pstr_pvc_tabs->scaling_coef = ixheaace_pvc_tabs.pvc_scaling_coef_mode_2;
123
25.3k
      break;
124
125
0
    default:
126
0
      return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_PVC_MODE;
127
25.3k
  }
128
25.3k
  return IA_NO_ERROR;
129
25.3k
}
130
131
static VOID ixheaace_pvc_sb_grouping_ref(ixheaace_pvc_params *pstr_pvc_param, UWORD8 start_band,
132
                                         UWORD8 stop_band, FLOAT32 *ptr_qmf_high,
133
25.3k
                                         FLOAT32 *ptr_sb_grp_energy) {
134
25.3k
  WORD32 ksg, ts, band;
135
25.3k
  UWORD8 min_sb;
136
25.3k
  WORD32 sb, eb;
137
25.3k
  FLOAT32 tmp_sb_grp_energy;
138
139
25.3k
  min_sb = start_band + pstr_pvc_param->num_grp_sbr * pstr_pvc_param->hbw - 1;
140
25.3k
  stop_band = max(stop_band, min_sb);
141
142
431k
  for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
143
405k
    sb = start_band;
144
405k
    eb = min((sb + pstr_pvc_param->hbw - 1), (IXHEAACE_ESBR_PVC_NUM_QMF_BANDS - 1));
145
146
2.02M
    for (ksg = 0; ksg < (pstr_pvc_param->num_grp_sbr - 2); ksg++) {
147
1.62M
      tmp_sb_grp_energy = 0.0f;
148
1.62M
      band = sb;
149
9.60M
      while (band <= eb) {
150
7.97M
        tmp_sb_grp_energy += ptr_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + band];
151
7.97M
        band++;
152
7.97M
      }
153
1.62M
      tmp_sb_grp_energy = tmp_sb_grp_energy / (eb - sb + 1);
154
155
1.62M
      ptr_sb_grp_energy[ts * pstr_pvc_param->num_grp_sbr + ksg] =
156
1.62M
          max(IXHEAACE_ESBR_PVC_POW_THRS, tmp_sb_grp_energy);
157
1.62M
      sb += pstr_pvc_param->hbw;
158
1.62M
      eb = min((sb + pstr_pvc_param->hbw - 1), stop_band);
159
1.62M
      eb = min(eb, (IXHEAACE_ESBR_PVC_NUM_QMF_BANDS - 1));
160
1.62M
    }
161
162
1.21M
    while (ksg < pstr_pvc_param->num_grp_sbr) {
163
811k
      tmp_sb_grp_energy = 0.0f;
164
811k
      band = sb;
165
7.96M
      while (band <= eb) {
166
7.15M
        tmp_sb_grp_energy += ptr_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + band];
167
7.15M
        band++;
168
7.15M
      }
169
811k
      tmp_sb_grp_energy = tmp_sb_grp_energy / (eb - sb + 1);
170
171
811k
      ptr_sb_grp_energy[ts * pstr_pvc_param->num_grp_sbr + ksg] =
172
811k
          max(IXHEAACE_ESBR_PVC_POW_THRS, tmp_sb_grp_energy);
173
811k
      sb += pstr_pvc_param->hbw;
174
811k
      eb = min(stop_band, (IXHEAACE_ESBR_PVC_NUM_QMF_BANDS - 1));
175
811k
      ksg++;
176
811k
    }
177
405k
  }
178
25.3k
  return;
179
25.3k
}
180
181
static VOID ixheaace_pvc_calc_grp_energy_below_sbr(ixheaace_pvc_enc *pstr_pvc_enc, WORD32 ts,
182
405k
                                                   FLOAT32 *ptr_sb_grp_ene_blsbr) {
183
405k
  WORD32 ksg = 0, idx;
184
405k
  ixheaace_pvc_params *pstr_pvc_params = &pstr_pvc_enc->pvc_param;
185
186
405k
  memset(ptr_sb_grp_ene_blsbr, 0,
187
405k
         pstr_pvc_params->num_grp_core * sizeof(ptr_sb_grp_ene_blsbr[0]));
188
189
1.62M
  while (ksg < pstr_pvc_params->num_grp_core) {
190
11.4M
    for (idx = 0; idx < pstr_pvc_params->time_smth_ts; idx++) {
191
10.1M
      ptr_sb_grp_ene_blsbr[ksg] +=
192
10.1M
          pstr_pvc_enc->sb_grp_energy[ts + IXHEAACE_ESBR_PVC_NUM_TS - 1 - idx][ksg] *
193
10.1M
          pstr_pvc_enc->pvc_tabs.smoothing_coef[idx];
194
10.1M
    }
195
1.21M
    ksg++;
196
1.21M
  }
197
405k
  return;
198
405k
}
199
200
static VOID ixheaace_pvc_predict(ixheaace_pvc_enc *pstr_pvc_enc, WORD32 ts,
201
51.9M
                                 FLOAT32 *ptr_sb_grp_ene_blsbr, FLOAT32 *ptr_sb_grp_energy_high) {
202
51.9M
  ixheaace_pvc_params *pstr_pvc_params = &(pstr_pvc_enc->pvc_param);
203
51.9M
  ixheaace_pvc_coef_tabs *pstr_pvc_tabs = &(pstr_pvc_enc->pvc_tabs);
204
205
51.9M
  WORD32 ksg, kb, idx_tab_1, idx_tab_2;
206
51.9M
  const UWORD8 *ptr_tab;
207
51.9M
  FLOAT32 prod;
208
209
51.9M
  idx_tab_2 = pstr_pvc_params->pvc_id[ts];
210
211
51.9M
  if (idx_tab_2 < pstr_pvc_tabs->pvc_idx_tab[0]) {
212
6.49M
    idx_tab_1 = 0;
213
45.4M
  } else if (idx_tab_2 < pstr_pvc_tabs->pvc_idx_tab[1]) {
214
14.6M
    idx_tab_1 = 1;
215
30.8M
  } else {
216
30.8M
    idx_tab_1 = 2;
217
30.8M
  }
218
219
51.9M
  memset(ptr_sb_grp_energy_high, 0,
220
51.9M
         pstr_pvc_params->num_grp_sbr * sizeof(ptr_sb_grp_energy_high[0]));
221
222
51.9M
  ptr_tab = &(pstr_pvc_tabs->pvc_pred_coef_kb_012[idx_tab_1 * pstr_pvc_params->num_grp_core *
223
51.9M
                                                  pstr_pvc_params->num_grp_sbr]);
224
225
207M
  for (kb = 0; kb < pstr_pvc_params->num_grp_core; kb++) {
226
155M
    prod = pstr_pvc_tabs->scaling_coef[kb] * ptr_sb_grp_ene_blsbr[kb];
227
1.09G
    for (ksg = 0; ksg < pstr_pvc_params->num_grp_sbr; ksg++) {
228
935M
      ptr_sb_grp_energy_high[ksg] += ((FLOAT32)(WORD8)(*(ptr_tab++)) * prod);
229
935M
    }
230
155M
  }
231
232
51.9M
  ptr_tab = &(pstr_pvc_tabs->pvc_pred_coef_kb_3[idx_tab_2 * pstr_pvc_params->num_grp_sbr]);
233
51.9M
  prod = pstr_pvc_tabs->scaling_coef[pstr_pvc_params->num_grp_core];
234
235
363M
  for (ksg = 0; ksg < pstr_pvc_params->num_grp_sbr; ksg++) {
236
311M
    ptr_sb_grp_energy_high[ksg] += (FLOAT32)(WORD8)(*(ptr_tab++)) * prod;
237
311M
  }
238
239
51.9M
  return;
240
51.9M
}
241
242
25.3k
static VOID ixheaace_pvc_packing(ixheaace_pvc_enc *pstr_pvc_enc, WORD32 const usac_indep_flag) {
243
25.3k
  UWORD16 *ptr_pvc_bs;
244
25.3k
  ixheaace_pvc_params *pstr_params = &pstr_pvc_enc->pvc_param;
245
25.3k
  ixheaace_pvc_prv_frm_params *pstr_prv_params = &pstr_pvc_enc->pvc_prv_param;
246
25.3k
  ixheaace_pvc_bs_info *pstr_pvc_bs_info = &pstr_pvc_enc->pvc_bs_info;
247
248
25.3k
  ptr_pvc_bs = pstr_pvc_bs_info->pvc_id_bs;
249
250
25.3k
  pstr_pvc_bs_info->ns_mode = pstr_params->ns_mode;
251
252
25.3k
  if ((usac_indep_flag == 1) || (pstr_params->pvc_id[1] != pstr_prv_params->pvc_id)) {
253
10.9k
    pstr_pvc_bs_info->grid_info[0] = 1;
254
10.9k
    *(ptr_pvc_bs++) = pstr_params->pvc_id[0];
255
14.4k
  } else {
256
14.4k
    pstr_pvc_bs_info->grid_info[0] = 0;
257
14.4k
  }
258
259
25.3k
  if (pstr_params->pvc_id[8] == pstr_params->pvc_id[7]) {
260
15.5k
    pstr_pvc_bs_info->div_mode = 0;
261
15.5k
  } else {
262
9.79k
    pstr_pvc_bs_info->div_mode = 4;
263
9.79k
    pstr_pvc_bs_info->num_grid_info = 2;
264
9.79k
    pstr_pvc_bs_info->grid_info[1] = 1;
265
9.79k
    *(ptr_pvc_bs++) = pstr_params->pvc_id[8];
266
9.79k
  }
267
25.3k
  return;
268
25.3k
}
269
270
51.9M
static FLOAT32 ixheaace_pvc_calc_res(FLOAT32 *ptr_org, FLOAT32 *ptr_prd, UWORD8 ng_sb_sbr) {
271
51.9M
  FLOAT32 residual = 0, diff;
272
51.9M
  WORD32 band = 0;
273
274
363M
  while (band < ng_sb_sbr) {
275
311M
    diff = ptr_org[band] - ptr_prd[band];
276
311M
    residual += diff * diff;
277
311M
    band++;
278
311M
  }
279
51.9M
  residual = (FLOAT32)sqrt(residual);
280
281
51.9M
  return residual;
282
51.9M
}
283
284
VOID ixheaace_pvc_calc_grp_energy(ixheaace_pvc_enc *pstr_pvc_enc,
285
25.3k
                                  FLOAT32 *ptr_sb_grp_energy_hi_ref) {
286
25.3k
  WORD32 ts, res_init_flg = 1, pvc_id, i;
287
25.3k
  FLOAT32 res_all[128] = {0}, res_min, sb_grp_energy_blwsbr[3], sb_grp_energy_hi[8], res = 0;
288
25.3k
  UWORD16 *ptr_pvc_id, tmp = 0;
289
290
25.3k
  ptr_pvc_id = pstr_pvc_enc->pvc_param.pvc_id;
291
431k
  for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
292
405k
    ixheaace_pvc_calc_grp_energy_below_sbr(pstr_pvc_enc, ts, sb_grp_energy_blwsbr);
293
52.3M
    for (pvc_id = 0; pvc_id < pstr_pvc_enc->pvc_param.num_pvc_id; pvc_id++) {
294
51.9M
      pstr_pvc_enc->pvc_param.pvc_id[ts] = (UWORD16)pvc_id;
295
51.9M
      ixheaace_pvc_predict(pstr_pvc_enc, ts, sb_grp_energy_blwsbr, sb_grp_energy_hi);
296
297
51.9M
      res = ixheaace_pvc_calc_res(
298
51.9M
          &(ptr_sb_grp_energy_hi_ref[ts * pstr_pvc_enc->pvc_param.num_grp_sbr]), sb_grp_energy_hi,
299
51.9M
          pstr_pvc_enc->pvc_param.num_grp_sbr);
300
51.9M
      if (res_init_flg) {
301
6.49M
        res_all[pvc_id] = res;
302
45.4M
      } else {
303
45.4M
        res_all[pvc_id] += res;
304
45.4M
      }
305
51.9M
    }
306
307
405k
    res_init_flg = 0;
308
405k
    if ((ts & (IXHEAACE_ESBR_PVC_NTS_GRP_ID - 1)) == (IXHEAACE_ESBR_PVC_NTS_GRP_ID - 1)) {
309
50.7k
      res_min = IXHEAACE_ESBR_PVC_RESIDUAL_VAL;
310
50.7k
      pvc_id = 0;
311
6.54M
      while (pvc_id < pstr_pvc_enc->pvc_param.num_pvc_id) {
312
6.49M
        if (res_all[pvc_id] < res_min) {
313
254k
          tmp = (UWORD16)pvc_id;
314
254k
          res_min = res_all[pvc_id];
315
254k
        }
316
6.49M
        pvc_id++;
317
6.49M
      }
318
456k
      for (i = 0; i < IXHEAACE_ESBR_PVC_NTS_GRP_ID; i++) {
319
405k
        *(ptr_pvc_id++) = tmp;
320
405k
      }
321
50.7k
      res_init_flg = 1;
322
50.7k
    }
323
405k
  }
324
325
405k
  for (ts = 0; ts < 15; ts++) {
326
380k
    memcpy(&pstr_pvc_enc->sb_grp_energy[ts][0],
327
380k
           &pstr_pvc_enc->sb_grp_energy[ts + IXHEAACE_ESBR_PVC_NUM_TS][0],
328
380k
           IXHEAACE_ESBR_PVC_NUM_BANDS_CORE * sizeof(pstr_pvc_enc->sb_grp_energy[ts][0]));
329
380k
  }
330
25.3k
}
331
332
VOID ixheaace_pvc_calc_ref_ene_update_tabs(ixheaace_pvc_enc *pstr_pvc_enc,
333
25.3k
                                           FLOAT32 *ptr_sb_grp_energy_hi_ref) {
334
25.3k
  WORD32 ts, band;
335
25.3k
  FLOAT32 sum, prev_sum = 0;
336
25.3k
  pstr_pvc_enc->pvc_param.ns_mode = 0;
337
338
25.3k
  switch (pstr_pvc_enc->pvc_param.pvc_mode) {
339
0
    case 1: {
340
0
      pstr_pvc_enc->pvc_param.time_smth_ts = IXHEAACE_ESBR_PVC_NUM_TS;
341
0
      pstr_pvc_enc->pvc_tabs.smoothing_coef = ixheaace_pvc_tabs.pvc_smth_win_ns_16;
342
0
      break;
343
0
    }
344
25.3k
    case 2: {
345
25.3k
      pstr_pvc_enc->pvc_param.time_smth_ts = 12;
346
25.3k
      pstr_pvc_enc->pvc_tabs.smoothing_coef = ixheaace_pvc_tabs.pvc_smth_win_ns_12;
347
25.3k
      break;
348
0
    }
349
0
    default: {
350
      // No assignment
351
0
      break;
352
0
    }
353
25.3k
  }
354
355
431k
  for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
356
405k
    FLOAT32 *ptr_grp_energy =
357
405k
        &(ptr_sb_grp_energy_hi_ref[ts * pstr_pvc_enc->pvc_param.num_grp_sbr]);
358
405k
    sum = 0.0f;
359
2.84M
    for (band = 0; band < pstr_pvc_enc->pvc_param.num_grp_sbr; band++) {
360
2.43M
      sum += *ptr_grp_energy;
361
362
2.43M
      *ptr_grp_energy = 10 * (FLOAT32)log10(*ptr_grp_energy);
363
2.43M
      ptr_grp_energy++;
364
2.43M
    }
365
405k
    if (ts && (sum > prev_sum * IXHEAACE_ESBR_PVC_NS_MODE_PRD_THRS)) {
366
25.2k
      pstr_pvc_enc->pvc_param.ns_mode = 1;
367
25.2k
    }
368
405k
    prev_sum = sum;
369
405k
  }
370
371
25.3k
  if (pstr_pvc_enc->pvc_param.ns_mode == 1) {
372
10.2k
    switch (pstr_pvc_enc->pvc_param.pvc_mode) {
373
0
      case 1: {
374
0
        pstr_pvc_enc->pvc_param.time_smth_ts = 4;
375
0
        pstr_pvc_enc->pvc_tabs.smoothing_coef = ixheaace_pvc_tabs.pvc_smth_win_ns_4;
376
0
        break;
377
0
      }
378
10.2k
      case 2: {
379
10.2k
        pstr_pvc_enc->pvc_param.time_smth_ts = 3;
380
10.2k
        pstr_pvc_enc->pvc_tabs.smoothing_coef = ixheaace_pvc_tabs.pvc_smth_win_ns_3;
381
10.2k
        break;
382
0
      }
383
0
      default: {
384
        // No assignment
385
0
        break;
386
0
      }
387
10.2k
    }
388
10.2k
  }
389
25.3k
}
390
391
IA_ERRORCODE ixheaace_pvc_encode_frame(ixheaace_pvc_enc *pstr_pvc_enc, UWORD8 pvc_mode,
392
                                       FLOAT32 *ptr_qmf_low, FLOAT32 *ptr_qmf_high,
393
49.5k
                                       UWORD8 start_band, UWORD8 stop_band) {
394
49.5k
  IA_ERRORCODE ret;
395
49.5k
  FLOAT32 sb_grp_energy_hi_ref[IXHEAACE_ESBR_PVC_NUM_TS * 8];
396
397
49.5k
  pstr_pvc_enc->pvc_param.pvc_mode = pvc_mode;
398
  /* PVC encoding process */
399
49.5k
  if (pstr_pvc_enc->pvc_param.pvc_mode) {
400
25.3k
    ret = ixheaace_set_pvc_mode_param(&(pstr_pvc_enc->pvc_param), &(pstr_pvc_enc->pvc_tabs));
401
25.3k
    if (IA_NO_ERROR != ret) {
402
0
      return ret;
403
0
    }
404
405
25.3k
    ixheaace_pvc_sb_grouping(pstr_pvc_enc, start_band, ptr_qmf_low,
406
25.3k
                             (FLOAT32 *)pstr_pvc_enc->sb_grp_energy, 0);
407
408
25.3k
    ixheaace_pvc_sb_grouping_ref(&(pstr_pvc_enc->pvc_param), start_band, stop_band, ptr_qmf_high,
409
25.3k
                                 sb_grp_energy_hi_ref);
410
25.3k
    ixheaace_pvc_calc_ref_ene_update_tabs(pstr_pvc_enc, sb_grp_energy_hi_ref);
411
412
25.3k
    ixheaace_pvc_calc_grp_energy(pstr_pvc_enc, sb_grp_energy_hi_ref);
413
414
25.3k
    ixheaace_pvc_packing(pstr_pvc_enc, pstr_pvc_enc->pvc_param.usac_indep_flag);
415
25.3k
  }
416
417
49.5k
  pstr_pvc_enc->pvc_prv_param.pvc_id =
418
49.5k
      (pstr_pvc_enc->pvc_param.pvc_mode == 0)
419
49.5k
          ? 0xFF
420
49.5k
          : pstr_pvc_enc->pvc_param.pvc_id[IXHEAACE_ESBR_PVC_NUM_TS - 1];
421
49.5k
  pstr_pvc_enc->pvc_prv_param.start_band = start_band;
422
49.5k
  pstr_pvc_enc->pvc_prv_param.pvc_flag = (pstr_pvc_enc->pvc_param.pvc_mode == 0) ? 0 : 1;
423
49.5k
  pstr_pvc_enc->pvc_prv_param.pvc_rate = pstr_pvc_enc->pvc_param.pvc_rate;
424
425
49.5k
  return IA_NO_ERROR;
426
49.5k
}