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