1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker
21*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker #include <string.h>
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
33*15dc779aSAndroid Build Coastguard Worker
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_configuration.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_func.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
44*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_auto_to_parcor(const FLOAT32 * ptr_input,FLOAT32 * ptr_refl_coeff,WORD32 num_coeff,FLOAT32 * ptr_work_buffer,FLOAT32 * prediction_gain)45*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_auto_to_parcor(const FLOAT32 *ptr_input, FLOAT32 *ptr_refl_coeff,
46*15dc779aSAndroid Build Coastguard Worker WORD32 num_coeff, FLOAT32 *ptr_work_buffer,
47*15dc779aSAndroid Build Coastguard Worker FLOAT32 *prediction_gain) {
48*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
49*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_work_buf_tmp, tmp_var;
50*15dc779aSAndroid Build Coastguard Worker
51*15dc779aSAndroid Build Coastguard Worker memset(ptr_refl_coeff, 0, num_coeff * sizeof(*ptr_refl_coeff));
52*15dc779aSAndroid Build Coastguard Worker
53*15dc779aSAndroid Build Coastguard Worker if (ptr_input[0] == 0) {
54*15dc779aSAndroid Build Coastguard Worker return;
55*15dc779aSAndroid Build Coastguard Worker }
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[0] = ptr_input[0];
58*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < num_coeff; i++) {
59*15dc779aSAndroid Build Coastguard Worker tmp_var = ptr_input[i];
60*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[i] = tmp_var;
61*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[i + num_coeff - 1] = tmp_var;
62*15dc779aSAndroid Build Coastguard Worker }
63*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[i + num_coeff - 1] = ptr_input[i];
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_coeff; i++) {
66*15dc779aSAndroid Build Coastguard Worker FLOAT32 refc, tmp;
67*15dc779aSAndroid Build Coastguard Worker
68*15dc779aSAndroid Build Coastguard Worker tmp = ptr_work_buffer[num_coeff + i];
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker if (tmp < 0.f) {
71*15dc779aSAndroid Build Coastguard Worker tmp = -tmp;
72*15dc779aSAndroid Build Coastguard Worker }
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker if ((ptr_work_buffer[0]) < tmp) {
75*15dc779aSAndroid Build Coastguard Worker break;
76*15dc779aSAndroid Build Coastguard Worker }
77*15dc779aSAndroid Build Coastguard Worker
78*15dc779aSAndroid Build Coastguard Worker if (ptr_work_buffer[0] == 0.f) {
79*15dc779aSAndroid Build Coastguard Worker refc = 0;
80*15dc779aSAndroid Build Coastguard Worker } else {
81*15dc779aSAndroid Build Coastguard Worker refc = (tmp / ptr_work_buffer[0]);
82*15dc779aSAndroid Build Coastguard Worker }
83*15dc779aSAndroid Build Coastguard Worker
84*15dc779aSAndroid Build Coastguard Worker if (ptr_work_buffer[num_coeff + i] > 0.f) {
85*15dc779aSAndroid Build Coastguard Worker refc = -refc;
86*15dc779aSAndroid Build Coastguard Worker }
87*15dc779aSAndroid Build Coastguard Worker
88*15dc779aSAndroid Build Coastguard Worker ptr_refl_coeff[i] = refc;
89*15dc779aSAndroid Build Coastguard Worker
90*15dc779aSAndroid Build Coastguard Worker ptr_work_buf_tmp = &(ptr_work_buffer[num_coeff]);
91*15dc779aSAndroid Build Coastguard Worker
92*15dc779aSAndroid Build Coastguard Worker for (j = i; j < num_coeff; j++) {
93*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu1, accu2;
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker accu1 = (refc * ptr_work_buffer[j - i]);
96*15dc779aSAndroid Build Coastguard Worker accu1 = (accu1) + ptr_work_buf_tmp[j];
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker accu2 = (refc * ptr_work_buf_tmp[j]);
99*15dc779aSAndroid Build Coastguard Worker accu2 = accu2 + ptr_work_buffer[j - i];
100*15dc779aSAndroid Build Coastguard Worker
101*15dc779aSAndroid Build Coastguard Worker ptr_work_buf_tmp[j] = accu1;
102*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[j - i] = accu2;
103*15dc779aSAndroid Build Coastguard Worker }
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker
106*15dc779aSAndroid Build Coastguard Worker *prediction_gain = (ptr_input[0] / ptr_work_buffer[0]);
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_calc_tns_filter(const FLOAT32 * ptr_signal,const FLOAT32 * ptr_window,WORD32 num_lines,WORD32 tns_order,FLOAT32 * ptr_parcor,FLOAT32 * prediction_gain)109*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_calc_tns_filter(const FLOAT32 *ptr_signal,
110*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_window, WORD32 num_lines,
111*15dc779aSAndroid Build Coastguard Worker WORD32 tns_order, FLOAT32 *ptr_parcor,
112*15dc779aSAndroid Build Coastguard Worker FLOAT32 *prediction_gain) {
113*15dc779aSAndroid Build Coastguard Worker FLOAT32 auto_corr_buf[TEMPORAL_NOISE_SHAPING_MAX_ORDER + 1];
114*15dc779aSAndroid Build Coastguard Worker FLOAT32 par_cor_buf[2 * TEMPORAL_NOISE_SHAPING_MAX_ORDER];
115*15dc779aSAndroid Build Coastguard Worker WORD32 i;
116*15dc779aSAndroid Build Coastguard Worker
117*15dc779aSAndroid Build Coastguard Worker if (tns_order > TEMPORAL_NOISE_SHAPING_MAX_ORDER) {
118*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_INVALID_TNS_FILT_ORDER;
119*15dc779aSAndroid Build Coastguard Worker }
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker memset(&auto_corr_buf[0], 0, (tns_order + 1) * sizeof(auto_corr_buf[0]));
122*15dc779aSAndroid Build Coastguard Worker
123*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_auto_correlation(ptr_signal, auto_corr_buf, num_lines, tns_order + 1);
124*15dc779aSAndroid Build Coastguard Worker
125*15dc779aSAndroid Build Coastguard Worker if (ptr_window) {
126*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < tns_order + 1; i++) {
127*15dc779aSAndroid Build Coastguard Worker auto_corr_buf[i] = (auto_corr_buf[i] * ptr_window[i]);
128*15dc779aSAndroid Build Coastguard Worker }
129*15dc779aSAndroid Build Coastguard Worker }
130*15dc779aSAndroid Build Coastguard Worker
131*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_auto_to_parcor(auto_corr_buf, ptr_parcor, tns_order, par_cor_buf,
132*15dc779aSAndroid Build Coastguard Worker prediction_gain);
133*15dc779aSAndroid Build Coastguard Worker
134*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
135*15dc779aSAndroid Build Coastguard Worker }
136*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_tns_detect(ixheaace_temporal_noise_shaping_data * pstr_tns_data,ixheaace_temporal_noise_shaping_config tns_config,FLOAT32 * ptr_scratch_tns,const WORD32 * ptr_sfb_offset,FLOAT32 * ptr_spectrum,WORD32 sub_blk_num,WORD32 block_type,WORD32 aot,FLOAT32 * ptr_sfb_energy,FLOAT32 * ptr_shared_buffer1,WORD32 long_frame_len)137*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_tns_detect(ixheaace_temporal_noise_shaping_data *pstr_tns_data,
138*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_config tns_config,
139*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_scratch_tns, const WORD32 *ptr_sfb_offset,
140*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_spectrum, WORD32 sub_blk_num,
141*15dc779aSAndroid Build Coastguard Worker WORD32 block_type, WORD32 aot, FLOAT32 *ptr_sfb_energy,
142*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_shared_buffer1, WORD32 long_frame_len)
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker {
145*15dc779aSAndroid Build Coastguard Worker FLOAT32 prediction_gain = 0;
146*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_weighted_spec = ptr_scratch_tns + sub_blk_num * long_frame_len;
147*15dc779aSAndroid Build Coastguard Worker WORD i;
148*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_weighted_spec_new = ptr_weighted_spec;
149*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error_code = IA_NO_ERROR;
150*15dc779aSAndroid Build Coastguard Worker
151*15dc779aSAndroid Build Coastguard Worker if (tns_config.tns_active) {
152*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_calc_weighted_spectrum(ptr_spectrum, ptr_weighted_spec, ptr_sfb_energy,
153*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset, tns_config.lpc_start_line,
154*15dc779aSAndroid Build Coastguard Worker tns_config.lpc_stop_line, tns_config.lpc_start_band,
155*15dc779aSAndroid Build Coastguard Worker tns_config.lpc_stop_band, ptr_shared_buffer1, aot);
156*15dc779aSAndroid Build Coastguard Worker
157*15dc779aSAndroid Build Coastguard Worker for (i = tns_config.lpc_stop_line; i < (tns_config.lpc_stop_line + 12); i++) {
158*15dc779aSAndroid Build Coastguard Worker ptr_weighted_spec_new[i] = 0;
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker
161*15dc779aSAndroid Build Coastguard Worker if (block_type != SHORT_WINDOW) {
162*15dc779aSAndroid Build Coastguard Worker error_code = ia_enhaacplus_enc_calc_tns_filter(
163*15dc779aSAndroid Build Coastguard Worker &ptr_weighted_spec_new[tns_config.lpc_start_line], tns_config.acf_window_float,
164*15dc779aSAndroid Build Coastguard Worker tns_config.lpc_stop_line - tns_config.lpc_start_line, tns_config.max_order,
165*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_long.sub_block_info.parcor, &prediction_gain);
166*15dc779aSAndroid Build Coastguard Worker
167*15dc779aSAndroid Build Coastguard Worker if (error_code != IA_NO_ERROR) {
168*15dc779aSAndroid Build Coastguard Worker return error_code;
169*15dc779aSAndroid Build Coastguard Worker }
170*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_long.sub_block_info.tns_active =
171*15dc779aSAndroid Build Coastguard Worker ((prediction_gain) > tns_config.threshold) ? 1 : 0;
172*15dc779aSAndroid Build Coastguard Worker
173*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_long.sub_block_info.prediction_gain = prediction_gain;
174*15dc779aSAndroid Build Coastguard Worker } else {
175*15dc779aSAndroid Build Coastguard Worker error_code = ia_enhaacplus_enc_calc_tns_filter(
176*15dc779aSAndroid Build Coastguard Worker &ptr_weighted_spec_new[tns_config.lpc_start_line], tns_config.acf_window_float,
177*15dc779aSAndroid Build Coastguard Worker tns_config.lpc_stop_line - tns_config.lpc_start_line, tns_config.max_order,
178*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].parcor,
179*15dc779aSAndroid Build Coastguard Worker &prediction_gain);
180*15dc779aSAndroid Build Coastguard Worker
181*15dc779aSAndroid Build Coastguard Worker if (error_code != IA_NO_ERROR) {
182*15dc779aSAndroid Build Coastguard Worker return error_code;
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].tns_active =
186*15dc779aSAndroid Build Coastguard Worker ((prediction_gain) > tns_config.threshold) ? 1 : 0;
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].prediction_gain =
189*15dc779aSAndroid Build Coastguard Worker prediction_gain;
190*15dc779aSAndroid Build Coastguard Worker }
191*15dc779aSAndroid Build Coastguard Worker } else {
192*15dc779aSAndroid Build Coastguard Worker if (block_type != SHORT_WINDOW) {
193*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_long.sub_block_info.tns_active = 0;
194*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_long.sub_block_info.prediction_gain = 0.f;
195*15dc779aSAndroid Build Coastguard Worker } else {
196*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].tns_active = 0;
197*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].prediction_gain = 0.f;
198*15dc779aSAndroid Build Coastguard Worker }
199*15dc779aSAndroid Build Coastguard Worker }
200*15dc779aSAndroid Build Coastguard Worker return error_code;
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_tns_sync(ixheaace_temporal_noise_shaping_data * pstr_tns_data_dst,const ixheaace_temporal_noise_shaping_data * pstr_tns_data_src,const ixheaace_temporal_noise_shaping_config tns_config,const WORD32 sub_blk_num,const WORD32 block_type)203*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_tns_sync(ixheaace_temporal_noise_shaping_data *pstr_tns_data_dst,
204*15dc779aSAndroid Build Coastguard Worker const ixheaace_temporal_noise_shaping_data *pstr_tns_data_src,
205*15dc779aSAndroid Build Coastguard Worker const ixheaace_temporal_noise_shaping_config tns_config,
206*15dc779aSAndroid Build Coastguard Worker const WORD32 sub_blk_num, const WORD32 block_type) {
207*15dc779aSAndroid Build Coastguard Worker if (block_type != SHORT_WINDOW) {
208*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_subblock_info_long *pstr_sfb_info_dst;
209*15dc779aSAndroid Build Coastguard Worker const ixheaace_temporal_noise_shaping_subblock_info_long *pstr_sfb_info_src;
210*15dc779aSAndroid Build Coastguard Worker
211*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info_dst = &pstr_tns_data_dst->data_raw.tns_data_long.sub_block_info;
212*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info_src = &pstr_tns_data_src->data_raw.tns_data_long.sub_block_info;
213*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp_var = pstr_sfb_info_dst->prediction_gain;
214*15dc779aSAndroid Build Coastguard Worker if (fabs(tmp_var - pstr_sfb_info_src->prediction_gain) < (tmp_var * 0.03f)) {
215*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info_dst->tns_active = pstr_sfb_info_src->tns_active;
216*15dc779aSAndroid Build Coastguard Worker
217*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_sfb_info_dst->parcor, pstr_sfb_info_src->parcor,
218*15dc779aSAndroid Build Coastguard Worker tns_config.max_order * sizeof(pstr_sfb_info_dst->parcor[0]));
219*15dc779aSAndroid Build Coastguard Worker }
220*15dc779aSAndroid Build Coastguard Worker } else {
221*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_subblock_info_short *pstr_sfb_info_dst;
222*15dc779aSAndroid Build Coastguard Worker const ixheaace_temporal_noise_shaping_subblock_info_short *pstr_sfb_info_src;
223*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info_dst = &pstr_tns_data_dst->data_raw.tns_data_short.sub_block_info[sub_blk_num];
224*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info_src = &pstr_tns_data_src->data_raw.tns_data_short.sub_block_info[sub_blk_num];
225*15dc779aSAndroid Build Coastguard Worker
226*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp_var = pstr_sfb_info_dst->prediction_gain;
227*15dc779aSAndroid Build Coastguard Worker if (fabs(tmp_var - pstr_sfb_info_src->prediction_gain) < (tmp_var * 0.03f)) {
228*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info_dst->tns_active = pstr_sfb_info_src->tns_active;
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_sfb_info_dst->parcor, pstr_sfb_info_src->parcor,
231*15dc779aSAndroid Build Coastguard Worker tns_config.max_order * sizeof(pstr_sfb_info_dst->parcor[0]));
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker }
234*15dc779aSAndroid Build Coastguard Worker }
235*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_index_search3(FLOAT32 parcor,ixheaace_temporal_noise_shaping_tables * pstr_tns_tab)236*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_index_search3(
237*15dc779aSAndroid Build Coastguard Worker FLOAT32 parcor, ixheaace_temporal_noise_shaping_tables *pstr_tns_tab) {
238*15dc779aSAndroid Build Coastguard Worker WORD32 index = 0;
239*15dc779aSAndroid Build Coastguard Worker WORD32 i;
240*15dc779aSAndroid Build Coastguard Worker
241*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 8; i++) {
242*15dc779aSAndroid Build Coastguard Worker if (parcor > pstr_tns_tab->tns_coeff_3_borders[i]) {
243*15dc779aSAndroid Build Coastguard Worker index = i;
244*15dc779aSAndroid Build Coastguard Worker }
245*15dc779aSAndroid Build Coastguard Worker }
246*15dc779aSAndroid Build Coastguard Worker
247*15dc779aSAndroid Build Coastguard Worker return (index - 4);
248*15dc779aSAndroid Build Coastguard Worker }
ia_enhaacplus_enc_index_search4(FLOAT32 parcor,ixheaace_temporal_noise_shaping_tables * pstr_tns_tab)249*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_index_search4(
250*15dc779aSAndroid Build Coastguard Worker FLOAT32 parcor, ixheaace_temporal_noise_shaping_tables *pstr_tns_tab) {
251*15dc779aSAndroid Build Coastguard Worker WORD32 index = 0;
252*15dc779aSAndroid Build Coastguard Worker WORD32 i;
253*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 16; i++) {
254*15dc779aSAndroid Build Coastguard Worker if (parcor > pstr_tns_tab->tns_coeff_4_borders[i]) {
255*15dc779aSAndroid Build Coastguard Worker index = i;
256*15dc779aSAndroid Build Coastguard Worker }
257*15dc779aSAndroid Build Coastguard Worker }
258*15dc779aSAndroid Build Coastguard Worker
259*15dc779aSAndroid Build Coastguard Worker return (index - 8);
260*15dc779aSAndroid Build Coastguard Worker }
261*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_parcor_to_index(const FLOAT32 * ptr_parcor,WORD32 * ptr_index,WORD32 order,WORD32 bits_per_coeff,ixheaace_temporal_noise_shaping_tables * pstr_tns_tab)262*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_parcor_to_index(
263*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_parcor, WORD32 *ptr_index, WORD32 order, WORD32 bits_per_coeff,
264*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_tables *pstr_tns_tab) {
265*15dc779aSAndroid Build Coastguard Worker WORD32 i;
266*15dc779aSAndroid Build Coastguard Worker
267*15dc779aSAndroid Build Coastguard Worker if (bits_per_coeff == 3) {
268*15dc779aSAndroid Build Coastguard Worker for (i = order - 1; i >= 0; i--) {
269*15dc779aSAndroid Build Coastguard Worker ptr_index[i] = ia_enhaacplus_enc_index_search3(ptr_parcor[i], pstr_tns_tab);
270*15dc779aSAndroid Build Coastguard Worker }
271*15dc779aSAndroid Build Coastguard Worker } else {
272*15dc779aSAndroid Build Coastguard Worker for (i = order - 1; i >= 0; i--) {
273*15dc779aSAndroid Build Coastguard Worker ptr_index[i] = ia_enhaacplus_enc_index_search4(ptr_parcor[i], pstr_tns_tab);
274*15dc779aSAndroid Build Coastguard Worker }
275*15dc779aSAndroid Build Coastguard Worker }
276*15dc779aSAndroid Build Coastguard Worker }
277*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_index_to_parcor(const WORD32 * ptr_index,FLOAT32 * ptr_parcor,WORD32 order,WORD32 bits_per_coeff,ixheaace_temporal_noise_shaping_tables * pstr_tns_tab)278*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_index_to_parcor(
279*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_index, FLOAT32 *ptr_parcor, WORD32 order, WORD32 bits_per_coeff,
280*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_tables *pstr_tns_tab) {
281*15dc779aSAndroid Build Coastguard Worker WORD32 i;
282*15dc779aSAndroid Build Coastguard Worker
283*15dc779aSAndroid Build Coastguard Worker if (bits_per_coeff == 4) {
284*15dc779aSAndroid Build Coastguard Worker for (i = order - 1; i >= 0; i--) {
285*15dc779aSAndroid Build Coastguard Worker ptr_parcor[i] = pstr_tns_tab->tns_coeff_4[ptr_index[i] + 8];
286*15dc779aSAndroid Build Coastguard Worker }
287*15dc779aSAndroid Build Coastguard Worker } else {
288*15dc779aSAndroid Build Coastguard Worker for (i = order - 1; i >= 0; i--) {
289*15dc779aSAndroid Build Coastguard Worker ptr_parcor[i] = pstr_tns_tab->tns_coeff_3[ptr_index[i] + 4];
290*15dc779aSAndroid Build Coastguard Worker }
291*15dc779aSAndroid Build Coastguard Worker }
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_tns_encode(ixheaace_temporal_noise_shaping_params * pstr_tns_info,ixheaace_temporal_noise_shaping_data * pstr_tns_data,WORD32 num_sfb,ixheaace_temporal_noise_shaping_config tns_config,WORD32 lowpass_line,FLOAT32 * ptr_spectrum,WORD32 sub_blk_num,WORD32 block_type,ixheaace_temporal_noise_shaping_tables * pstr_tns_tab)294*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_tns_encode(ixheaace_temporal_noise_shaping_params *pstr_tns_info,
295*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_data *pstr_tns_data,
296*15dc779aSAndroid Build Coastguard Worker WORD32 num_sfb,
297*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_config tns_config,
298*15dc779aSAndroid Build Coastguard Worker WORD32 lowpass_line, FLOAT32 *ptr_spectrum,
299*15dc779aSAndroid Build Coastguard Worker WORD32 sub_blk_num, WORD32 block_type,
300*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_tables *pstr_tns_tab) {
301*15dc779aSAndroid Build Coastguard Worker WORD32 i;
302*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_parcor;
303*15dc779aSAndroid Build Coastguard Worker
304*15dc779aSAndroid Build Coastguard Worker if (block_type != SHORT_WINDOW) {
305*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_data->data_raw.tns_data_long.sub_block_info.tns_active == 0) {
306*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->tns_active[sub_blk_num] = 0;
307*15dc779aSAndroid Build Coastguard Worker return;
308*15dc779aSAndroid Build Coastguard Worker } else {
309*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_parcor_to_index(
310*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_long.sub_block_info.parcor, &pstr_tns_info->coef[0],
311*15dc779aSAndroid Build Coastguard Worker tns_config.max_order, tns_config.coef_res, pstr_tns_tab);
312*15dc779aSAndroid Build Coastguard Worker
313*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_index_to_parcor(
314*15dc779aSAndroid Build Coastguard Worker &pstr_tns_info->coef[0], pstr_tns_data->data_raw.tns_data_long.sub_block_info.parcor,
315*15dc779aSAndroid Build Coastguard Worker tns_config.max_order, tns_config.coef_res, pstr_tns_tab);
316*15dc779aSAndroid Build Coastguard Worker
317*15dc779aSAndroid Build Coastguard Worker ptr_parcor =
318*15dc779aSAndroid Build Coastguard Worker &pstr_tns_data->data_raw.tns_data_long.sub_block_info.parcor[tns_config.max_order - 1];
319*15dc779aSAndroid Build Coastguard Worker
320*15dc779aSAndroid Build Coastguard Worker for (i = tns_config.max_order - 1; i >= 0; i--) {
321*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp_var = *ptr_parcor--;
322*15dc779aSAndroid Build Coastguard Worker
323*15dc779aSAndroid Build Coastguard Worker if (tmp_var > 0.1f || tmp_var < -0.1f) {
324*15dc779aSAndroid Build Coastguard Worker break;
325*15dc779aSAndroid Build Coastguard Worker }
326*15dc779aSAndroid Build Coastguard Worker }
327*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->order[sub_blk_num] = i + 1;
328*15dc779aSAndroid Build Coastguard Worker
329*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->tns_active[sub_blk_num] = 1;
330*15dc779aSAndroid Build Coastguard Worker
331*15dc779aSAndroid Build Coastguard Worker for (i = sub_blk_num + 1; i < TRANS_FAC; i++) {
332*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->tns_active[i] = 0;
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker
335*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->coef_res[sub_blk_num] = (WORD8)tns_config.coef_res;
336*15dc779aSAndroid Build Coastguard Worker
337*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->length[sub_blk_num] = num_sfb - tns_config.tns_start_band;
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_analysis_filter_lattice(
340*15dc779aSAndroid Build Coastguard Worker &(ptr_spectrum[tns_config.tns_start_line]),
341*15dc779aSAndroid Build Coastguard Worker MIN(tns_config.tns_stop_line, lowpass_line) - tns_config.tns_start_line,
342*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_long.sub_block_info.parcor,
343*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->order[sub_blk_num], &(ptr_spectrum[tns_config.tns_start_line]));
344*15dc779aSAndroid Build Coastguard Worker }
345*15dc779aSAndroid Build Coastguard Worker } else /*short block*/
346*15dc779aSAndroid Build Coastguard Worker {
347*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].tns_active == 0) {
348*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->tns_active[sub_blk_num] = 0;
349*15dc779aSAndroid Build Coastguard Worker
350*15dc779aSAndroid Build Coastguard Worker return;
351*15dc779aSAndroid Build Coastguard Worker } else {
352*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_parcor_to_index(
353*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].parcor,
354*15dc779aSAndroid Build Coastguard Worker &pstr_tns_info->coef[sub_blk_num * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT],
355*15dc779aSAndroid Build Coastguard Worker tns_config.max_order, tns_config.coef_res, pstr_tns_tab);
356*15dc779aSAndroid Build Coastguard Worker
357*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_index_to_parcor(
358*15dc779aSAndroid Build Coastguard Worker &pstr_tns_info->coef[sub_blk_num * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT],
359*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].parcor,
360*15dc779aSAndroid Build Coastguard Worker tns_config.max_order, tns_config.coef_res, pstr_tns_tab);
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker ptr_parcor = &pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num]
363*15dc779aSAndroid Build Coastguard Worker .parcor[tns_config.max_order - 1];
364*15dc779aSAndroid Build Coastguard Worker for (i = tns_config.max_order - 1; i >= 0; i--) {
365*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp_var = *ptr_parcor--;
366*15dc779aSAndroid Build Coastguard Worker if (tmp_var > 0.1f || tmp_var < -0.1f) {
367*15dc779aSAndroid Build Coastguard Worker break;
368*15dc779aSAndroid Build Coastguard Worker }
369*15dc779aSAndroid Build Coastguard Worker }
370*15dc779aSAndroid Build Coastguard Worker
371*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->order[sub_blk_num] = i + 1;
372*15dc779aSAndroid Build Coastguard Worker
373*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->tns_active[sub_blk_num] = 1;
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->coef_res[sub_blk_num] = (WORD8)tns_config.coef_res;
376*15dc779aSAndroid Build Coastguard Worker
377*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->length[sub_blk_num] = num_sfb - tns_config.tns_start_band;
378*15dc779aSAndroid Build Coastguard Worker
379*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_analysis_filter_lattice(
380*15dc779aSAndroid Build Coastguard Worker &(ptr_spectrum[tns_config.tns_start_line]),
381*15dc779aSAndroid Build Coastguard Worker tns_config.tns_stop_line - tns_config.tns_start_line,
382*15dc779aSAndroid Build Coastguard Worker pstr_tns_data->data_raw.tns_data_short.sub_block_info[sub_blk_num].parcor,
383*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->order[sub_blk_num], &(ptr_spectrum[tns_config.tns_start_line]));
384*15dc779aSAndroid Build Coastguard Worker }
385*15dc779aSAndroid Build Coastguard Worker }
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker return;
388*15dc779aSAndroid Build Coastguard Worker }
389*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_apply_tns_mult_table_to_ratios(WORD32 start_cb,WORD32 stop_cb,FLOAT32 * ptr_thresholds)390*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_apply_tns_mult_table_to_ratios(WORD32 start_cb, WORD32 stop_cb,
391*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_thresholds) {
392*15dc779aSAndroid Build Coastguard Worker WORD32 i;
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker for (i = start_cb; i < stop_cb; i++) {
395*15dc779aSAndroid Build Coastguard Worker ptr_thresholds[i] = (FLOAT32)(ptr_thresholds[i] * 0.25f);
396*15dc779aSAndroid Build Coastguard Worker }
397*15dc779aSAndroid Build Coastguard Worker }
398