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