xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_signal_classifier.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 #include <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include "iusace_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_quant.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
34*15dc779aSAndroid Build Coastguard Worker 
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_memory_standards.h"
36*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
37*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
38*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
39*15dc779aSAndroid Build Coastguard Worker #include "iusace_signal_classifier.h"
40*15dc779aSAndroid Build Coastguard Worker #include "iusace_fft.h"
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_struct_def.h"
43*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_ms.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
46*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_util.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_asc_write.h"
50*15dc779aSAndroid Build Coastguard Worker #include "iusace_main.h"
51*15dc779aSAndroid Build Coastguard Worker 
iusace_calc_pds(FLOAT32 * ptr_input,WORD32 ccfl)52*15dc779aSAndroid Build Coastguard Worker static VOID iusace_calc_pds(FLOAT32 *ptr_input, WORD32 ccfl) {
53*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
54*15dc779aSAndroid Build Coastguard Worker   FLOAT64 max_pow, delta;
55*15dc779aSAndroid Build Coastguard Worker   FLOAT64 log_ccfl_base_10 = (ccfl == 1024) ? LOG_1024_BASE_10 : LOG_768_BASE_10;
56*15dc779aSAndroid Build Coastguard Worker 
57*15dc779aSAndroid Build Coastguard Worker   max_pow = MAX(
58*15dc779aSAndroid Build Coastguard Worker       10 * (log10(ptr_input[0] * ptr_input[0] + ptr_input[1] * ptr_input[1]) - log_ccfl_base_10) +
59*15dc779aSAndroid Build Coastguard Worker           10e-15,
60*15dc779aSAndroid Build Coastguard Worker       MIN_POW);
61*15dc779aSAndroid Build Coastguard Worker 
62*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i<ccfl>> 1; i++) {
63*15dc779aSAndroid Build Coastguard Worker     /* removed the sqrt along with clubbing the for loops */
64*15dc779aSAndroid Build Coastguard Worker     ptr_input[2 * i] = (FLOAT32)MAX(10 * (log10(ptr_input[2 * i] * ptr_input[2 * i] +
65*15dc779aSAndroid Build Coastguard Worker                                                 ptr_input[2 * i + 1] * ptr_input[2 * i + 1]) -
66*15dc779aSAndroid Build Coastguard Worker                                           log_ccfl_base_10) +
67*15dc779aSAndroid Build Coastguard Worker                                         10e-15,
68*15dc779aSAndroid Build Coastguard Worker                                     MIN_POW);
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker     max_pow = MAX(max_pow, ptr_input[2 * i]);
71*15dc779aSAndroid Build Coastguard Worker   }
72*15dc779aSAndroid Build Coastguard Worker 
73*15dc779aSAndroid Build Coastguard Worker   /* Normalized to reference sound pressure level 96 dB */
74*15dc779aSAndroid Build Coastguard Worker   delta = 96 - max_pow;
75*15dc779aSAndroid Build Coastguard Worker 
76*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i<ccfl>> 1; i++) {
77*15dc779aSAndroid Build Coastguard Worker     ptr_input[2 * i] = ptr_input[2 * i] + (FLOAT32)delta;
78*15dc779aSAndroid Build Coastguard Worker   }
79*15dc779aSAndroid Build Coastguard Worker   return;
80*15dc779aSAndroid Build Coastguard Worker }
81*15dc779aSAndroid Build Coastguard Worker 
iusace_find_tonal(FLOAT32 * ptr_input,WORD32 * ptr_tonal_flag,FLOAT32 * ptr_scratch,WORD32 ccfl)82*15dc779aSAndroid Build Coastguard Worker static VOID iusace_find_tonal(FLOAT32 *ptr_input, WORD32 *ptr_tonal_flag, FLOAT32 *ptr_scratch,
83*15dc779aSAndroid Build Coastguard Worker                               WORD32 ccfl) {
84*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
85*15dc779aSAndroid Build Coastguard Worker   WORD32 is_tonal;
86*15dc779aSAndroid Build Coastguard Worker   FLOAT64 tonal_spl;
87*15dc779aSAndroid Build Coastguard Worker   FLOAT64 absolute_threshold_xm;
88*15dc779aSAndroid Build Coastguard Worker 
89*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i<ccfl>> 1; i++) {
90*15dc779aSAndroid Build Coastguard Worker     ptr_scratch[i] = ptr_input[2 * i];
91*15dc779aSAndroid Build Coastguard Worker   }
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker   if (ccfl == FRAME_LEN_LONG) {
94*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i <= 511; i++) {
95*15dc779aSAndroid Build Coastguard Worker       ptr_tonal_flag[i] = 0;
96*15dc779aSAndroid Build Coastguard Worker     }
97*15dc779aSAndroid Build Coastguard Worker 
98*15dc779aSAndroid Build Coastguard Worker     for (i = 2; i < 500; i++) {
99*15dc779aSAndroid Build Coastguard Worker       if (ptr_scratch[i] > ptr_scratch[i - 1] && ptr_scratch[i] >= ptr_scratch[i + 1]) {
100*15dc779aSAndroid Build Coastguard Worker         is_tonal = 1;
101*15dc779aSAndroid Build Coastguard Worker 
102*15dc779aSAndroid Build Coastguard Worker         /* Verify it meets the condition: ptr_scratch[i]-ptr_scratch[i+j]>=7 */
103*15dc779aSAndroid Build Coastguard Worker 
104*15dc779aSAndroid Build Coastguard Worker         if (1 < i && i < 62) {
105*15dc779aSAndroid Build Coastguard Worker           for (j = -2; j <= -2; j++) {
106*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
107*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
108*15dc779aSAndroid Build Coastguard Worker           }
109*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
110*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 2; j++) {
111*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
112*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
113*15dc779aSAndroid Build Coastguard Worker             }
114*15dc779aSAndroid Build Coastguard Worker           }
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
117*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
118*15dc779aSAndroid Build Coastguard Worker           }
119*15dc779aSAndroid Build Coastguard Worker         }
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker         else if (62 <= i && i < 126) {
122*15dc779aSAndroid Build Coastguard Worker           for (j = -3; j <= -2; j++) {
123*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
124*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
125*15dc779aSAndroid Build Coastguard Worker           }
126*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
127*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 3; j++) {
128*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
129*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
130*15dc779aSAndroid Build Coastguard Worker             }
131*15dc779aSAndroid Build Coastguard Worker           }
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
134*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
135*15dc779aSAndroid Build Coastguard Worker           }
136*15dc779aSAndroid Build Coastguard Worker         }
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker         else if (126 <= i && i < 254) {
139*15dc779aSAndroid Build Coastguard Worker           for (j = -6; j <= -2; j++) {
140*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
141*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
142*15dc779aSAndroid Build Coastguard Worker           }
143*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
144*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 6; j++) {
145*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
146*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
147*15dc779aSAndroid Build Coastguard Worker             }
148*15dc779aSAndroid Build Coastguard Worker           }
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
151*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
152*15dc779aSAndroid Build Coastguard Worker           }
153*15dc779aSAndroid Build Coastguard Worker         }
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker         else if (254 <= i && i < 500) {
156*15dc779aSAndroid Build Coastguard Worker           for (j = -12; j <= -2; j++) {
157*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
158*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
159*15dc779aSAndroid Build Coastguard Worker           }
160*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
161*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 12; j++) {
162*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
163*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
164*15dc779aSAndroid Build Coastguard Worker             }
165*15dc779aSAndroid Build Coastguard Worker           }
166*15dc779aSAndroid Build Coastguard Worker 
167*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
168*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
169*15dc779aSAndroid Build Coastguard Worker           }
170*15dc779aSAndroid Build Coastguard Worker         }
171*15dc779aSAndroid Build Coastguard Worker       }
172*15dc779aSAndroid Build Coastguard Worker     }
173*15dc779aSAndroid Build Coastguard Worker 
174*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i <= 511; i++) {
175*15dc779aSAndroid Build Coastguard Worker       if (ptr_tonal_flag[i] == 1) {
176*15dc779aSAndroid Build Coastguard Worker         /* compute the SPL of tonal */
177*15dc779aSAndroid Build Coastguard Worker         tonal_spl =
178*15dc779aSAndroid Build Coastguard Worker             10 * log10(pow(10, (ptr_scratch[i - 1] / 10)) + pow(10, (ptr_scratch[i] / 10)) +
179*15dc779aSAndroid Build Coastguard Worker                        pow(10, (ptr_scratch[i + 1] / 10)));
180*15dc779aSAndroid Build Coastguard Worker 
181*15dc779aSAndroid Build Coastguard Worker         if (i >= 324) {
182*15dc779aSAndroid Build Coastguard Worker           absolute_threshold_xm = iusace_classify_arrays.absolute_threshold_1024[i] + 20;
183*15dc779aSAndroid Build Coastguard Worker         } else {
184*15dc779aSAndroid Build Coastguard Worker           absolute_threshold_xm = iusace_classify_arrays.absolute_threshold_1024[i];
185*15dc779aSAndroid Build Coastguard Worker         }
186*15dc779aSAndroid Build Coastguard Worker         if (tonal_spl < absolute_threshold_xm) {
187*15dc779aSAndroid Build Coastguard Worker           ptr_tonal_flag[i] = 0;
188*15dc779aSAndroid Build Coastguard Worker         }
189*15dc779aSAndroid Build Coastguard Worker       }
190*15dc779aSAndroid Build Coastguard Worker     }
191*15dc779aSAndroid Build Coastguard Worker   } else  // (ccfl == 768)
192*15dc779aSAndroid Build Coastguard Worker   {
193*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i <= 383; i++) {
194*15dc779aSAndroid Build Coastguard Worker       ptr_tonal_flag[i] = 0;
195*15dc779aSAndroid Build Coastguard Worker     }
196*15dc779aSAndroid Build Coastguard Worker 
197*15dc779aSAndroid Build Coastguard Worker     for (i = 2; i < 375; i++) {
198*15dc779aSAndroid Build Coastguard Worker       if (ptr_scratch[i] > ptr_scratch[i - 1] && ptr_scratch[i] >= ptr_scratch[i + 1]) {
199*15dc779aSAndroid Build Coastguard Worker         is_tonal = 1;
200*15dc779aSAndroid Build Coastguard Worker 
201*15dc779aSAndroid Build Coastguard Worker         /* Verify it meets the condition: ptr_scratch[i]-ptr_scratch[i+j]>=7 */
202*15dc779aSAndroid Build Coastguard Worker 
203*15dc779aSAndroid Build Coastguard Worker         if (1 < i && i < 47) {
204*15dc779aSAndroid Build Coastguard Worker           for (j = -2; j <= -2; j++) {
205*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
206*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
207*15dc779aSAndroid Build Coastguard Worker           }
208*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
209*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 2; j++) {
210*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
211*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
212*15dc779aSAndroid Build Coastguard Worker             }
213*15dc779aSAndroid Build Coastguard Worker           }
214*15dc779aSAndroid Build Coastguard Worker 
215*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
216*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
217*15dc779aSAndroid Build Coastguard Worker           }
218*15dc779aSAndroid Build Coastguard Worker         }
219*15dc779aSAndroid Build Coastguard Worker 
220*15dc779aSAndroid Build Coastguard Worker         else if (47 <= i && i < 95) {
221*15dc779aSAndroid Build Coastguard Worker           for (j = -3; j <= -2; j++) {
222*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
223*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
224*15dc779aSAndroid Build Coastguard Worker           }
225*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
226*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 3; j++) {
227*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
228*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
229*15dc779aSAndroid Build Coastguard Worker             }
230*15dc779aSAndroid Build Coastguard Worker           }
231*15dc779aSAndroid Build Coastguard Worker 
232*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
233*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
234*15dc779aSAndroid Build Coastguard Worker           }
235*15dc779aSAndroid Build Coastguard Worker         }
236*15dc779aSAndroid Build Coastguard Worker 
237*15dc779aSAndroid Build Coastguard Worker         else if (95 <= i && i < 194) {
238*15dc779aSAndroid Build Coastguard Worker           for (j = -5; j <= -2; j++) {
239*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
240*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
241*15dc779aSAndroid Build Coastguard Worker           }
242*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
243*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 5; j++) {
244*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
245*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
246*15dc779aSAndroid Build Coastguard Worker             }
247*15dc779aSAndroid Build Coastguard Worker           }
248*15dc779aSAndroid Build Coastguard Worker 
249*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
250*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
251*15dc779aSAndroid Build Coastguard Worker           }
252*15dc779aSAndroid Build Coastguard Worker         }
253*15dc779aSAndroid Build Coastguard Worker 
254*15dc779aSAndroid Build Coastguard Worker         else if (191 <= i && i < 375) {
255*15dc779aSAndroid Build Coastguard Worker           for (j = -9; j <= -2; j++) {
256*15dc779aSAndroid Build Coastguard Worker             is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
257*15dc779aSAndroid Build Coastguard Worker             if (is_tonal == 0) break;
258*15dc779aSAndroid Build Coastguard Worker           }
259*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
260*15dc779aSAndroid Build Coastguard Worker             for (j = 2; j <= 9; j++) {
261*15dc779aSAndroid Build Coastguard Worker               is_tonal = is_tonal && ptr_scratch[i] - ptr_scratch[i + j] >= 7;
262*15dc779aSAndroid Build Coastguard Worker               if (is_tonal == 0) break;
263*15dc779aSAndroid Build Coastguard Worker             }
264*15dc779aSAndroid Build Coastguard Worker           }
265*15dc779aSAndroid Build Coastguard Worker 
266*15dc779aSAndroid Build Coastguard Worker           if (is_tonal == 1) {
267*15dc779aSAndroid Build Coastguard Worker             ptr_tonal_flag[i] = 1;
268*15dc779aSAndroid Build Coastguard Worker           }
269*15dc779aSAndroid Build Coastguard Worker         }
270*15dc779aSAndroid Build Coastguard Worker       }
271*15dc779aSAndroid Build Coastguard Worker     }
272*15dc779aSAndroid Build Coastguard Worker 
273*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i <= 383; i++) {
274*15dc779aSAndroid Build Coastguard Worker       if (ptr_tonal_flag[i] == 1) {
275*15dc779aSAndroid Build Coastguard Worker         /* compute the SPL of tonal */
276*15dc779aSAndroid Build Coastguard Worker         tonal_spl =
277*15dc779aSAndroid Build Coastguard Worker             10 * log10(pow(10, (ptr_scratch[i - 1] / 10)) + pow(10, (ptr_scratch[i] / 10)) +
278*15dc779aSAndroid Build Coastguard Worker                        pow(10, (ptr_scratch[i + 1] / 10)));
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker         if (i >= 243) {
281*15dc779aSAndroid Build Coastguard Worker           absolute_threshold_xm = iusace_classify_arrays.absolute_threshold_768[i] + 20;
282*15dc779aSAndroid Build Coastguard Worker         } else {
283*15dc779aSAndroid Build Coastguard Worker           absolute_threshold_xm = iusace_classify_arrays.absolute_threshold_768[i];
284*15dc779aSAndroid Build Coastguard Worker         }
285*15dc779aSAndroid Build Coastguard Worker         if (tonal_spl < absolute_threshold_xm) {
286*15dc779aSAndroid Build Coastguard Worker           ptr_tonal_flag[i] = 0;
287*15dc779aSAndroid Build Coastguard Worker         }
288*15dc779aSAndroid Build Coastguard Worker       }
289*15dc779aSAndroid Build Coastguard Worker     }
290*15dc779aSAndroid Build Coastguard Worker   }
291*15dc779aSAndroid Build Coastguard Worker   return;
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker 
iusace_tonal_analysis(ia_tonal_params_struct * pstr_ton_params,iusace_scratch_mem * pstr_scratch,WORD32 ccfl)294*15dc779aSAndroid Build Coastguard Worker static VOID iusace_tonal_analysis(ia_tonal_params_struct *pstr_ton_params,
295*15dc779aSAndroid Build Coastguard Worker                                   iusace_scratch_mem *pstr_scratch, WORD32 ccfl) {
296*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_complex_fft = pstr_scratch->p_complex_fft;
297*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_tonal_flag = pstr_scratch->p_tonal_flag;
298*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_time_sig = pstr_ton_params->time_signal;
299*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt_xm = pstr_ton_params->framecnt_xm;
300*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_n_tonal = pstr_ton_params->n_tonal;
301*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_n_tonal_low_frequency = pstr_ton_params->n_tonal_low_frequency;
302*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_n_tonal_low_frequency_ratio = pstr_ton_params->n_tonal_low_frequency_ratio;
303*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal = pstr_ton_params->ave_n_tonal;
304*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal_short = pstr_ton_params->ave_n_tonal_short;
305*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
306*15dc779aSAndroid Build Coastguard Worker   WORD32 fft_size = ccfl;
307*15dc779aSAndroid Build Coastguard Worker 
308*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_length;
309*15dc779aSAndroid Build Coastguard Worker   WORD32 n_tonal_total, n_tonal_low_frequency_total;
310*15dc779aSAndroid Build Coastguard Worker 
311*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ccfl; i++) {
312*15dc779aSAndroid Build Coastguard Worker     ptr_complex_fft[2 * i] = (FLOAT32)(
313*15dc779aSAndroid Build Coastguard Worker         ptr_time_sig[i] * ((ccfl == 1024) ? iusace_classify_arrays.hanning_window_1024[i]
314*15dc779aSAndroid Build Coastguard Worker                                           : iusace_classify_arrays.hanning_window_768[i]));
315*15dc779aSAndroid Build Coastguard Worker     ptr_complex_fft[2 * i + 1] = 0;
316*15dc779aSAndroid Build Coastguard Worker   }
317*15dc779aSAndroid Build Coastguard Worker 
318*15dc779aSAndroid Build Coastguard Worker   iusace_complex_fft(ptr_complex_fft, fft_size, pstr_scratch);
319*15dc779aSAndroid Build Coastguard Worker 
320*15dc779aSAndroid Build Coastguard Worker   /* compute power density spectrum */
321*15dc779aSAndroid Build Coastguard Worker   /* re_fft contains the resulting pds */
322*15dc779aSAndroid Build Coastguard Worker   iusace_calc_pds(ptr_complex_fft, ccfl);
323*15dc779aSAndroid Build Coastguard Worker 
324*15dc779aSAndroid Build Coastguard Worker   /* detect tonal */
325*15dc779aSAndroid Build Coastguard Worker   iusace_find_tonal(ptr_complex_fft, ptr_tonal_flag, pstr_scratch->p_pow_spec, ccfl);
326*15dc779aSAndroid Build Coastguard Worker 
327*15dc779aSAndroid Build Coastguard Worker   /* update n_tonal, n_tonal_low_frequency */
328*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 99; i++) {
329*15dc779aSAndroid Build Coastguard Worker     ptr_n_tonal[i] = ptr_n_tonal[i + 1];
330*15dc779aSAndroid Build Coastguard Worker     ptr_n_tonal_low_frequency[i] = ptr_n_tonal_low_frequency[i + 1];
331*15dc779aSAndroid Build Coastguard Worker   }
332*15dc779aSAndroid Build Coastguard Worker   ptr_n_tonal[99] = 0;
333*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i<ccfl>> 1; i++) {
334*15dc779aSAndroid Build Coastguard Worker     ptr_n_tonal[99] += ptr_tonal_flag[i];
335*15dc779aSAndroid Build Coastguard Worker   }
336*15dc779aSAndroid Build Coastguard Worker   ptr_n_tonal_low_frequency[99] = 0;
337*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < INDEXOFLOWFREQUENCY; i++) {
338*15dc779aSAndroid Build Coastguard Worker     ptr_n_tonal_low_frequency[99] += ptr_tonal_flag[i];
339*15dc779aSAndroid Build Coastguard Worker   }
340*15dc779aSAndroid Build Coastguard Worker 
341*15dc779aSAndroid Build Coastguard Worker   /* compute long-term AVE and the ratio of distribution in low-frequency domain */
342*15dc779aSAndroid Build Coastguard Worker   if (framecnt_xm < AVE_TONAL_LENGTH) {
343*15dc779aSAndroid Build Coastguard Worker     frame_length = framecnt_xm;
344*15dc779aSAndroid Build Coastguard Worker   } else {
345*15dc779aSAndroid Build Coastguard Worker     frame_length = AVE_TONAL_LENGTH;
346*15dc779aSAndroid Build Coastguard Worker   }
347*15dc779aSAndroid Build Coastguard Worker 
348*15dc779aSAndroid Build Coastguard Worker   n_tonal_total = 0;
349*15dc779aSAndroid Build Coastguard Worker   n_tonal_low_frequency_total = 0;
350*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_length; i++) {
351*15dc779aSAndroid Build Coastguard Worker     n_tonal_total += ptr_n_tonal[99 - i];
352*15dc779aSAndroid Build Coastguard Worker     n_tonal_low_frequency_total += ptr_n_tonal_low_frequency[99 - i];
353*15dc779aSAndroid Build Coastguard Worker   }
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker   *ave_n_tonal = (FLOAT32)n_tonal_total / frame_length;
356*15dc779aSAndroid Build Coastguard Worker 
357*15dc779aSAndroid Build Coastguard Worker   if (n_tonal_total == 0) {
358*15dc779aSAndroid Build Coastguard Worker     *ptr_n_tonal_low_frequency_ratio = 1;
359*15dc779aSAndroid Build Coastguard Worker   } else {
360*15dc779aSAndroid Build Coastguard Worker     *ptr_n_tonal_low_frequency_ratio = (FLOAT32)n_tonal_low_frequency_total / n_tonal_total;
361*15dc779aSAndroid Build Coastguard Worker   }
362*15dc779aSAndroid Build Coastguard Worker 
363*15dc779aSAndroid Build Coastguard Worker   /* compute the short-term AVE */
364*15dc779aSAndroid Build Coastguard Worker   if (framecnt_xm < AVE_TONAL_LENGTH_SHORT) {
365*15dc779aSAndroid Build Coastguard Worker     frame_length = framecnt_xm;
366*15dc779aSAndroid Build Coastguard Worker   } else {
367*15dc779aSAndroid Build Coastguard Worker     frame_length = AVE_TONAL_LENGTH_SHORT;
368*15dc779aSAndroid Build Coastguard Worker   }
369*15dc779aSAndroid Build Coastguard Worker 
370*15dc779aSAndroid Build Coastguard Worker   n_tonal_total = 0;
371*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_length; i++) {
372*15dc779aSAndroid Build Coastguard Worker     n_tonal_total += ptr_n_tonal[99 - i];
373*15dc779aSAndroid Build Coastguard Worker   }
374*15dc779aSAndroid Build Coastguard Worker 
375*15dc779aSAndroid Build Coastguard Worker   *ave_n_tonal_short = (FLOAT32)n_tonal_total / frame_length;
376*15dc779aSAndroid Build Coastguard Worker   return;
377*15dc779aSAndroid Build Coastguard Worker }
378*15dc779aSAndroid Build Coastguard Worker 
iusace_spectral_tilt_analysis(ia_spec_tilt_params_struct * ptr_spec_params,WORD32 ccfl)379*15dc779aSAndroid Build Coastguard Worker static VOID iusace_spectral_tilt_analysis(ia_spec_tilt_params_struct *ptr_spec_params,
380*15dc779aSAndroid Build Coastguard Worker                                           WORD32 ccfl) {
381*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_time_signal = ptr_spec_params->time_signal;
382*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt_xm = ptr_spec_params->framecnt_xm;
383*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_spec_tilt_buf = ptr_spec_params->spec_tilt_buf;
384*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_msd_spec_tilt = ptr_spec_params->msd_spec_tilt;
385*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_msd_spec_tilt_short = ptr_spec_params->msd_spec_tilt_short;
386*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
387*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_length;
388*15dc779aSAndroid Build Coastguard Worker 
389*15dc779aSAndroid Build Coastguard Worker   FLOAT32 r0, r1;
390*15dc779aSAndroid Build Coastguard Worker   FLOAT32 spec_tilt;
391*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_spec_tilt;
392*15dc779aSAndroid Build Coastguard Worker 
393*15dc779aSAndroid Build Coastguard Worker   /* compute spectral tilt */
394*15dc779aSAndroid Build Coastguard Worker   r0 = 0;
395*15dc779aSAndroid Build Coastguard Worker   r1 = 0;
396*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ccfl - 1; i++) {
397*15dc779aSAndroid Build Coastguard Worker     r0 += ptr_time_signal[i] * ptr_time_signal[i];
398*15dc779aSAndroid Build Coastguard Worker     r1 += ptr_time_signal[i] * ptr_time_signal[i + 1];
399*15dc779aSAndroid Build Coastguard Worker   }
400*15dc779aSAndroid Build Coastguard Worker   r0 += ptr_time_signal[i] * ptr_time_signal[i];
401*15dc779aSAndroid Build Coastguard Worker 
402*15dc779aSAndroid Build Coastguard Worker   if (r0 == 0) {
403*15dc779aSAndroid Build Coastguard Worker     spec_tilt = 1.0f;
404*15dc779aSAndroid Build Coastguard Worker   } else {
405*15dc779aSAndroid Build Coastguard Worker     spec_tilt = r1 / r0;
406*15dc779aSAndroid Build Coastguard Worker   }
407*15dc779aSAndroid Build Coastguard Worker 
408*15dc779aSAndroid Build Coastguard Worker   /* update spec_tilt_buf */
409*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 100 - 1; i++) {
410*15dc779aSAndroid Build Coastguard Worker     ptr_spec_tilt_buf[i] = ptr_spec_tilt_buf[i + 1];
411*15dc779aSAndroid Build Coastguard Worker   }
412*15dc779aSAndroid Build Coastguard Worker   ptr_spec_tilt_buf[99] = spec_tilt;
413*15dc779aSAndroid Build Coastguard Worker 
414*15dc779aSAndroid Build Coastguard Worker   /* compute the long-term mean square deviation of the spectral tilt */
415*15dc779aSAndroid Build Coastguard Worker   if (framecnt_xm < SPECTRAL_TILT_LENGTH) {
416*15dc779aSAndroid Build Coastguard Worker     frame_length = framecnt_xm;
417*15dc779aSAndroid Build Coastguard Worker   } else {
418*15dc779aSAndroid Build Coastguard Worker     frame_length = SPECTRAL_TILT_LENGTH;
419*15dc779aSAndroid Build Coastguard Worker   }
420*15dc779aSAndroid Build Coastguard Worker 
421*15dc779aSAndroid Build Coastguard Worker   ave_spec_tilt = 0;
422*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_length; i++) {
423*15dc779aSAndroid Build Coastguard Worker     ave_spec_tilt += ptr_spec_tilt_buf[99 - i];
424*15dc779aSAndroid Build Coastguard Worker   }
425*15dc779aSAndroid Build Coastguard Worker   ave_spec_tilt /= frame_length;
426*15dc779aSAndroid Build Coastguard Worker 
427*15dc779aSAndroid Build Coastguard Worker   *ptr_msd_spec_tilt = 0;
428*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_length; i++) {
429*15dc779aSAndroid Build Coastguard Worker     *ptr_msd_spec_tilt +=
430*15dc779aSAndroid Build Coastguard Worker         (ptr_spec_tilt_buf[99 - i] - ave_spec_tilt) * (ptr_spec_tilt_buf[99 - i] - ave_spec_tilt);
431*15dc779aSAndroid Build Coastguard Worker   }
432*15dc779aSAndroid Build Coastguard Worker   *ptr_msd_spec_tilt /= frame_length;
433*15dc779aSAndroid Build Coastguard Worker 
434*15dc779aSAndroid Build Coastguard Worker   /* compute the short-term mean square deviation of the spectral tilt */
435*15dc779aSAndroid Build Coastguard Worker   if (framecnt_xm < SPECTRAL_TILT_LENGTH_SHORT) {
436*15dc779aSAndroid Build Coastguard Worker     frame_length = framecnt_xm;
437*15dc779aSAndroid Build Coastguard Worker   } else {
438*15dc779aSAndroid Build Coastguard Worker     frame_length = SPECTRAL_TILT_LENGTH_SHORT;
439*15dc779aSAndroid Build Coastguard Worker   }
440*15dc779aSAndroid Build Coastguard Worker 
441*15dc779aSAndroid Build Coastguard Worker   ave_spec_tilt = 0;
442*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_length; i++) {
443*15dc779aSAndroid Build Coastguard Worker     ave_spec_tilt += ptr_spec_tilt_buf[99 - i];
444*15dc779aSAndroid Build Coastguard Worker   }
445*15dc779aSAndroid Build Coastguard Worker   ave_spec_tilt /= frame_length;
446*15dc779aSAndroid Build Coastguard Worker 
447*15dc779aSAndroid Build Coastguard Worker   *ptr_msd_spec_tilt_short = 0;
448*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_length; i++) {
449*15dc779aSAndroid Build Coastguard Worker     *ptr_msd_spec_tilt_short +=
450*15dc779aSAndroid Build Coastguard Worker         (ptr_spec_tilt_buf[99 - i] - ave_spec_tilt) * (ptr_spec_tilt_buf[99 - i] - ave_spec_tilt);
451*15dc779aSAndroid Build Coastguard Worker   }
452*15dc779aSAndroid Build Coastguard Worker   *ptr_msd_spec_tilt_short /= frame_length;
453*15dc779aSAndroid Build Coastguard Worker 
454*15dc779aSAndroid Build Coastguard Worker   /* compute the energy of current frame */
455*15dc779aSAndroid Build Coastguard Worker   if (r0 <= 1) {
456*15dc779aSAndroid Build Coastguard Worker     ptr_spec_params->frame_energy = 0;
457*15dc779aSAndroid Build Coastguard Worker   } else {
458*15dc779aSAndroid Build Coastguard Worker     ptr_spec_params->frame_energy = (FLOAT32)(10 * log(r0) / log(10));
459*15dc779aSAndroid Build Coastguard Worker   }
460*15dc779aSAndroid Build Coastguard Worker   return;
461*15dc779aSAndroid Build Coastguard Worker }
462*15dc779aSAndroid Build Coastguard Worker 
iusace_init_mode_decision(ia_mode_params_struct * pstr_mode_params)463*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_init_mode_decision(ia_mode_params_struct *pstr_mode_params) {
464*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
465*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt = pstr_mode_params->framecnt;
466*15dc779aSAndroid Build Coastguard Worker   WORD32 *framecnt_xm = pstr_mode_params->framecnt_xm;
467*15dc779aSAndroid Build Coastguard Worker   WORD32 *flag_border = pstr_mode_params->flag_border;
468*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_n_tonal_short = pstr_mode_params->ave_n_tonal_short;
469*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_n_tonal = pstr_mode_params->ave_n_tonal;
470*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal_short_buf = pstr_mode_params->ave_n_tonal_short_buf;
471*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal_buf = pstr_mode_params->ave_n_tonal_buf;
472*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt = pstr_mode_params->msd_spec_tilt;
473*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt_short = pstr_mode_params->msd_spec_tilt_short;
474*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *msd_spec_tilt_buf = pstr_mode_params->msd_spec_tilt_buf;
475*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *msd_spec_tilt_short_buf = pstr_mode_params->msd_spec_tilt_short_buf;
476*15dc779aSAndroid Build Coastguard Worker   FLOAT32 n_tonal_low_frequency_ratio = pstr_mode_params->n_tonal_low_frequency_ratio;
477*15dc779aSAndroid Build Coastguard Worker   FLOAT32 frame_energy = pstr_mode_params->frame_energy;
478*15dc779aSAndroid Build Coastguard Worker   WORD32 init_mode_decision_result = TBD;
479*15dc779aSAndroid Build Coastguard Worker   WORD32 count_msd_st_monchhichi = 0;
480*15dc779aSAndroid Build Coastguard Worker   WORD32 count_msd_st_speech_music = 0, count_msd_st_music_speech = 0;
481*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_ave_music_speech = 0;
482*15dc779aSAndroid Build Coastguard Worker   WORD32 count_msd_st_music = 0;
483*15dc779aSAndroid Build Coastguard Worker   WORD32 border_state = 0;
484*15dc779aSAndroid Build Coastguard Worker   WORD32 count_quiet_mode = 0;
485*15dc779aSAndroid Build Coastguard Worker 
486*15dc779aSAndroid Build Coastguard Worker   *flag_border = NO_BORDER;
487*15dc779aSAndroid Build Coastguard Worker 
488*15dc779aSAndroid Build Coastguard Worker   /* border decision according to spectral tilt */
489*15dc779aSAndroid Build Coastguard Worker 
490*15dc779aSAndroid Build Coastguard Worker   /* update msd_spec_tilt_buf, msd_spec_tilt_short_buf */
491*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 5 - 1; i++) {
492*15dc779aSAndroid Build Coastguard Worker     msd_spec_tilt_buf[i] = msd_spec_tilt_buf[i + 1];
493*15dc779aSAndroid Build Coastguard Worker     msd_spec_tilt_short_buf[i] = msd_spec_tilt_short_buf[i + 1];
494*15dc779aSAndroid Build Coastguard Worker   }
495*15dc779aSAndroid Build Coastguard Worker   msd_spec_tilt_buf[4] = msd_spec_tilt;
496*15dc779aSAndroid Build Coastguard Worker   msd_spec_tilt_short_buf[4] = msd_spec_tilt_short;
497*15dc779aSAndroid Build Coastguard Worker 
498*15dc779aSAndroid Build Coastguard Worker   /* speech->music find strict border of speech->music */
499*15dc779aSAndroid Build Coastguard Worker   if ((msd_spec_tilt >= 0.014) && (msd_spec_tilt_short <= 0.000005)) {
500*15dc779aSAndroid Build Coastguard Worker     count_msd_st_monchhichi++;
501*15dc779aSAndroid Build Coastguard Worker   } else {
502*15dc779aSAndroid Build Coastguard Worker     count_msd_st_monchhichi = 0;
503*15dc779aSAndroid Build Coastguard Worker   }
504*15dc779aSAndroid Build Coastguard Worker   if (((*flag_border != BORDER_SPEECH_MUSIC_DEFINITE) &&
505*15dc779aSAndroid Build Coastguard Worker        (*flag_border != BORDER_MUSIC_SPEECH_DEFINITE)) &&
506*15dc779aSAndroid Build Coastguard Worker       (border_state != BORDER_SPEECH_MUSIC_DEFINITE) && (count_msd_st_monchhichi >= 15) &&
507*15dc779aSAndroid Build Coastguard Worker       (*framecnt_xm >= 300)) {
508*15dc779aSAndroid Build Coastguard Worker     *framecnt_xm = 10;
509*15dc779aSAndroid Build Coastguard Worker     *flag_border = BORDER_SPEECH_MUSIC;
510*15dc779aSAndroid Build Coastguard Worker   }
511*15dc779aSAndroid Build Coastguard Worker 
512*15dc779aSAndroid Build Coastguard Worker   /* find the relative loose border of speech->music */
513*15dc779aSAndroid Build Coastguard Worker   if ((msd_spec_tilt >= 0.0025) && (msd_spec_tilt_short <= 0.000003)) {
514*15dc779aSAndroid Build Coastguard Worker     count_msd_st_speech_music++;
515*15dc779aSAndroid Build Coastguard Worker   } else {
516*15dc779aSAndroid Build Coastguard Worker     count_msd_st_speech_music = 0;
517*15dc779aSAndroid Build Coastguard Worker   }
518*15dc779aSAndroid Build Coastguard Worker   if (((*flag_border != BORDER_SPEECH_MUSIC_DEFINITE) &&
519*15dc779aSAndroid Build Coastguard Worker        (*flag_border != BORDER_MUSIC_SPEECH_DEFINITE)) &&
520*15dc779aSAndroid Build Coastguard Worker       (border_state != BORDER_SPEECH_MUSIC_DEFINITE) && (count_msd_st_speech_music >= 15) &&
521*15dc779aSAndroid Build Coastguard Worker       (*framecnt_xm >= 300)) {
522*15dc779aSAndroid Build Coastguard Worker     *framecnt_xm = 10;
523*15dc779aSAndroid Build Coastguard Worker     *flag_border = BORDER_SPEECH_MUSIC;
524*15dc779aSAndroid Build Coastguard Worker   }
525*15dc779aSAndroid Build Coastguard Worker 
526*15dc779aSAndroid Build Coastguard Worker   /* music->speech */
527*15dc779aSAndroid Build Coastguard Worker   if ((msd_spec_tilt_buf[0] <= 0.0003) && (msd_spec_tilt_short_buf[0] <= 0.0002)) {
528*15dc779aSAndroid Build Coastguard Worker     count_msd_st_music_speech++;
529*15dc779aSAndroid Build Coastguard Worker   }
530*15dc779aSAndroid Build Coastguard Worker   if (((*flag_border != BORDER_SPEECH_MUSIC_DEFINITE) &&
531*15dc779aSAndroid Build Coastguard Worker        (*flag_border != BORDER_MUSIC_SPEECH_DEFINITE)) &&
532*15dc779aSAndroid Build Coastguard Worker       (border_state != BORDER_MUSIC_SPEECH_DEFINITE) && (count_msd_st_music_speech >= 100) &&
533*15dc779aSAndroid Build Coastguard Worker       (msd_spec_tilt >= 0.0008) && (msd_spec_tilt_short >= 0.0025) && (*framecnt_xm >= 20)) {
534*15dc779aSAndroid Build Coastguard Worker     *framecnt_xm = 10;
535*15dc779aSAndroid Build Coastguard Worker     *flag_border = BORDER_MUSIC_SPEECH;
536*15dc779aSAndroid Build Coastguard Worker   }
537*15dc779aSAndroid Build Coastguard Worker 
538*15dc779aSAndroid Build Coastguard Worker   /* border decision according to tonal
539*15dc779aSAndroid Build Coastguard Worker    *  update ave_n_tonal_short_buf, ave_n_tonal_buf */
540*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 5 - 1; i++) {
541*15dc779aSAndroid Build Coastguard Worker     ave_n_tonal_short_buf[i] = ave_n_tonal_short_buf[i + 1];
542*15dc779aSAndroid Build Coastguard Worker     ave_n_tonal_buf[i] = ave_n_tonal_buf[i + 1];
543*15dc779aSAndroid Build Coastguard Worker   }
544*15dc779aSAndroid Build Coastguard Worker   ave_n_tonal_short_buf[4] = ave_n_tonal_short;
545*15dc779aSAndroid Build Coastguard Worker   ave_n_tonal_buf[4] = ave_n_tonal;
546*15dc779aSAndroid Build Coastguard Worker 
547*15dc779aSAndroid Build Coastguard Worker   /* music->speech */
548*15dc779aSAndroid Build Coastguard Worker   if ((ave_n_tonal_buf[0] >= 12) && (ave_n_tonal_buf[0] < 15) &&
549*15dc779aSAndroid Build Coastguard Worker       (ave_n_tonal_buf[0] - ave_n_tonal_short_buf[0] >= 5) && (*framecnt_xm >= 20) &&
550*15dc779aSAndroid Build Coastguard Worker       (ave_n_tonal_short - ave_n_tonal_short_buf[0] < 5)) {
551*15dc779aSAndroid Build Coastguard Worker     *framecnt_xm = 10;
552*15dc779aSAndroid Build Coastguard Worker     flag_ave_music_speech = 1;
553*15dc779aSAndroid Build Coastguard Worker     *flag_border = BORDER_MUSIC_SPEECH_DEFINITE;
554*15dc779aSAndroid Build Coastguard Worker   }
555*15dc779aSAndroid Build Coastguard Worker 
556*15dc779aSAndroid Build Coastguard Worker   /* update border decision according to energy */
557*15dc779aSAndroid Build Coastguard Worker   if (frame_energy <= 60) {
558*15dc779aSAndroid Build Coastguard Worker     count_quiet_mode = 0;
559*15dc779aSAndroid Build Coastguard Worker   } else {
560*15dc779aSAndroid Build Coastguard Worker     count_quiet_mode++;
561*15dc779aSAndroid Build Coastguard Worker   }
562*15dc779aSAndroid Build Coastguard Worker 
563*15dc779aSAndroid Build Coastguard Worker   if ((*flag_border == BORDER_MUSIC_SPEECH) && (count_quiet_mode <= 5)) {
564*15dc779aSAndroid Build Coastguard Worker     *flag_border = BORDER_MUSIC_SPEECH_DEFINITE;
565*15dc779aSAndroid Build Coastguard Worker     *framecnt_xm = 10;
566*15dc779aSAndroid Build Coastguard Worker   }
567*15dc779aSAndroid Build Coastguard Worker 
568*15dc779aSAndroid Build Coastguard Worker   /* MUSIC_DEFINITE and SPEECH_DEFINITE mode decision according to short-term characters */
569*15dc779aSAndroid Build Coastguard Worker 
570*15dc779aSAndroid Build Coastguard Worker   /* ave_n_tonal_short */
571*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (ave_n_tonal_short >= 19)) {
572*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC_DEFINITE;
573*15dc779aSAndroid Build Coastguard Worker   }
574*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (ave_n_tonal_short <= 1.5)) {
575*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = SPEECH_DEFINITE;
576*15dc779aSAndroid Build Coastguard Worker   }
577*15dc779aSAndroid Build Coastguard Worker 
578*15dc779aSAndroid Build Coastguard Worker   /* msd_spec_tilt_short */
579*15dc779aSAndroid Build Coastguard Worker   if (msd_spec_tilt_short >= 0.02) {
580*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = SPEECH_DEFINITE;
581*15dc779aSAndroid Build Coastguard Worker   }
582*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (msd_spec_tilt_short <= 0.00000025) &&
583*15dc779aSAndroid Build Coastguard Worker       (framecnt >= 10)) {
584*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC_DEFINITE;
585*15dc779aSAndroid Build Coastguard Worker   }
586*15dc779aSAndroid Build Coastguard Worker 
587*15dc779aSAndroid Build Coastguard Worker   /* SPEECH mode decision */
588*15dc779aSAndroid Build Coastguard Worker 
589*15dc779aSAndroid Build Coastguard Worker   /* flag_ave_music_speech??ave_n_tonal_short */
590*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (flag_ave_music_speech == 1)) {
591*15dc779aSAndroid Build Coastguard Worker     if ((ave_n_tonal_short <= 12) && (*framecnt_xm <= 150)) {
592*15dc779aSAndroid Build Coastguard Worker       init_mode_decision_result = SPEECH;
593*15dc779aSAndroid Build Coastguard Worker     }
594*15dc779aSAndroid Build Coastguard Worker   }
595*15dc779aSAndroid Build Coastguard Worker 
596*15dc779aSAndroid Build Coastguard Worker   /* MUSIC_DEFINITE and SPEECH_DEFINITE mode decision */
597*15dc779aSAndroid Build Coastguard Worker 
598*15dc779aSAndroid Build Coastguard Worker   /* ave_n_tonal */
599*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (ave_n_tonal <= 3)) {
600*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = SPEECH_DEFINITE;
601*15dc779aSAndroid Build Coastguard Worker   }
602*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (ave_n_tonal >= 15)) {
603*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC_DEFINITE;
604*15dc779aSAndroid Build Coastguard Worker   }
605*15dc779aSAndroid Build Coastguard Worker 
606*15dc779aSAndroid Build Coastguard Worker   /** ave_n_tonal_short
607*15dc779aSAndroid Build Coastguard Worker    */
608*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (ave_n_tonal_short >= 17)) {
609*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC_DEFINITE;
610*15dc779aSAndroid Build Coastguard Worker   }
611*15dc779aSAndroid Build Coastguard Worker 
612*15dc779aSAndroid Build Coastguard Worker   /** msd_spec_tilt
613*15dc779aSAndroid Build Coastguard Worker    */
614*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (msd_spec_tilt >= 0.01)) {
615*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = SPEECH_DEFINITE;
616*15dc779aSAndroid Build Coastguard Worker   }
617*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (framecnt >= 10) && (msd_spec_tilt <= 0.00004)) {
618*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC_DEFINITE;
619*15dc779aSAndroid Build Coastguard Worker   }
620*15dc779aSAndroid Build Coastguard Worker 
621*15dc779aSAndroid Build Coastguard Worker   /** n_tonal_low_frequency_ratio
622*15dc779aSAndroid Build Coastguard Worker    */
623*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (n_tonal_low_frequency_ratio <= 0.91)) {
624*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC_DEFINITE;
625*15dc779aSAndroid Build Coastguard Worker   }
626*15dc779aSAndroid Build Coastguard Worker 
627*15dc779aSAndroid Build Coastguard Worker   /** MUSIC and SPEECH mode decision
628*15dc779aSAndroid Build Coastguard Worker    */
629*15dc779aSAndroid Build Coastguard Worker 
630*15dc779aSAndroid Build Coastguard Worker   /** msd_spec_tilt
631*15dc779aSAndroid Build Coastguard Worker    */
632*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (msd_spec_tilt <= 0.0002) && (*framecnt_xm >= 15)) {
633*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC;
634*15dc779aSAndroid Build Coastguard Worker   }
635*15dc779aSAndroid Build Coastguard Worker 
636*15dc779aSAndroid Build Coastguard Worker   /** n_tonal_low_frequency_ratio
637*15dc779aSAndroid Build Coastguard Worker    */
638*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (n_tonal_low_frequency_ratio >= 0.95)) {
639*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = SPEECH;
640*15dc779aSAndroid Build Coastguard Worker   }
641*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result == TBD) && (n_tonal_low_frequency_ratio <= 0.935)) {
642*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC;
643*15dc779aSAndroid Build Coastguard Worker   }
644*15dc779aSAndroid Build Coastguard Worker 
645*15dc779aSAndroid Build Coastguard Worker   /** the rest of the frame to SPEECH
646*15dc779aSAndroid Build Coastguard Worker    */
647*15dc779aSAndroid Build Coastguard Worker   if (init_mode_decision_result == TBD) {
648*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = SPEECH;
649*15dc779aSAndroid Build Coastguard Worker   }
650*15dc779aSAndroid Build Coastguard Worker 
651*15dc779aSAndroid Build Coastguard Worker   /** MUSIC mode decision according to changes of the MSD of the spectral tilt
652*15dc779aSAndroid Build Coastguard Worker    */
653*15dc779aSAndroid Build Coastguard Worker 
654*15dc779aSAndroid Build Coastguard Worker   /** compute the changes of the MSD of the spectral tilt
655*15dc779aSAndroid Build Coastguard Worker    */
656*15dc779aSAndroid Build Coastguard Worker   if ((msd_spec_tilt <= 0.007) && (init_mode_decision_result != SPEECH_DEFINITE)) {
657*15dc779aSAndroid Build Coastguard Worker     if (init_mode_decision_result != SPEECH) {
658*15dc779aSAndroid Build Coastguard Worker       count_msd_st_music++;
659*15dc779aSAndroid Build Coastguard Worker     }
660*15dc779aSAndroid Build Coastguard Worker   } else {
661*15dc779aSAndroid Build Coastguard Worker     count_msd_st_music = 0;
662*15dc779aSAndroid Build Coastguard Worker   }
663*15dc779aSAndroid Build Coastguard Worker 
664*15dc779aSAndroid Build Coastguard Worker   if ((init_mode_decision_result != SPEECH_DEFINITE) && (count_msd_st_music >= 400) &&
665*15dc779aSAndroid Build Coastguard Worker       (border_state != BORDER_MUSIC_SPEECH_DEFINITE)) {
666*15dc779aSAndroid Build Coastguard Worker     init_mode_decision_result = MUSIC;
667*15dc779aSAndroid Build Coastguard Worker   }
668*15dc779aSAndroid Build Coastguard Worker 
669*15dc779aSAndroid Build Coastguard Worker   /** update border flag
670*15dc779aSAndroid Build Coastguard Worker    */
671*15dc779aSAndroid Build Coastguard Worker 
672*15dc779aSAndroid Build Coastguard Worker   if (*flag_border != NO_BORDER) {
673*15dc779aSAndroid Build Coastguard Worker     border_state = *flag_border;
674*15dc779aSAndroid Build Coastguard Worker   }
675*15dc779aSAndroid Build Coastguard Worker 
676*15dc779aSAndroid Build Coastguard Worker   /** update BORDER_SPEECH_MUSIC_DEFINITE
677*15dc779aSAndroid Build Coastguard Worker    */
678*15dc779aSAndroid Build Coastguard Worker   if (((border_state == BORDER_MUSIC_SPEECH) || (border_state == BORDER_MUSIC_SPEECH_DEFINITE)) &&
679*15dc779aSAndroid Build Coastguard Worker       (init_mode_decision_result == MUSIC_DEFINITE) && (*framecnt_xm >= 20)) {
680*15dc779aSAndroid Build Coastguard Worker     *flag_border = BORDER_SPEECH_MUSIC_DEFINITE;
681*15dc779aSAndroid Build Coastguard Worker     *framecnt_xm = 10;
682*15dc779aSAndroid Build Coastguard Worker     border_state = *flag_border;
683*15dc779aSAndroid Build Coastguard Worker   }
684*15dc779aSAndroid Build Coastguard Worker 
685*15dc779aSAndroid Build Coastguard Worker   /** update BORDER_MUSIC_SPEECH_DEFINITE
686*15dc779aSAndroid Build Coastguard Worker    */
687*15dc779aSAndroid Build Coastguard Worker   if (((border_state == BORDER_SPEECH_MUSIC) || (border_state == BORDER_SPEECH_MUSIC_DEFINITE)) &&
688*15dc779aSAndroid Build Coastguard Worker       (init_mode_decision_result == SPEECH_DEFINITE) && (*framecnt_xm >= 20)) {
689*15dc779aSAndroid Build Coastguard Worker     *flag_border = BORDER_MUSIC_SPEECH_DEFINITE;
690*15dc779aSAndroid Build Coastguard Worker     *framecnt_xm = 10;
691*15dc779aSAndroid Build Coastguard Worker   }
692*15dc779aSAndroid Build Coastguard Worker 
693*15dc779aSAndroid Build Coastguard Worker   return init_mode_decision_result;
694*15dc779aSAndroid Build Coastguard Worker }
695*15dc779aSAndroid Build Coastguard Worker 
iusace_smoothing_mode_decision(ia_smooth_params_struct * pstr_smooth_param)696*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_smoothing_mode_decision(ia_smooth_params_struct *pstr_smooth_param) {
697*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_init_result_ahead = pstr_smooth_param->init_result_ahead;
698*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_border = pstr_smooth_param->flag_border;
699*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_flag_border_buf_behind = pstr_smooth_param->flag_border_buf_behind;
700*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_flag_border_buf_ahead = pstr_smooth_param->flag_border_buf_ahead;
701*15dc779aSAndroid Build Coastguard Worker   FLOAT32 frame_energy = pstr_smooth_param->frame_energy;
702*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_frame_energy_buf_behind = pstr_smooth_param->frame_energy_buf_behind;
703*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_frame_energy_buf_ahead = pstr_smooth_param->frame_energy_buf_ahead;
704*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_smoothing_result_buf = pstr_smooth_param->smoothing_result_buf;
705*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_init_result_behind = pstr_smooth_param->init_result_behind;
706*15dc779aSAndroid Build Coastguard Worker   WORD32 init_mode_decision_result = pstr_smooth_param->init_mode_decision_result;
707*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
708*15dc779aSAndroid Build Coastguard Worker 
709*15dc779aSAndroid Build Coastguard Worker   WORD32 mode_decision_result;
710*15dc779aSAndroid Build Coastguard Worker 
711*15dc779aSAndroid Build Coastguard Worker   WORD32 num_music, num_speech;
712*15dc779aSAndroid Build Coastguard Worker 
713*15dc779aSAndroid Build Coastguard Worker   /** update data array
714*15dc779aSAndroid Build Coastguard Worker    */
715*15dc779aSAndroid Build Coastguard Worker 
716*15dc779aSAndroid Build Coastguard Worker   /** update init_result_behind, init_result_ahead
717*15dc779aSAndroid Build Coastguard Worker    */
718*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 99; i++) {
719*15dc779aSAndroid Build Coastguard Worker     ptr_init_result_behind[i] = ptr_init_result_behind[i + 1];
720*15dc779aSAndroid Build Coastguard Worker   }
721*15dc779aSAndroid Build Coastguard Worker   ptr_init_result_behind[99] = ptr_init_result_ahead[0];
722*15dc779aSAndroid Build Coastguard Worker 
723*15dc779aSAndroid Build Coastguard Worker   ptr_init_result_ahead[NFRAMEAHEAD - 1] = init_mode_decision_result;
724*15dc779aSAndroid Build Coastguard Worker 
725*15dc779aSAndroid Build Coastguard Worker   /** update flag_border_buf_behind, flag_border_buf_ahead
726*15dc779aSAndroid Build Coastguard Worker    * update frame_energy_buf_behind, frame_energy_buf_ahead
727*15dc779aSAndroid Build Coastguard Worker    */
728*15dc779aSAndroid Build Coastguard Worker 
729*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 9; i++) {
730*15dc779aSAndroid Build Coastguard Worker     ptr_flag_border_buf_behind[i] = ptr_flag_border_buf_behind[i + 1];
731*15dc779aSAndroid Build Coastguard Worker     ptr_frame_energy_buf_behind[i] = ptr_frame_energy_buf_behind[i + 1];
732*15dc779aSAndroid Build Coastguard Worker   }
733*15dc779aSAndroid Build Coastguard Worker   ptr_flag_border_buf_behind[9] = ptr_flag_border_buf_ahead[0];
734*15dc779aSAndroid Build Coastguard Worker   ptr_frame_energy_buf_behind[9] = ptr_frame_energy_buf_ahead[0];
735*15dc779aSAndroid Build Coastguard Worker 
736*15dc779aSAndroid Build Coastguard Worker   ptr_flag_border_buf_ahead[NFRAMEAHEAD - 1] = flag_border;
737*15dc779aSAndroid Build Coastguard Worker 
738*15dc779aSAndroid Build Coastguard Worker   ptr_frame_energy_buf_ahead[NFRAMEAHEAD - 1] = frame_energy;
739*15dc779aSAndroid Build Coastguard Worker 
740*15dc779aSAndroid Build Coastguard Worker   /** smoothing according to past results
741*15dc779aSAndroid Build Coastguard Worker    */
742*15dc779aSAndroid Build Coastguard Worker 
743*15dc779aSAndroid Build Coastguard Worker   mode_decision_result = ptr_init_result_behind[99];
744*15dc779aSAndroid Build Coastguard Worker 
745*15dc779aSAndroid Build Coastguard Worker   /** update smoothing_result_buf
746*15dc779aSAndroid Build Coastguard Worker    */
747*15dc779aSAndroid Build Coastguard Worker   if (ptr_flag_border_buf_behind[9] == NO_BORDER) {
748*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 99; i++) {
749*15dc779aSAndroid Build Coastguard Worker       ptr_smoothing_result_buf[i] = ptr_smoothing_result_buf[i + 1];
750*15dc779aSAndroid Build Coastguard Worker     }
751*15dc779aSAndroid Build Coastguard Worker     pstr_smooth_param->num_smoothing++;
752*15dc779aSAndroid Build Coastguard Worker   } else {
753*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 99; i++) {
754*15dc779aSAndroid Build Coastguard Worker       ptr_smoothing_result_buf[i] = TBD;
755*15dc779aSAndroid Build Coastguard Worker     }
756*15dc779aSAndroid Build Coastguard Worker     pstr_smooth_param->num_smoothing = 1;
757*15dc779aSAndroid Build Coastguard Worker   }
758*15dc779aSAndroid Build Coastguard Worker   ptr_smoothing_result_buf[99] = ptr_init_result_behind[99];
759*15dc779aSAndroid Build Coastguard Worker 
760*15dc779aSAndroid Build Coastguard Worker   if (pstr_smooth_param->num_smoothing >= SMOOTHING_LENGTH) {
761*15dc779aSAndroid Build Coastguard Worker     num_music = 0;
762*15dc779aSAndroid Build Coastguard Worker     num_speech = 0;
763*15dc779aSAndroid Build Coastguard Worker 
764*15dc779aSAndroid Build Coastguard Worker     /** smoothed result count
765*15dc779aSAndroid Build Coastguard Worker      */
766*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < SMOOTHING_LENGTH; i++) {
767*15dc779aSAndroid Build Coastguard Worker       if ((ptr_smoothing_result_buf[100 - i] == SPEECH) ||
768*15dc779aSAndroid Build Coastguard Worker           (ptr_smoothing_result_buf[100 - i] == SPEECH_DEFINITE)) {
769*15dc779aSAndroid Build Coastguard Worker         num_speech++;
770*15dc779aSAndroid Build Coastguard Worker       } else {
771*15dc779aSAndroid Build Coastguard Worker         num_music++;
772*15dc779aSAndroid Build Coastguard Worker       }
773*15dc779aSAndroid Build Coastguard Worker     }
774*15dc779aSAndroid Build Coastguard Worker 
775*15dc779aSAndroid Build Coastguard Worker     /** smoothing
776*15dc779aSAndroid Build Coastguard Worker      */
777*15dc779aSAndroid Build Coastguard Worker     if ((num_speech > num_music) && (init_mode_decision_result != MUSIC_DEFINITE)) {
778*15dc779aSAndroid Build Coastguard Worker       mode_decision_result = SPEECH;
779*15dc779aSAndroid Build Coastguard Worker     }
780*15dc779aSAndroid Build Coastguard Worker     if ((num_music > num_speech) && (init_mode_decision_result != SPEECH_DEFINITE)) {
781*15dc779aSAndroid Build Coastguard Worker       mode_decision_result = MUSIC;
782*15dc779aSAndroid Build Coastguard Worker     }
783*15dc779aSAndroid Build Coastguard Worker   }
784*15dc779aSAndroid Build Coastguard Worker 
785*15dc779aSAndroid Build Coastguard Worker   /** correct according to energies and ahead mode decision results
786*15dc779aSAndroid Build Coastguard Worker    */
787*15dc779aSAndroid Build Coastguard Worker 
788*15dc779aSAndroid Build Coastguard Worker   if ((mode_decision_result == MUSIC) && (ptr_frame_energy_buf_behind[9] <= 60)) {
789*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < NFRAMEAHEAD; i++) {
790*15dc779aSAndroid Build Coastguard Worker       if ((ptr_init_result_ahead[i] == SPEECH_DEFINITE) || (ptr_init_result_ahead[i] == SPEECH)) {
791*15dc779aSAndroid Build Coastguard Worker         pstr_smooth_param->flag_speech_definite = 1;
792*15dc779aSAndroid Build Coastguard Worker       }
793*15dc779aSAndroid Build Coastguard Worker     }
794*15dc779aSAndroid Build Coastguard Worker   }
795*15dc779aSAndroid Build Coastguard Worker   if ((pstr_smooth_param->flag_speech_definite == 1) && (mode_decision_result == MUSIC)) {
796*15dc779aSAndroid Build Coastguard Worker     mode_decision_result = SPEECH;
797*15dc779aSAndroid Build Coastguard Worker   } else {
798*15dc779aSAndroid Build Coastguard Worker     pstr_smooth_param->flag_speech_definite = 0;
799*15dc779aSAndroid Build Coastguard Worker   }
800*15dc779aSAndroid Build Coastguard Worker 
801*15dc779aSAndroid Build Coastguard Worker   /** correct MUSIC mode
802*15dc779aSAndroid Build Coastguard Worker    */
803*15dc779aSAndroid Build Coastguard Worker 
804*15dc779aSAndroid Build Coastguard Worker   if (ptr_frame_energy_buf_behind[9] <= 65) {
805*15dc779aSAndroid Build Coastguard Worker     pstr_smooth_param->count_small_energy = 0;
806*15dc779aSAndroid Build Coastguard Worker   } else {
807*15dc779aSAndroid Build Coastguard Worker     pstr_smooth_param->count_small_energy++;
808*15dc779aSAndroid Build Coastguard Worker   }
809*15dc779aSAndroid Build Coastguard Worker   if (((ptr_flag_border_buf_ahead[NFRAMEAHEAD - 1] == BORDER_SPEECH_MUSIC) ||
810*15dc779aSAndroid Build Coastguard Worker        (ptr_flag_border_buf_ahead[NFRAMEAHEAD - 1] == BORDER_SPEECH_MUSIC_DEFINITE)) &&
811*15dc779aSAndroid Build Coastguard Worker       (pstr_smooth_param->count_small_energy <= 30)) {
812*15dc779aSAndroid Build Coastguard Worker     pstr_smooth_param->flag_music_definite = 1;
813*15dc779aSAndroid Build Coastguard Worker   }
814*15dc779aSAndroid Build Coastguard Worker   if ((pstr_smooth_param->flag_music_definite == 1) &&
815*15dc779aSAndroid Build Coastguard Worker       ((mode_decision_result == SPEECH) || (mode_decision_result == SPEECH_DEFINITE))) {
816*15dc779aSAndroid Build Coastguard Worker     mode_decision_result = MUSIC;
817*15dc779aSAndroid Build Coastguard Worker   } else {
818*15dc779aSAndroid Build Coastguard Worker     pstr_smooth_param->flag_music_definite = 0;
819*15dc779aSAndroid Build Coastguard Worker   }
820*15dc779aSAndroid Build Coastguard Worker 
821*15dc779aSAndroid Build Coastguard Worker   return mode_decision_result;
822*15dc779aSAndroid Build Coastguard Worker }
823*15dc779aSAndroid Build Coastguard Worker 
iusace_classification_ccfl(ia_classification_struct * pstr_sig_class,FLOAT32 * ptr_time_signal,iusace_scratch_mem * pstr_scratch,WORD32 ccfl)824*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_classification_ccfl(ia_classification_struct *pstr_sig_class,
825*15dc779aSAndroid Build Coastguard Worker                                          FLOAT32 *ptr_time_signal,
826*15dc779aSAndroid Build Coastguard Worker                                          iusace_scratch_mem *pstr_scratch, WORD32 ccfl) {
827*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
828*15dc779aSAndroid Build Coastguard Worker   ia_tonal_params_struct pstr_ton_params;
829*15dc779aSAndroid Build Coastguard Worker   ia_smooth_params_struct smooth_param;
830*15dc779aSAndroid Build Coastguard Worker   ia_mode_params_struct pstr_mode_params;
831*15dc779aSAndroid Build Coastguard Worker   ia_spec_tilt_params_struct ptr_spec_params;
832*15dc779aSAndroid Build Coastguard Worker 
833*15dc779aSAndroid Build Coastguard Worker   ia_classification_buf_struct *pstr_buffers = &(pstr_sig_class->buffers);
834*15dc779aSAndroid Build Coastguard Worker   pFLOAT32 spec_tilt_buf = pstr_sig_class->spec_tilt_buf;
835*15dc779aSAndroid Build Coastguard Worker   pWORD32 n_tonal = pstr_sig_class->n_tonal;
836*15dc779aSAndroid Build Coastguard Worker   pWORD32 n_tonal_low_frequency = pstr_sig_class->n_tonal_low_frequency;
837*15dc779aSAndroid Build Coastguard Worker   pWORD32 framecnt_xm = &(pstr_sig_class->framecnt_xm);
838*15dc779aSAndroid Build Coastguard Worker   pWORD32 framecnt = &(pstr_sig_class->framecnt);
839*15dc779aSAndroid Build Coastguard Worker   pFLOAT32 ave_n_tonal_short_buf = pstr_sig_class->ave_n_tonal_short_buf;
840*15dc779aSAndroid Build Coastguard Worker   pFLOAT32 ave_n_tonal_buf = pstr_sig_class->ave_n_tonal_buf;
841*15dc779aSAndroid Build Coastguard Worker   pFLOAT32 msd_spec_tilt_buf = pstr_sig_class->msd_spec_tilt_buf;
842*15dc779aSAndroid Build Coastguard Worker   pFLOAT32 msd_spec_tilt_short_buf = pstr_sig_class->msd_spec_tilt_short_buf;
843*15dc779aSAndroid Build Coastguard Worker 
844*15dc779aSAndroid Build Coastguard Worker   FLOAT32 n_tonal_low_frequency_ratio;    /* the ratio of distribution of the numbers */
845*15dc779aSAndroid Build Coastguard Worker                                           /* of tonal in the low frequency domain     */
846*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_n_tonal, ave_n_tonal_short; /**< the number of tonal */
847*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt;                  /* the long-term MSD of spectral tilt */
848*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt_short;            /* the short-term MSD of spectral tilt */
849*15dc779aSAndroid Build Coastguard Worker 
850*15dc779aSAndroid Build Coastguard Worker   WORD32 init_mode_decision_result; /* the initial mode decision */
851*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_border = NO_BORDER;   /* flag of current border */
852*15dc779aSAndroid Build Coastguard Worker 
853*15dc779aSAndroid Build Coastguard Worker   WORD32 mode_decision_result; /* final mode decision result */
854*15dc779aSAndroid Build Coastguard Worker 
855*15dc779aSAndroid Build Coastguard Worker   if (pstr_sig_class->init_flag == 0) {
856*15dc779aSAndroid Build Coastguard Worker     /* initialize */
857*15dc779aSAndroid Build Coastguard Worker     pstr_sig_class->init_flag = 1;
858*15dc779aSAndroid Build Coastguard Worker 
859*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
860*15dc779aSAndroid Build Coastguard Worker       n_tonal[i] = 0;
861*15dc779aSAndroid Build Coastguard Worker       n_tonal_low_frequency[i] = 0;
862*15dc779aSAndroid Build Coastguard Worker       spec_tilt_buf[i] = 0;
863*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->init_result_behind[i] = TBD;
864*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->smoothing_result_buf[i] = TBD;
865*15dc779aSAndroid Build Coastguard Worker 
866*15dc779aSAndroid Build Coastguard Worker       ave_n_tonal_short_buf[i] = 0;
867*15dc779aSAndroid Build Coastguard Worker       ave_n_tonal_buf[i] = 0;
868*15dc779aSAndroid Build Coastguard Worker       msd_spec_tilt_buf[i] = 0;
869*15dc779aSAndroid Build Coastguard Worker       msd_spec_tilt_short_buf[i] = 0;
870*15dc779aSAndroid Build Coastguard Worker 
871*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->frame_energy_buf_behind[i] = 0;
872*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->flag_border_buf_behind[i] = NO_BORDER;
873*15dc779aSAndroid Build Coastguard Worker     }
874*15dc779aSAndroid Build Coastguard Worker     for (; i < 10; i++) {
875*15dc779aSAndroid Build Coastguard Worker       n_tonal[i] = 0;
876*15dc779aSAndroid Build Coastguard Worker       n_tonal_low_frequency[i] = 0;
877*15dc779aSAndroid Build Coastguard Worker       spec_tilt_buf[i] = 0;
878*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->init_result_behind[i] = TBD;
879*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->smoothing_result_buf[i] = TBD;
880*15dc779aSAndroid Build Coastguard Worker 
881*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->frame_energy_buf_behind[i] = 0;
882*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->flag_border_buf_behind[i] = NO_BORDER;
883*15dc779aSAndroid Build Coastguard Worker     }
884*15dc779aSAndroid Build Coastguard Worker 
885*15dc779aSAndroid Build Coastguard Worker     for (; i < 100; i++) {
886*15dc779aSAndroid Build Coastguard Worker       n_tonal[i] = 0;
887*15dc779aSAndroid Build Coastguard Worker       n_tonal_low_frequency[i] = 0;
888*15dc779aSAndroid Build Coastguard Worker       spec_tilt_buf[i] = 0;
889*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->init_result_behind[i] = TBD;
890*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->smoothing_result_buf[i] = TBD;
891*15dc779aSAndroid Build Coastguard Worker     }
892*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < NFRAMEAHEAD; i++) {
893*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->frame_energy_buf_ahead[i] = 0;
894*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->flag_border_buf_ahead[i] = NO_BORDER;
895*15dc779aSAndroid Build Coastguard Worker       pstr_buffers->init_result_ahead[i] = TBD;
896*15dc779aSAndroid Build Coastguard Worker     }
897*15dc779aSAndroid Build Coastguard Worker   }
898*15dc779aSAndroid Build Coastguard Worker 
899*15dc779aSAndroid Build Coastguard Worker   *framecnt += 1;
900*15dc779aSAndroid Build Coastguard Worker   *framecnt_xm += 1;
901*15dc779aSAndroid Build Coastguard Worker 
902*15dc779aSAndroid Build Coastguard Worker   pstr_ton_params.time_signal = (FLOAT32 *)ptr_time_signal;
903*15dc779aSAndroid Build Coastguard Worker   pstr_ton_params.framecnt_xm = *framecnt_xm;
904*15dc779aSAndroid Build Coastguard Worker   pstr_ton_params.n_tonal = n_tonal;
905*15dc779aSAndroid Build Coastguard Worker   pstr_ton_params.n_tonal_low_frequency = n_tonal_low_frequency;
906*15dc779aSAndroid Build Coastguard Worker   pstr_ton_params.n_tonal_low_frequency_ratio = &n_tonal_low_frequency_ratio;
907*15dc779aSAndroid Build Coastguard Worker   pstr_ton_params.ave_n_tonal = &ave_n_tonal;
908*15dc779aSAndroid Build Coastguard Worker   pstr_ton_params.ave_n_tonal_short = &ave_n_tonal_short;
909*15dc779aSAndroid Build Coastguard Worker   /** analysis tonal
910*15dc779aSAndroid Build Coastguard Worker    */
911*15dc779aSAndroid Build Coastguard Worker   iusace_tonal_analysis(&pstr_ton_params, pstr_scratch, ccfl);
912*15dc779aSAndroid Build Coastguard Worker 
913*15dc779aSAndroid Build Coastguard Worker   ptr_spec_params.time_signal = ptr_time_signal;
914*15dc779aSAndroid Build Coastguard Worker   ptr_spec_params.framecnt_xm = *framecnt_xm;
915*15dc779aSAndroid Build Coastguard Worker   ptr_spec_params.spec_tilt_buf = spec_tilt_buf;
916*15dc779aSAndroid Build Coastguard Worker   ptr_spec_params.msd_spec_tilt = &msd_spec_tilt;
917*15dc779aSAndroid Build Coastguard Worker   ptr_spec_params.msd_spec_tilt_short = &msd_spec_tilt_short;
918*15dc779aSAndroid Build Coastguard Worker   /** analysis spectral tilt
919*15dc779aSAndroid Build Coastguard Worker    */
920*15dc779aSAndroid Build Coastguard Worker   iusace_spectral_tilt_analysis(&ptr_spec_params, ccfl);
921*15dc779aSAndroid Build Coastguard Worker 
922*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.framecnt = *framecnt;
923*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.framecnt_xm = framecnt_xm;
924*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.flag_border = &flag_border;
925*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.ave_n_tonal_short = ave_n_tonal_short;
926*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.ave_n_tonal = ave_n_tonal;
927*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.ave_n_tonal_short_buf = ave_n_tonal_short_buf;
928*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.ave_n_tonal_buf = ave_n_tonal_buf;
929*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.msd_spec_tilt = msd_spec_tilt;
930*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.msd_spec_tilt_short = msd_spec_tilt_short;
931*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.msd_spec_tilt_buf = msd_spec_tilt_buf;
932*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.msd_spec_tilt_short_buf = msd_spec_tilt_short_buf;
933*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.n_tonal_low_frequency_ratio = n_tonal_low_frequency_ratio;
934*15dc779aSAndroid Build Coastguard Worker   pstr_mode_params.frame_energy = ptr_spec_params.frame_energy;
935*15dc779aSAndroid Build Coastguard Worker   /** initial mode decision and boundary decisions
936*15dc779aSAndroid Build Coastguard Worker    */
937*15dc779aSAndroid Build Coastguard Worker   init_mode_decision_result = iusace_init_mode_decision(&pstr_mode_params);
938*15dc779aSAndroid Build Coastguard Worker 
939*15dc779aSAndroid Build Coastguard Worker   smooth_param.flag_border_buf_behind = pstr_buffers->flag_border_buf_behind;
940*15dc779aSAndroid Build Coastguard Worker   smooth_param.flag_border_buf_ahead = pstr_buffers->flag_border_buf_ahead;
941*15dc779aSAndroid Build Coastguard Worker   smooth_param.frame_energy = ptr_spec_params.frame_energy;
942*15dc779aSAndroid Build Coastguard Worker   smooth_param.frame_energy_buf_behind = pstr_buffers->frame_energy_buf_behind;
943*15dc779aSAndroid Build Coastguard Worker   smooth_param.frame_energy_buf_ahead = pstr_buffers->frame_energy_buf_ahead;
944*15dc779aSAndroid Build Coastguard Worker   smooth_param.smoothing_result_buf = pstr_buffers->smoothing_result_buf;
945*15dc779aSAndroid Build Coastguard Worker   smooth_param.init_result_ahead = pstr_buffers->init_result_ahead;
946*15dc779aSAndroid Build Coastguard Worker   smooth_param.flag_border = flag_border;
947*15dc779aSAndroid Build Coastguard Worker   smooth_param.init_result_behind = pstr_buffers->init_result_behind;
948*15dc779aSAndroid Build Coastguard Worker   smooth_param.init_mode_decision_result = init_mode_decision_result;
949*15dc779aSAndroid Build Coastguard Worker   smooth_param.flag_speech_definite = 0;
950*15dc779aSAndroid Build Coastguard Worker   smooth_param.count_small_energy = 0;
951*15dc779aSAndroid Build Coastguard Worker   smooth_param.flag_music_definite = 0;
952*15dc779aSAndroid Build Coastguard Worker   smooth_param.num_smoothing = 0;
953*15dc779aSAndroid Build Coastguard Worker   /* smoothing */
954*15dc779aSAndroid Build Coastguard Worker   mode_decision_result = iusace_smoothing_mode_decision(&smooth_param);
955*15dc779aSAndroid Build Coastguard Worker 
956*15dc779aSAndroid Build Coastguard Worker   return mode_decision_result;
957*15dc779aSAndroid Build Coastguard Worker }
958*15dc779aSAndroid Build Coastguard Worker 
iusace_classification(ia_classification_struct * pstr_sig_class,iusace_scratch_mem * pstr_scratch,WORD32 ccfl)959*15dc779aSAndroid Build Coastguard Worker VOID iusace_classification(ia_classification_struct *pstr_sig_class,
960*15dc779aSAndroid Build Coastguard Worker                            iusace_scratch_mem *pstr_scratch, WORD32 ccfl) {
961*15dc779aSAndroid Build Coastguard Worker   WORD32 n_frames, n_class, avg_cls, nf;
962*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
963*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_time_signal = pstr_scratch->p_time_signal;
964*15dc779aSAndroid Build Coastguard Worker   WORD32 mode_decision_result;
965*15dc779aSAndroid Build Coastguard Worker 
966*15dc779aSAndroid Build Coastguard Worker   n_frames = pstr_sig_class->n_buffer_samples / ccfl;
967*15dc779aSAndroid Build Coastguard Worker 
968*15dc779aSAndroid Build Coastguard Worker   for (nf = 0; nf < n_frames; nf++) {
969*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ccfl; i++) {
970*15dc779aSAndroid Build Coastguard Worker       ptr_time_signal[i] = pstr_sig_class->input_samples[ccfl * nf + i];
971*15dc779aSAndroid Build Coastguard Worker     }
972*15dc779aSAndroid Build Coastguard Worker 
973*15dc779aSAndroid Build Coastguard Worker     /* classification of ccfl-frame */
974*15dc779aSAndroid Build Coastguard Worker     mode_decision_result =
975*15dc779aSAndroid Build Coastguard Worker         iusace_classification_ccfl(pstr_sig_class, ptr_time_signal, pstr_scratch, ccfl);
976*15dc779aSAndroid Build Coastguard Worker 
977*15dc779aSAndroid Build Coastguard Worker     /* coding mode decision of 1024-frame */
978*15dc779aSAndroid Build Coastguard Worker     if ((mode_decision_result == MUSIC) || (mode_decision_result == MUSIC_DEFINITE)) {
979*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->coding_mode = FD_MODE;
980*15dc779aSAndroid Build Coastguard Worker     } else if ((mode_decision_result == SPEECH) || (mode_decision_result == SPEECH_DEFINITE)) {
981*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->coding_mode = TD_MODE;
982*15dc779aSAndroid Build Coastguard Worker     }
983*15dc779aSAndroid Build Coastguard Worker 
984*15dc779aSAndroid Build Coastguard Worker     pstr_sig_class->class_buf[pstr_sig_class->n_buf_class + nf] = pstr_sig_class->coding_mode;
985*15dc779aSAndroid Build Coastguard Worker     pstr_sig_class->pre_mode = pstr_sig_class->coding_mode;
986*15dc779aSAndroid Build Coastguard Worker   }
987*15dc779aSAndroid Build Coastguard Worker 
988*15dc779aSAndroid Build Coastguard Worker   /* merge ccfl-frame results */
989*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->n_buf_class += n_frames;
990*15dc779aSAndroid Build Coastguard Worker   n_class = (pstr_sig_class->n_class_frames > pstr_sig_class->n_buf_class)
991*15dc779aSAndroid Build Coastguard Worker                 ? pstr_sig_class->n_buf_class
992*15dc779aSAndroid Build Coastguard Worker                 : pstr_sig_class->n_class_frames;
993*15dc779aSAndroid Build Coastguard Worker   {
994*15dc779aSAndroid Build Coastguard Worker     WORD32 min_cls, max_cls;
995*15dc779aSAndroid Build Coastguard Worker 
996*15dc779aSAndroid Build Coastguard Worker     min_cls = max_cls = pstr_sig_class->class_buf[0];
997*15dc779aSAndroid Build Coastguard Worker     for (i = 1; i < n_class; i++) {
998*15dc779aSAndroid Build Coastguard Worker       if (pstr_sig_class->class_buf[i] > max_cls) {
999*15dc779aSAndroid Build Coastguard Worker         max_cls = pstr_sig_class->class_buf[i];
1000*15dc779aSAndroid Build Coastguard Worker       } else if (pstr_sig_class->class_buf[i] < min_cls) {
1001*15dc779aSAndroid Build Coastguard Worker         min_cls = pstr_sig_class->class_buf[i];
1002*15dc779aSAndroid Build Coastguard Worker       }
1003*15dc779aSAndroid Build Coastguard Worker     }
1004*15dc779aSAndroid Build Coastguard Worker 
1005*15dc779aSAndroid Build Coastguard Worker     avg_cls = 0;
1006*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < n_class; i++) {
1007*15dc779aSAndroid Build Coastguard Worker       if (pstr_sig_class->class_buf[i] == max_cls) {
1008*15dc779aSAndroid Build Coastguard Worker         avg_cls += 1;
1009*15dc779aSAndroid Build Coastguard Worker       }
1010*15dc779aSAndroid Build Coastguard Worker       if (pstr_sig_class->class_buf[i] == min_cls) {
1011*15dc779aSAndroid Build Coastguard Worker         avg_cls += -1;
1012*15dc779aSAndroid Build Coastguard Worker       }
1013*15dc779aSAndroid Build Coastguard Worker     }
1014*15dc779aSAndroid Build Coastguard Worker 
1015*15dc779aSAndroid Build Coastguard Worker     if (avg_cls > 0) {
1016*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->coding_mode = max_cls;
1017*15dc779aSAndroid Build Coastguard Worker     } else {
1018*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->coding_mode = min_cls;
1019*15dc779aSAndroid Build Coastguard Worker     }
1020*15dc779aSAndroid Build Coastguard Worker   }
1021*15dc779aSAndroid Build Coastguard Worker 
1022*15dc779aSAndroid Build Coastguard Worker   /* shift, save pre_mode and unused class */
1023*15dc779aSAndroid Build Coastguard Worker   if (n_class > 0) {
1024*15dc779aSAndroid Build Coastguard Worker     pstr_sig_class->pre_mode = pstr_sig_class->class_buf[n_class - 1];
1025*15dc779aSAndroid Build Coastguard Worker   }
1026*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->n_buf_class -= n_class;
1027*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->n_buffer_samples -= ccfl * n_frames;
1028*15dc779aSAndroid Build Coastguard Worker 
1029*15dc779aSAndroid Build Coastguard Worker   WORD32 minimum = MIN(pstr_sig_class->n_buf_class, pstr_sig_class->n_buffer_samples);
1030*15dc779aSAndroid Build Coastguard Worker   if (minimum == pstr_sig_class->n_buf_class) {
1031*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < minimum; i++) {
1032*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->class_buf[i] = pstr_sig_class->class_buf[i + n_class];
1033*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->input_samples[i] = pstr_sig_class->input_samples[i + ccfl * n_frames];
1034*15dc779aSAndroid Build Coastguard Worker     }
1035*15dc779aSAndroid Build Coastguard Worker 
1036*15dc779aSAndroid Build Coastguard Worker     /* shift, save unused samples */
1037*15dc779aSAndroid Build Coastguard Worker     for (; i < pstr_sig_class->n_buffer_samples; i++) {
1038*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->input_samples[i] = pstr_sig_class->input_samples[i + ccfl * n_frames];
1039*15dc779aSAndroid Build Coastguard Worker     }
1040*15dc779aSAndroid Build Coastguard Worker   } else {
1041*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < minimum; i++) {
1042*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->class_buf[i] = pstr_sig_class->class_buf[i + n_class];
1043*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->input_samples[i] = pstr_sig_class->input_samples[i + ccfl * n_frames];
1044*15dc779aSAndroid Build Coastguard Worker     }
1045*15dc779aSAndroid Build Coastguard Worker 
1046*15dc779aSAndroid Build Coastguard Worker     /* shift, save unused samples */
1047*15dc779aSAndroid Build Coastguard Worker     for (; i < pstr_sig_class->n_buf_class; i++) {
1048*15dc779aSAndroid Build Coastguard Worker       pstr_sig_class->class_buf[i] = pstr_sig_class->class_buf[i + n_class];
1049*15dc779aSAndroid Build Coastguard Worker     }
1050*15dc779aSAndroid Build Coastguard Worker   }
1051*15dc779aSAndroid Build Coastguard Worker }
1052*15dc779aSAndroid Build Coastguard Worker 
iusace_init_classification(ia_classification_struct * pstr_sig_class)1053*15dc779aSAndroid Build Coastguard Worker VOID iusace_init_classification(ia_classification_struct *pstr_sig_class) {
1054*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->pre_mode = FD_MODE;
1055*15dc779aSAndroid Build Coastguard Worker 
1056*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->n_buffer_samples = 0;
1057*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->input_samples, 0, 3840 * 2 * sizeof(FLOAT32));
1058*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->n_class_frames = 2;
1059*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->n_buf_class = 0;
1060*15dc779aSAndroid Build Coastguard Worker 
1061*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->is_switch_mode = 1;
1062*15dc779aSAndroid Build Coastguard Worker 
1063*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->framecnt = 0;
1064*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->init_flag = 0;
1065*15dc779aSAndroid Build Coastguard Worker   pstr_sig_class->framecnt_xm = 0;
1066*15dc779aSAndroid Build Coastguard Worker 
1067*15dc779aSAndroid Build Coastguard Worker   memset(&pstr_sig_class->buffers, 0, sizeof(ia_classification_buf_struct));
1068*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->spec_tilt_buf, 0, sizeof(FLOAT32) * 100);
1069*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->n_tonal, 0, sizeof(WORD32) * 100);
1070*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->n_tonal_low_frequency, 0, sizeof(WORD32) * 100);
1071*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->msd_spec_tilt_buf, 0, sizeof(FLOAT32) * 5);
1072*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->msd_spec_tilt_short_buf, 0, sizeof(FLOAT32) * 5);
1073*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->ave_n_tonal_short_buf, 0, sizeof(FLOAT32) * 5);
1074*15dc779aSAndroid Build Coastguard Worker   memset(pstr_sig_class->ave_n_tonal_buf, 0, sizeof(FLOAT32) * 5);
1075*15dc779aSAndroid Build Coastguard Worker   return;
1076*15dc779aSAndroid Build Coastguard Worker }
1077