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 <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include <string.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
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
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_tran_det.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_main.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_frame_info_gen.h"
41*15dc779aSAndroid Build Coastguard Worker
ixheaace_spectral_change(FLOAT32 * ptr_energies[16],FLOAT32 total_energy,WORD32 num_sfb,WORD32 start,WORD32 border,WORD32 stop,WORD32 is_ld_sbr,FLOAT32 * ptr_delta)42*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_spectral_change(FLOAT32 *ptr_energies[16], FLOAT32 total_energy,
43*15dc779aSAndroid Build Coastguard Worker WORD32 num_sfb, WORD32 start, WORD32 border,
44*15dc779aSAndroid Build Coastguard Worker WORD32 stop, WORD32 is_ld_sbr, FLOAT32 *ptr_delta) {
45*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
46*15dc779aSAndroid Build Coastguard Worker WORD32 len1 = border - start;
47*15dc779aSAndroid Build Coastguard Worker WORD32 len2 = stop - border;
48*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy_1[MAXIMUM_FREQ_COEFFS] = {0};
49*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy_2[MAXIMUM_FREQ_COEFFS] = {0};
50*15dc779aSAndroid Build Coastguard Worker FLOAT32 len_ratio = (FLOAT32)len1 / (FLOAT32)(len2);
51*15dc779aSAndroid Build Coastguard Worker FLOAT32 delta, delta_sum = 0.0f;
52*15dc779aSAndroid Build Coastguard Worker FLOAT32 pos_wt = (0.5f - (FLOAT32)len1 / (FLOAT32)(len1 + len2));
53*15dc779aSAndroid Build Coastguard Worker pos_wt = 1.0f - 4.0f * pos_wt * pos_wt;
54*15dc779aSAndroid Build Coastguard Worker
55*15dc779aSAndroid Build Coastguard Worker if (total_energy < SBR_EPS) {
56*15dc779aSAndroid Build Coastguard Worker *ptr_delta = 0.0f;
57*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
58*15dc779aSAndroid Build Coastguard Worker }
59*15dc779aSAndroid Build Coastguard Worker
60*15dc779aSAndroid Build Coastguard Worker if (!is_ld_sbr) {
61*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sfb; j++) {
62*15dc779aSAndroid Build Coastguard Worker energy_1[j] = 1.0e6f * len1;
63*15dc779aSAndroid Build Coastguard Worker energy_2[j] = 1.0e6f * len2;
64*15dc779aSAndroid Build Coastguard Worker }
65*15dc779aSAndroid Build Coastguard Worker }
66*15dc779aSAndroid Build Coastguard Worker
67*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sfb; j++) {
68*15dc779aSAndroid Build Coastguard Worker for (i = start; i < border; i++) {
69*15dc779aSAndroid Build Coastguard Worker energy_1[j] += ptr_energies[i][j];
70*15dc779aSAndroid Build Coastguard Worker }
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker for (i = border; i < stop; i++) {
73*15dc779aSAndroid Build Coastguard Worker energy_2[j] += ptr_energies[i][j];
74*15dc779aSAndroid Build Coastguard Worker }
75*15dc779aSAndroid Build Coastguard Worker if (energy_1[j] <= EPS) {
76*15dc779aSAndroid Build Coastguard Worker energy_1[j] = (FLOAT32)len1;
77*15dc779aSAndroid Build Coastguard Worker }
78*15dc779aSAndroid Build Coastguard Worker if (energy_2[j] <= EPS) {
79*15dc779aSAndroid Build Coastguard Worker energy_2[j] = (FLOAT32)len2;
80*15dc779aSAndroid Build Coastguard Worker }
81*15dc779aSAndroid Build Coastguard Worker delta = (FLOAT32)fabs(log((energy_2[j] / energy_1[j]) * len_ratio));
82*15dc779aSAndroid Build Coastguard Worker delta_sum += (FLOAT32)(sqrt((energy_1[j] + energy_2[j]) / total_energy) * delta);
83*15dc779aSAndroid Build Coastguard Worker }
84*15dc779aSAndroid Build Coastguard Worker
85*15dc779aSAndroid Build Coastguard Worker *ptr_delta = delta_sum * pos_wt;
86*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
87*15dc779aSAndroid Build Coastguard Worker }
88*15dc779aSAndroid Build Coastguard Worker
ixheaace_add_lowband_energies(FLOAT32 ** ptr_energies,UWORD8 * ptr_freq_band_tab,WORD32 time_slots,WORD32 is_ld_sbr)89*15dc779aSAndroid Build Coastguard Worker FLOAT32 ixheaace_add_lowband_energies(FLOAT32 **ptr_energies, UWORD8 *ptr_freq_band_tab,
90*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots, WORD32 is_ld_sbr) {
91*15dc779aSAndroid Build Coastguard Worker WORD32 band, ts;
92*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy = 1.0f;
93*15dc779aSAndroid Build Coastguard Worker WORD32 tran_offset = 0;
94*15dc779aSAndroid Build Coastguard Worker if (is_ld_sbr) {
95*15dc779aSAndroid Build Coastguard Worker tran_offset = 7;
96*15dc779aSAndroid Build Coastguard Worker energy = 0.0f;
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker for (ts = tran_offset; ts < time_slots + tran_offset; ts++) {
99*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_freq_band_tab[0]; band++) {
100*15dc779aSAndroid Build Coastguard Worker energy += ptr_energies[ts][band];
101*15dc779aSAndroid Build Coastguard Worker }
102*15dc779aSAndroid Build Coastguard Worker }
103*15dc779aSAndroid Build Coastguard Worker } else {
104*15dc779aSAndroid Build Coastguard Worker for (ts = tran_offset; ts < time_slots + tran_offset; ts++) {
105*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_freq_band_tab[0]; band++) {
106*15dc779aSAndroid Build Coastguard Worker energy += ptr_energies[(ts + time_slots / 2) / 2][band];
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker }
109*15dc779aSAndroid Build Coastguard Worker }
110*15dc779aSAndroid Build Coastguard Worker return energy;
111*15dc779aSAndroid Build Coastguard Worker }
112*15dc779aSAndroid Build Coastguard Worker
ixheaace_add_highband_energies(FLOAT32 ** ptr_energies,FLOAT32 * ptr_energies_m[16],UWORD8 * ptr_freq_band_tab,WORD32 num_sfb,WORD32 time_slots,WORD32 time_step,WORD32 is_ld_sbr)113*15dc779aSAndroid Build Coastguard Worker static FLOAT32 ixheaace_add_highband_energies(FLOAT32 **ptr_energies, FLOAT32 *ptr_energies_m[16],
114*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_freq_band_tab, WORD32 num_sfb,
115*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots, WORD32 time_step,
116*15dc779aSAndroid Build Coastguard Worker WORD32 is_ld_sbr) {
117*15dc779aSAndroid Build Coastguard Worker WORD32 band, ts, sfb, low_band, high_band, st;
118*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy = 1.0f, tmp;
119*15dc779aSAndroid Build Coastguard Worker if (is_ld_sbr) {
120*15dc779aSAndroid Build Coastguard Worker energy = 0.0f;
121*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
122*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < num_sfb; sfb++) {
123*15dc779aSAndroid Build Coastguard Worker tmp = 0;
124*15dc779aSAndroid Build Coastguard Worker low_band = ptr_freq_band_tab[sfb];
125*15dc779aSAndroid Build Coastguard Worker high_band = ptr_freq_band_tab[sfb + 1];
126*15dc779aSAndroid Build Coastguard Worker band = low_band;
127*15dc779aSAndroid Build Coastguard Worker while (band < high_band) {
128*15dc779aSAndroid Build Coastguard Worker tmp += ptr_energies[ts][band];
129*15dc779aSAndroid Build Coastguard Worker band++;
130*15dc779aSAndroid Build Coastguard Worker }
131*15dc779aSAndroid Build Coastguard Worker ptr_energies_m[ts][sfb] = tmp;
132*15dc779aSAndroid Build Coastguard Worker energy += tmp;
133*15dc779aSAndroid Build Coastguard Worker }
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker } else {
136*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
137*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < num_sfb; sfb++) {
138*15dc779aSAndroid Build Coastguard Worker tmp = 0;
139*15dc779aSAndroid Build Coastguard Worker low_band = ptr_freq_band_tab[sfb];
140*15dc779aSAndroid Build Coastguard Worker high_band = ptr_freq_band_tab[sfb + 1];
141*15dc779aSAndroid Build Coastguard Worker band = low_band;
142*15dc779aSAndroid Build Coastguard Worker while (band < high_band) {
143*15dc779aSAndroid Build Coastguard Worker st = 0;
144*15dc779aSAndroid Build Coastguard Worker while (st < time_step) {
145*15dc779aSAndroid Build Coastguard Worker tmp += ptr_energies[ts + (st / 2)][band];
146*15dc779aSAndroid Build Coastguard Worker st++;
147*15dc779aSAndroid Build Coastguard Worker }
148*15dc779aSAndroid Build Coastguard Worker band++;
149*15dc779aSAndroid Build Coastguard Worker }
150*15dc779aSAndroid Build Coastguard Worker ptr_energies_m[ts][sfb] = tmp;
151*15dc779aSAndroid Build Coastguard Worker
152*15dc779aSAndroid Build Coastguard Worker energy += ptr_energies[ts][sfb];
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker }
156*15dc779aSAndroid Build Coastguard Worker return energy;
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker
159*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_frame_splitter(FLOAT32 ** ptr_energies,ixheaace_pstr_sbr_trans_detector pstr_sbr_trans_detector,UWORD8 * ptr_freq_band_tab,WORD32 num_scf,WORD32 time_step,WORD32 no_cols,WORD32 * ptr_tran_vector,FLOAT32 * ptr_frame_splitter_scratch,WORD32 is_ld_sbr)160*15dc779aSAndroid Build Coastguard Worker ixheaace_frame_splitter(FLOAT32 **ptr_energies,
161*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_trans_detector pstr_sbr_trans_detector,
162*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_freq_band_tab, WORD32 num_scf, WORD32 time_step,
163*15dc779aSAndroid Build Coastguard Worker WORD32 no_cols, WORD32 *ptr_tran_vector,
164*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_frame_splitter_scratch, WORD32 is_ld_sbr) {
165*15dc779aSAndroid Build Coastguard Worker WORD32 border, i;
166*15dc779aSAndroid Build Coastguard Worker WORD32 num_sbr_slots = no_cols / time_step;
167*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_energies_m[16] = {0};
168*15dc779aSAndroid Build Coastguard Worker FLOAT32 low_band_energy, high_band_energy, total_energy;
169*15dc779aSAndroid Build Coastguard Worker FLOAT32 delta = 0.0f;
170*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker if ((num_sbr_slots <= 0) || (num_sbr_slots * time_step != no_cols)) {
173*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_TIME_SLOTS;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker memset(ptr_frame_splitter_scratch, 0,
177*15dc779aSAndroid Build Coastguard Worker sizeof(ptr_energies_m[0][0]) * MAXIMUM_FREQ_COEFFS * num_sbr_slots);
178*15dc779aSAndroid Build Coastguard Worker
179*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_sbr_slots; i++) {
180*15dc779aSAndroid Build Coastguard Worker ptr_energies_m[i] = ptr_frame_splitter_scratch;
181*15dc779aSAndroid Build Coastguard Worker ptr_frame_splitter_scratch += MAXIMUM_FREQ_COEFFS;
182*15dc779aSAndroid Build Coastguard Worker }
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker low_band_energy =
185*15dc779aSAndroid Build Coastguard Worker ixheaace_add_lowband_energies(ptr_energies, ptr_freq_band_tab, no_cols, is_ld_sbr);
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker high_band_energy =
188*15dc779aSAndroid Build Coastguard Worker ixheaace_add_highband_energies(ptr_energies, ptr_energies_m, ptr_freq_band_tab, num_scf,
189*15dc779aSAndroid Build Coastguard Worker num_sbr_slots, time_step, is_ld_sbr);
190*15dc779aSAndroid Build Coastguard Worker border = (num_sbr_slots + 1) >> 1;
191*15dc779aSAndroid Build Coastguard Worker
192*15dc779aSAndroid Build Coastguard Worker total_energy = 0.5f * (low_band_energy + pstr_sbr_trans_detector->prev_low_band_energy);
193*15dc779aSAndroid Build Coastguard Worker total_energy += high_band_energy;
194*15dc779aSAndroid Build Coastguard Worker if ((total_energy > IXHEAACE_SBR_ENERGY_THRESHOLD) || (!is_ld_sbr)) {
195*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_spectral_change(ptr_energies_m, total_energy, num_scf, 0, border,
196*15dc779aSAndroid Build Coastguard Worker num_sbr_slots, is_ld_sbr, &delta);
197*15dc779aSAndroid Build Coastguard Worker if (err_code) {
198*15dc779aSAndroid Build Coastguard Worker return err_code;
199*15dc779aSAndroid Build Coastguard Worker }
200*15dc779aSAndroid Build Coastguard Worker } else if (is_ld_sbr) {
201*15dc779aSAndroid Build Coastguard Worker delta = 0;
202*15dc779aSAndroid Build Coastguard Worker }
203*15dc779aSAndroid Build Coastguard Worker
204*15dc779aSAndroid Build Coastguard Worker if (delta > pstr_sbr_trans_detector->split_thr) {
205*15dc779aSAndroid Build Coastguard Worker ptr_tran_vector[0] = 1;
206*15dc779aSAndroid Build Coastguard Worker } else {
207*15dc779aSAndroid Build Coastguard Worker ptr_tran_vector[0] = 0;
208*15dc779aSAndroid Build Coastguard Worker }
209*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->prev_low_band_energy = low_band_energy;
210*15dc779aSAndroid Build Coastguard Worker return err_code;
211*15dc779aSAndroid Build Coastguard Worker }
212*15dc779aSAndroid Build Coastguard Worker
ixheaace_create_sbr_transient_detector(ixheaace_pstr_sbr_trans_detector pstr_sbr_trans_detector,WORD32 sample_freq,WORD32 total_bitrate,WORD32 codec_bitrate,WORD32 tran_thr,WORD32 mode,WORD32 tran_fc,WORD32 frame_flag_480,WORD32 is_ld_sbr,WORD32 sbr_ratio_idx,ixheaace_sbr_codec_type sbr_codec,WORD32 start_band)213*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_create_sbr_transient_detector(
214*15dc779aSAndroid Build Coastguard Worker ixheaace_pstr_sbr_trans_detector pstr_sbr_trans_detector, WORD32 sample_freq,
215*15dc779aSAndroid Build Coastguard Worker WORD32 total_bitrate, WORD32 codec_bitrate, WORD32 tran_thr, WORD32 mode, WORD32 tran_fc,
216*15dc779aSAndroid Build Coastguard Worker WORD32 frame_flag_480, WORD32 is_ld_sbr, WORD32 sbr_ratio_idx,
217*15dc779aSAndroid Build Coastguard Worker ixheaace_sbr_codec_type sbr_codec, WORD32 start_band) {
218*15dc779aSAndroid Build Coastguard Worker WORD32 no_cols = 32, buffer_length = 96;
219*15dc779aSAndroid Build Coastguard Worker FLOAT32 br_fac;
220*15dc779aSAndroid Build Coastguard Worker FLOAT32 frm_dur = 2048.0f / (FLOAT32)sample_freq;
221*15dc779aSAndroid Build Coastguard Worker FLOAT32 split_thr_fac = frm_dur - 0.01f;
222*15dc779aSAndroid Build Coastguard Worker if ((sbr_codec == USAC_SBR) && (sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1)) {
223*15dc779aSAndroid Build Coastguard Worker frm_dur = frm_dur * 2;
224*15dc779aSAndroid Build Coastguard Worker split_thr_fac = frm_dur - 0.01f;
225*15dc779aSAndroid Build Coastguard Worker }
226*15dc779aSAndroid Build Coastguard Worker if ((1 == is_ld_sbr) && (1 == frame_flag_480)) {
227*15dc779aSAndroid Build Coastguard Worker no_cols = 30;
228*15dc779aSAndroid Build Coastguard Worker buffer_length = 90;
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker
231*15dc779aSAndroid Build Coastguard Worker memset(pstr_sbr_trans_detector, 0, sizeof(ixheaace_str_sbr_trans_detector));
232*15dc779aSAndroid Build Coastguard Worker
233*15dc779aSAndroid Build Coastguard Worker br_fac = codec_bitrate ? (FLOAT32)total_bitrate / (FLOAT32)codec_bitrate : 1.0f;
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker split_thr_fac = MAX(split_thr_fac, 0.0001f);
236*15dc779aSAndroid Build Coastguard Worker split_thr_fac = 0.000075f / (split_thr_fac * split_thr_fac);
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->split_thr = split_thr_fac * br_fac;
239*15dc779aSAndroid Build Coastguard Worker
240*15dc779aSAndroid Build Coastguard Worker if (is_ld_sbr) {
241*15dc779aSAndroid Build Coastguard Worker WORD32 i;
242*15dc779aSAndroid Build Coastguard Worker FLOAT32 ratio = ((sample_freq / 2) / IXHEAACE_QMF_CHANNELS) * 0.00075275f;
243*15dc779aSAndroid Build Coastguard Worker
244*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp = 1024.0f / sample_freq;
245*15dc779aSAndroid Build Coastguard Worker tmp -= 0.01f;
246*15dc779aSAndroid Build Coastguard Worker tmp = MAX(tmp, 0.001f);
247*15dc779aSAndroid Build Coastguard Worker
248*15dc779aSAndroid Build Coastguard Worker if (1 == frame_flag_480) {
249*15dc779aSAndroid Build Coastguard Worker no_cols = 30;
250*15dc779aSAndroid Build Coastguard Worker buffer_length = 90;
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->split_thr = (br_fac * 0.000075f) / (tmp * tmp) / 2.0f;
253*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->look_ahead = 2;
254*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->time_slots = no_cols / 2;
255*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->buffer_size =
256*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->look_ahead + pstr_sbr_trans_detector->time_slots;
257*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->stop_band =
258*15dc779aSAndroid Build Coastguard Worker (WORD32)fmin(13500 / ((sample_freq >> 1) / IXHEAACE_QMF_CHANNELS), IXHEAACE_QMF_CHANNELS);
259*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->start_band =
260*15dc779aSAndroid Build Coastguard Worker (WORD32)fmin(start_band, pstr_sbr_trans_detector->stop_band - 4);
261*15dc779aSAndroid Build Coastguard Worker
262*15dc779aSAndroid Build Coastguard Worker memset(pstr_sbr_trans_detector->energy, 0,
263*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->buffer_size * sizeof(pstr_sbr_trans_detector->energy[0]));
264*15dc779aSAndroid Build Coastguard Worker memset(pstr_sbr_trans_detector->sbr_transients, 0,
265*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->buffer_size *
266*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_sbr_trans_detector->sbr_transients[0]));
267*15dc779aSAndroid Build Coastguard Worker memset(
268*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->delta_energy, 0,
269*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->buffer_size * sizeof(pstr_sbr_trans_detector->delta_energy[0]));
270*15dc779aSAndroid Build Coastguard Worker
271*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 64; i++) {
272*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->coeff[i] = (FLOAT32)pow(2.0, ratio * (i + 1));
273*15dc779aSAndroid Build Coastguard Worker }
274*15dc779aSAndroid Build Coastguard Worker }
275*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->no_cols = no_cols;
276*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->tran_fc = tran_fc;
277*15dc779aSAndroid Build Coastguard Worker
278*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->buffer_length = buffer_length;
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->no_rows = 64;
281*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->mode = mode;
282*15dc779aSAndroid Build Coastguard Worker
283*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->prev_low_band_energy = 0;
284*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->tran_thr = (FLOAT32)tran_thr;
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->ptr_thresholds = &(pstr_sbr_trans_detector->sbr_thresholds[0]);
287*15dc779aSAndroid Build Coastguard Worker
288*15dc779aSAndroid Build Coastguard Worker memset(pstr_sbr_trans_detector->ptr_thresholds, 0,
289*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_sbr_trans_detector->ptr_thresholds[0]) * IXHEAACE_QMF_CHANNELS);
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->ptr_transients = &(pstr_sbr_trans_detector->sbr_transients[0]);
292*15dc779aSAndroid Build Coastguard Worker memset(pstr_sbr_trans_detector->ptr_transients, 0,
293*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_sbr_trans_detector->ptr_transients[0]) *
294*15dc779aSAndroid Build Coastguard Worker pstr_sbr_trans_detector->buffer_length);
295*15dc779aSAndroid Build Coastguard Worker }
296