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
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
27*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
28*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
30*15dc779aSAndroid Build Coastguard Worker
31*15dc779aSAndroid Build Coastguard Worker /* DRC */
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
35*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
36*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
37*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
38*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
39*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
40*15dc779aSAndroid Build Coastguard Worker
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
43*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
45*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_utils.h"
46*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_util.h"
47*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_adjthr.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
50*15dc779aSAndroid Build Coastguard Worker
51*15dc779aSAndroid Build Coastguard Worker extern ia_sfb_info_struct iusace_sfb_info_1024[12];
52*15dc779aSAndroid Build Coastguard Worker extern ia_sfb_info_struct iusace_sfb_info_768[12];
53*15dc779aSAndroid Build Coastguard Worker
54*15dc779aSAndroid Build Coastguard Worker static const FLOAT32 iusace_bark_quiet_thr_val[] = {
55*15dc779aSAndroid Build Coastguard Worker 15.0f, 10.0f, 7.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
56*15dc779aSAndroid Build Coastguard Worker 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3.0f, 5.0f, 10.0f, 20.0f, 30.0f};
57*15dc779aSAndroid Build Coastguard Worker
iusace_calc_band_energy(const FLOAT64 * ptr_spec_coeffs,const WORD32 * band_offset,const WORD32 num_bands,FLOAT32 * ptr_band_energy,WORD32 sfb_count)58*15dc779aSAndroid Build Coastguard Worker VOID iusace_calc_band_energy(const FLOAT64 *ptr_spec_coeffs, const WORD32 *band_offset,
59*15dc779aSAndroid Build Coastguard Worker const WORD32 num_bands, FLOAT32 *ptr_band_energy, WORD32 sfb_count) {
60*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
61*15dc779aSAndroid Build Coastguard Worker
62*15dc779aSAndroid Build Coastguard Worker j = 0;
63*15dc779aSAndroid Build Coastguard Worker memset(ptr_band_energy, 0, sfb_count * sizeof(FLOAT32));
64*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_bands; i++) {
65*15dc779aSAndroid Build Coastguard Worker while (j < band_offset[i + 1]) {
66*15dc779aSAndroid Build Coastguard Worker ptr_band_energy[i] += (FLOAT32)(ptr_spec_coeffs[j] * ptr_spec_coeffs[j]);
67*15dc779aSAndroid Build Coastguard Worker j++;
68*15dc779aSAndroid Build Coastguard Worker }
69*15dc779aSAndroid Build Coastguard Worker }
70*15dc779aSAndroid Build Coastguard Worker return;
71*15dc779aSAndroid Build Coastguard Worker }
72*15dc779aSAndroid Build Coastguard Worker
iusace_find_max_spreading(const WORD32 sfb_count,const FLOAT32 * ptr_mask_low_fac,const FLOAT32 * ptr_mask_high_fac,FLOAT32 * ptr_spreaded_enegry)73*15dc779aSAndroid Build Coastguard Worker VOID iusace_find_max_spreading(const WORD32 sfb_count, const FLOAT32 *ptr_mask_low_fac,
74*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_mask_high_fac, FLOAT32 *ptr_spreaded_enegry) {
75*15dc779aSAndroid Build Coastguard Worker WORD32 i;
76*15dc779aSAndroid Build Coastguard Worker
77*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < sfb_count; i++) {
78*15dc779aSAndroid Build Coastguard Worker ptr_spreaded_enegry[i] =
79*15dc779aSAndroid Build Coastguard Worker MAX(ptr_spreaded_enegry[i], ptr_mask_high_fac[i] * ptr_spreaded_enegry[i - 1]);
80*15dc779aSAndroid Build Coastguard Worker }
81*15dc779aSAndroid Build Coastguard Worker
82*15dc779aSAndroid Build Coastguard Worker for (i = sfb_count - 2; i >= 0; i--) {
83*15dc779aSAndroid Build Coastguard Worker ptr_spreaded_enegry[i] =
84*15dc779aSAndroid Build Coastguard Worker MAX(ptr_spreaded_enegry[i], ptr_mask_low_fac[i] * ptr_spreaded_enegry[i + 1]);
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker return;
87*15dc779aSAndroid Build Coastguard Worker }
88*15dc779aSAndroid Build Coastguard Worker
iusace_pre_echo_control(FLOAT32 * ptr_thr_nm1,WORD32 sfb_count,FLOAT32 max_allowed_inc_fac,FLOAT32 min_remaining_thr_fac,FLOAT32 * ptr_threshold)89*15dc779aSAndroid Build Coastguard Worker VOID iusace_pre_echo_control(FLOAT32 *ptr_thr_nm1, WORD32 sfb_count, FLOAT32 max_allowed_inc_fac,
90*15dc779aSAndroid Build Coastguard Worker FLOAT32 min_remaining_thr_fac, FLOAT32 *ptr_threshold) {
91*15dc779aSAndroid Build Coastguard Worker WORD32 i;
92*15dc779aSAndroid Build Coastguard Worker FLOAT32 thr1, thr2;
93*15dc779aSAndroid Build Coastguard Worker
94*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < sfb_count; i++) {
95*15dc779aSAndroid Build Coastguard Worker thr1 = max_allowed_inc_fac * (ptr_thr_nm1[i]);
96*15dc779aSAndroid Build Coastguard Worker thr2 = min_remaining_thr_fac * ptr_threshold[i];
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker ptr_thr_nm1[i] = ptr_threshold[i];
99*15dc779aSAndroid Build Coastguard Worker
100*15dc779aSAndroid Build Coastguard Worker if (ptr_threshold[i] > thr1) {
101*15dc779aSAndroid Build Coastguard Worker ptr_threshold[i] = thr1;
102*15dc779aSAndroid Build Coastguard Worker }
103*15dc779aSAndroid Build Coastguard Worker if (thr2 > ptr_threshold[i]) {
104*15dc779aSAndroid Build Coastguard Worker ptr_threshold[i] = thr2;
105*15dc779aSAndroid Build Coastguard Worker }
106*15dc779aSAndroid Build Coastguard Worker }
107*15dc779aSAndroid Build Coastguard Worker return;
108*15dc779aSAndroid Build Coastguard Worker }
109*15dc779aSAndroid Build Coastguard Worker
iusace_sfb_init(WORD32 sample_rate,WORD32 block_type,WORD32 * ptr_sfb_offset,WORD32 * ptr_sfb_count,WORD32 ccfl)110*15dc779aSAndroid Build Coastguard Worker static VOID iusace_sfb_init(WORD32 sample_rate, WORD32 block_type, WORD32 *ptr_sfb_offset,
111*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_sfb_count, WORD32 ccfl) {
112*15dc779aSAndroid Build Coastguard Worker const WORD16 *ptr_sfb_params = 0;
113*15dc779aSAndroid Build Coastguard Worker WORD32 start_offset, block_len = 0;
114*15dc779aSAndroid Build Coastguard Worker const ia_sfb_info_struct *pstr_sfb_info_tbls = &iusace_sfb_info_1024[0];
115*15dc779aSAndroid Build Coastguard Worker WORD32 sampling_rate_mapped = iusace_map_sample_rate(sample_rate);
116*15dc779aSAndroid Build Coastguard Worker WORD16 prev_val = 0;
117*15dc779aSAndroid Build Coastguard Worker if (ccfl == LEN_SUPERFRAME_768) {
118*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info_tbls = &iusace_sfb_info_768[0];
119*15dc779aSAndroid Build Coastguard Worker }
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker
122*15dc779aSAndroid Build Coastguard Worker if (block_type == ONLY_LONG_SEQUENCE) {
123*15dc779aSAndroid Build Coastguard Worker block_len = ccfl;
124*15dc779aSAndroid Build Coastguard Worker switch (sampling_rate_mapped) {
125*15dc779aSAndroid Build Coastguard Worker case 96000:
126*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[11].cb_offset_long;
127*15dc779aSAndroid Build Coastguard Worker break;
128*15dc779aSAndroid Build Coastguard Worker case 88200:
129*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[10].cb_offset_long;
130*15dc779aSAndroid Build Coastguard Worker break;
131*15dc779aSAndroid Build Coastguard Worker case 64000:
132*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[9].cb_offset_long;
133*15dc779aSAndroid Build Coastguard Worker break;
134*15dc779aSAndroid Build Coastguard Worker case 48000:
135*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[8].cb_offset_long;
136*15dc779aSAndroid Build Coastguard Worker break;
137*15dc779aSAndroid Build Coastguard Worker case 44100:
138*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[7].cb_offset_long;
139*15dc779aSAndroid Build Coastguard Worker break;
140*15dc779aSAndroid Build Coastguard Worker case 32000:
141*15dc779aSAndroid Build Coastguard Worker case 29400:
142*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[6].cb_offset_long;
143*15dc779aSAndroid Build Coastguard Worker break;
144*15dc779aSAndroid Build Coastguard Worker case 24000:
145*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[5].cb_offset_long;
146*15dc779aSAndroid Build Coastguard Worker break;
147*15dc779aSAndroid Build Coastguard Worker case 22050:
148*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[4].cb_offset_long;
149*15dc779aSAndroid Build Coastguard Worker break;
150*15dc779aSAndroid Build Coastguard Worker case 16000:
151*15dc779aSAndroid Build Coastguard Worker case 14700:
152*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[3].cb_offset_long;
153*15dc779aSAndroid Build Coastguard Worker break;
154*15dc779aSAndroid Build Coastguard Worker case 12000:
155*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[2].cb_offset_long;
156*15dc779aSAndroid Build Coastguard Worker break;
157*15dc779aSAndroid Build Coastguard Worker case 11025:
158*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[1].cb_offset_long;
159*15dc779aSAndroid Build Coastguard Worker break;
160*15dc779aSAndroid Build Coastguard Worker case 8000:
161*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[0].cb_offset_long;
162*15dc779aSAndroid Build Coastguard Worker break;
163*15dc779aSAndroid Build Coastguard Worker default:
164*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[8].cb_offset_long;
165*15dc779aSAndroid Build Coastguard Worker break;
166*15dc779aSAndroid Build Coastguard Worker }
167*15dc779aSAndroid Build Coastguard Worker } else {
168*15dc779aSAndroid Build Coastguard Worker block_len = ccfl >> 3;
169*15dc779aSAndroid Build Coastguard Worker switch (sampling_rate_mapped) {
170*15dc779aSAndroid Build Coastguard Worker case 96000:
171*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[11].cb_offset_short;
172*15dc779aSAndroid Build Coastguard Worker break;
173*15dc779aSAndroid Build Coastguard Worker case 88200:
174*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[10].cb_offset_short;
175*15dc779aSAndroid Build Coastguard Worker break;
176*15dc779aSAndroid Build Coastguard Worker case 64000:
177*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[9].cb_offset_short;
178*15dc779aSAndroid Build Coastguard Worker break;
179*15dc779aSAndroid Build Coastguard Worker case 48000:
180*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[8].cb_offset_short;
181*15dc779aSAndroid Build Coastguard Worker break;
182*15dc779aSAndroid Build Coastguard Worker case 44100:
183*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[7].cb_offset_short;
184*15dc779aSAndroid Build Coastguard Worker break;
185*15dc779aSAndroid Build Coastguard Worker case 32000:
186*15dc779aSAndroid Build Coastguard Worker case 29400:
187*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[6].cb_offset_short;
188*15dc779aSAndroid Build Coastguard Worker break;
189*15dc779aSAndroid Build Coastguard Worker case 24000:
190*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[5].cb_offset_short;
191*15dc779aSAndroid Build Coastguard Worker break;
192*15dc779aSAndroid Build Coastguard Worker case 22050:
193*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[4].cb_offset_short;
194*15dc779aSAndroid Build Coastguard Worker break;
195*15dc779aSAndroid Build Coastguard Worker case 16000:
196*15dc779aSAndroid Build Coastguard Worker case 14700:
197*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[3].cb_offset_short;
198*15dc779aSAndroid Build Coastguard Worker break;
199*15dc779aSAndroid Build Coastguard Worker case 12000:
200*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[2].cb_offset_short;
201*15dc779aSAndroid Build Coastguard Worker break;
202*15dc779aSAndroid Build Coastguard Worker case 11025:
203*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[1].cb_offset_short;
204*15dc779aSAndroid Build Coastguard Worker break;
205*15dc779aSAndroid Build Coastguard Worker case 8000:
206*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[0].cb_offset_short;
207*15dc779aSAndroid Build Coastguard Worker break;
208*15dc779aSAndroid Build Coastguard Worker default:
209*15dc779aSAndroid Build Coastguard Worker ptr_sfb_params = pstr_sfb_info_tbls[8].cb_offset_short;
210*15dc779aSAndroid Build Coastguard Worker break;
211*15dc779aSAndroid Build Coastguard Worker }
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker
214*15dc779aSAndroid Build Coastguard Worker *ptr_sfb_count = 0;
215*15dc779aSAndroid Build Coastguard Worker start_offset = 0;
216*15dc779aSAndroid Build Coastguard Worker
217*15dc779aSAndroid Build Coastguard Worker do {
218*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[*ptr_sfb_count] = start_offset;
219*15dc779aSAndroid Build Coastguard Worker if (*ptr_sfb_count == 0)
220*15dc779aSAndroid Build Coastguard Worker prev_val = 0;
221*15dc779aSAndroid Build Coastguard Worker else
222*15dc779aSAndroid Build Coastguard Worker prev_val = ptr_sfb_params[*ptr_sfb_count - 1];
223*15dc779aSAndroid Build Coastguard Worker start_offset += ptr_sfb_params[*ptr_sfb_count] - prev_val;
224*15dc779aSAndroid Build Coastguard Worker (*ptr_sfb_count)++;
225*15dc779aSAndroid Build Coastguard Worker } while (start_offset < block_len);
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[*ptr_sfb_count] = start_offset;
228*15dc779aSAndroid Build Coastguard Worker
229*15dc779aSAndroid Build Coastguard Worker return;
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker
iusace_atan_approx(FLOAT32 val)232*15dc779aSAndroid Build Coastguard Worker static FLOAT32 iusace_atan_approx(FLOAT32 val) {
233*15dc779aSAndroid Build Coastguard Worker if (val < (FLOAT32)1.0) {
234*15dc779aSAndroid Build Coastguard Worker return (val / ((FLOAT32)1.0f + (FLOAT32)0.280872f * val * val));
235*15dc779aSAndroid Build Coastguard Worker } else {
236*15dc779aSAndroid Build Coastguard Worker return ((FLOAT32)1.57079633f - val / ((FLOAT32)0.280872f + val * val));
237*15dc779aSAndroid Build Coastguard Worker }
238*15dc779aSAndroid Build Coastguard Worker }
239*15dc779aSAndroid Build Coastguard Worker
iusace_calc_bark_line_value(WORD32 num_lines,WORD32 fft_line,WORD32 sample_rate)240*15dc779aSAndroid Build Coastguard Worker static FLOAT32 iusace_calc_bark_line_value(WORD32 num_lines, WORD32 fft_line,
241*15dc779aSAndroid Build Coastguard Worker WORD32 sample_rate) {
242*15dc779aSAndroid Build Coastguard Worker FLOAT32 center_freq, temp, b_value;
243*15dc779aSAndroid Build Coastguard Worker
244*15dc779aSAndroid Build Coastguard Worker center_freq = (FLOAT32)fft_line * ((FLOAT32)sample_rate * (FLOAT32)0.5f) / (FLOAT32)num_lines;
245*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)iusace_atan_approx((FLOAT32)1.3333333e-4f * center_freq);
246*15dc779aSAndroid Build Coastguard Worker b_value = (FLOAT32)13.3f * iusace_atan_approx((FLOAT32)0.00076f * center_freq) +
247*15dc779aSAndroid Build Coastguard Worker (FLOAT32)3.5f * temp * temp;
248*15dc779aSAndroid Build Coastguard Worker
249*15dc779aSAndroid Build Coastguard Worker return (b_value);
250*15dc779aSAndroid Build Coastguard Worker }
251*15dc779aSAndroid Build Coastguard Worker
iusace_bark_values_init(WORD32 sfb_count,WORD32 * ptr_sfb_offset,WORD32 num_lines,WORD32 sample_rate,FLOAT32 * ptr_b_value)252*15dc779aSAndroid Build Coastguard Worker static VOID iusace_bark_values_init(WORD32 sfb_count, WORD32 *ptr_sfb_offset, WORD32 num_lines,
253*15dc779aSAndroid Build Coastguard Worker WORD32 sample_rate, FLOAT32 *ptr_b_value) {
254*15dc779aSAndroid Build Coastguard Worker WORD32 i;
255*15dc779aSAndroid Build Coastguard Worker FLOAT32 b_val0, b_val1;
256*15dc779aSAndroid Build Coastguard Worker b_val0 = 0.0f;
257*15dc779aSAndroid Build Coastguard Worker
258*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < sfb_count; i++) {
259*15dc779aSAndroid Build Coastguard Worker b_val1 = iusace_calc_bark_line_value(num_lines, ptr_sfb_offset[i + 1], sample_rate);
260*15dc779aSAndroid Build Coastguard Worker ptr_b_value[i] = (b_val0 + b_val1) * (FLOAT32)0.5f;
261*15dc779aSAndroid Build Coastguard Worker b_val0 = b_val1;
262*15dc779aSAndroid Build Coastguard Worker }
263*15dc779aSAndroid Build Coastguard Worker return;
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker
iusace_thr_quiet_init(WORD32 sfb_count,WORD32 * ptr_sfb_offset,FLOAT32 * ptr_bark_val,FLOAT32 * ptr_thr_quiet)266*15dc779aSAndroid Build Coastguard Worker static VOID iusace_thr_quiet_init(WORD32 sfb_count, WORD32 *ptr_sfb_offset, FLOAT32 *ptr_bark_val,
267*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_thr_quiet) {
268*15dc779aSAndroid Build Coastguard Worker WORD32 i;
269*15dc779aSAndroid Build Coastguard Worker FLOAT32 bark_thr_quiet;
270*15dc779aSAndroid Build Coastguard Worker
271*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < sfb_count; i++) {
272*15dc779aSAndroid Build Coastguard Worker WORD32 b_val1, b_val2;
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker if (i > 0) {
275*15dc779aSAndroid Build Coastguard Worker b_val1 = (WORD32)(ptr_bark_val[i] + ptr_bark_val[i - 1]) >> 1;
276*15dc779aSAndroid Build Coastguard Worker } else {
277*15dc779aSAndroid Build Coastguard Worker b_val1 = (WORD32)(ptr_bark_val[i]) >> 1;
278*15dc779aSAndroid Build Coastguard Worker }
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker if (i < sfb_count - 1) {
281*15dc779aSAndroid Build Coastguard Worker b_val2 = (WORD32)(ptr_bark_val[i] + ptr_bark_val[i + 1]) >> 1;
282*15dc779aSAndroid Build Coastguard Worker } else {
283*15dc779aSAndroid Build Coastguard Worker b_val2 = (WORD32)(ptr_bark_val[i]);
284*15dc779aSAndroid Build Coastguard Worker }
285*15dc779aSAndroid Build Coastguard Worker b_val1 = MIN(b_val1, (WORD32)MAX_BARK_VALUE);
286*15dc779aSAndroid Build Coastguard Worker b_val2 = MIN(b_val2, (WORD32)MAX_BARK_VALUE);
287*15dc779aSAndroid Build Coastguard Worker bark_thr_quiet = MIN(iusace_bark_quiet_thr_val[b_val1], iusace_bark_quiet_thr_val[b_val2]);
288*15dc779aSAndroid Build Coastguard Worker
289*15dc779aSAndroid Build Coastguard Worker ptr_thr_quiet[i] = (FLOAT32)pow(10.0f, (bark_thr_quiet - 20.0f) * (FLOAT32)0.1f) * 16887.8f *
290*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(ptr_sfb_offset[i + 1] - ptr_sfb_offset[i]);
291*15dc779aSAndroid Build Coastguard Worker }
292*15dc779aSAndroid Build Coastguard Worker return;
293*15dc779aSAndroid Build Coastguard Worker }
294*15dc779aSAndroid Build Coastguard Worker
iusace_spreading_init(WORD32 sfb_count,FLOAT32 * ptr_bark_val,FLOAT32 * ptr_mask_low_fac,FLOAT32 * ptr_mask_high_fac,FLOAT32 * ptr_mask_low_fac_spr_energy,FLOAT32 * ptr_mask_high_fac_spr_energy,const WORD32 bit_rate,WORD32 block_type)295*15dc779aSAndroid Build Coastguard Worker static VOID iusace_spreading_init(WORD32 sfb_count, FLOAT32 *ptr_bark_val,
296*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_mask_low_fac, FLOAT32 *ptr_mask_high_fac,
297*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_mask_low_fac_spr_energy,
298*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_mask_high_fac_spr_energy, const WORD32 bit_rate,
299*15dc779aSAndroid Build Coastguard Worker WORD32 block_type) {
300*15dc779aSAndroid Build Coastguard Worker WORD32 i;
301*15dc779aSAndroid Build Coastguard Worker FLOAT32 mask_low_spr_energy, mask_high_spr_energy;
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker if (block_type != EIGHT_SHORT_SEQUENCE) {
304*15dc779aSAndroid Build Coastguard Worker mask_low_spr_energy = MASK_LOW_SP_ENERGY_L;
305*15dc779aSAndroid Build Coastguard Worker mask_high_spr_energy = (bit_rate > 22000) ? MASK_HIGH_SP_ENERGY_L : MASK_HIGH_SP_ENERGY_L_LBR;
306*15dc779aSAndroid Build Coastguard Worker } else {
307*15dc779aSAndroid Build Coastguard Worker mask_low_spr_energy = MASK_LOW_SP_ENERGY_S;
308*15dc779aSAndroid Build Coastguard Worker mask_high_spr_energy = MASK_HIGH_SP_ENERGY_S;
309*15dc779aSAndroid Build Coastguard Worker }
310*15dc779aSAndroid Build Coastguard Worker
311*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < sfb_count; i++) {
312*15dc779aSAndroid Build Coastguard Worker if (i > 0) {
313*15dc779aSAndroid Build Coastguard Worker FLOAT32 db_val;
314*15dc779aSAndroid Build Coastguard Worker FLOAT32 diff_val = (ptr_bark_val[i] - ptr_bark_val[i - 1]);
315*15dc779aSAndroid Build Coastguard Worker
316*15dc779aSAndroid Build Coastguard Worker db_val = MASK_HIGH_FAC * diff_val;
317*15dc779aSAndroid Build Coastguard Worker ptr_mask_high_fac[i] = (FLOAT32)pow(10.0f, -db_val);
318*15dc779aSAndroid Build Coastguard Worker db_val = MASK_LOW_FAC * diff_val;
319*15dc779aSAndroid Build Coastguard Worker ptr_mask_low_fac[i - 1] = (FLOAT32)pow(10.0f, -db_val);
320*15dc779aSAndroid Build Coastguard Worker db_val = mask_high_spr_energy * diff_val;
321*15dc779aSAndroid Build Coastguard Worker ptr_mask_high_fac_spr_energy[i] = (FLOAT32)pow(10.0f, -db_val);
322*15dc779aSAndroid Build Coastguard Worker db_val = mask_low_spr_energy * diff_val;
323*15dc779aSAndroid Build Coastguard Worker ptr_mask_low_fac_spr_energy[i - 1] = (FLOAT32)pow(10.0f, -db_val);
324*15dc779aSAndroid Build Coastguard Worker } else {
325*15dc779aSAndroid Build Coastguard Worker ptr_mask_high_fac[i] = 0.0f;
326*15dc779aSAndroid Build Coastguard Worker ptr_mask_low_fac[sfb_count - 1] = 0.0f;
327*15dc779aSAndroid Build Coastguard Worker ptr_mask_high_fac_spr_energy[i] = 0.0f;
328*15dc779aSAndroid Build Coastguard Worker ptr_mask_low_fac_spr_energy[sfb_count - 1] = 0.0f;
329*15dc779aSAndroid Build Coastguard Worker }
330*15dc779aSAndroid Build Coastguard Worker }
331*15dc779aSAndroid Build Coastguard Worker return;
332*15dc779aSAndroid Build Coastguard Worker }
333*15dc779aSAndroid Build Coastguard Worker
iusace_min_snr_init(const WORD32 bit_rate,const WORD32 sample_rate,const WORD32 num_lines,const WORD32 * ptr_sfb_offset,const FLOAT32 * ptr_bark_value,const WORD32 sfb_active,FLOAT32 * ptr_sfb_min_snr)334*15dc779aSAndroid Build Coastguard Worker static VOID iusace_min_snr_init(const WORD32 bit_rate, const WORD32 sample_rate,
335*15dc779aSAndroid Build Coastguard Worker const WORD32 num_lines, const WORD32 *ptr_sfb_offset,
336*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *ptr_bark_value, const WORD32 sfb_active,
337*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_min_snr) {
338*15dc779aSAndroid Build Coastguard Worker WORD32 sfb;
339*15dc779aSAndroid Build Coastguard Worker FLOAT32 bark_fac;
340*15dc779aSAndroid Build Coastguard Worker FLOAT32 bark_width;
341*15dc779aSAndroid Build Coastguard Worker FLOAT32 pe_per_window, pe_part;
342*15dc779aSAndroid Build Coastguard Worker FLOAT32 snr;
343*15dc779aSAndroid Build Coastguard Worker FLOAT32 b_val0, b_val1;
344*15dc779aSAndroid Build Coastguard Worker
345*15dc779aSAndroid Build Coastguard Worker if (sfb_active == 0) {
346*15dc779aSAndroid Build Coastguard Worker bark_fac = 1.0f;
347*15dc779aSAndroid Build Coastguard Worker } else {
348*15dc779aSAndroid Build Coastguard Worker bark_fac = (FLOAT32)1.0 / MIN(ptr_bark_value[sfb_active - 1] / MAX_BARK_VALUE, (FLOAT32)1.0);
349*15dc779aSAndroid Build Coastguard Worker }
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker pe_per_window =
352*15dc779aSAndroid Build Coastguard Worker iusace_bits_to_pe((FLOAT32)bit_rate / (FLOAT32)sample_rate * (FLOAT32)num_lines);
353*15dc779aSAndroid Build Coastguard Worker
354*15dc779aSAndroid Build Coastguard Worker b_val0 = (FLOAT32)0.0f;
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < sfb_active; sfb++) {
357*15dc779aSAndroid Build Coastguard Worker b_val1 = (FLOAT32)2.0 * ptr_bark_value[sfb] - b_val0;
358*15dc779aSAndroid Build Coastguard Worker bark_width = b_val1 - b_val0;
359*15dc779aSAndroid Build Coastguard Worker b_val0 = b_val1;
360*15dc779aSAndroid Build Coastguard Worker
361*15dc779aSAndroid Build Coastguard Worker pe_part = pe_per_window * (FLOAT32)0.024f * bark_fac;
362*15dc779aSAndroid Build Coastguard Worker pe_part *= bark_width;
363*15dc779aSAndroid Build Coastguard Worker pe_part /= (FLOAT32)(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
364*15dc779aSAndroid Build Coastguard Worker snr = (FLOAT32)pow(2.0f, pe_part) - 1.5f;
365*15dc779aSAndroid Build Coastguard Worker snr = 1.0f / MAX(snr, 1.0f);
366*15dc779aSAndroid Build Coastguard Worker snr = MIN(snr, 0.8f);
367*15dc779aSAndroid Build Coastguard Worker snr = MAX(snr, 0.003f);
368*15dc779aSAndroid Build Coastguard Worker ptr_sfb_min_snr[sfb] = snr;
369*15dc779aSAndroid Build Coastguard Worker }
370*15dc779aSAndroid Build Coastguard Worker return;
371*15dc779aSAndroid Build Coastguard Worker }
372*15dc779aSAndroid Build Coastguard Worker
iusace_psy_long_config_init(WORD32 bit_rate,WORD32 sample_rate,WORD32 band_width,ia_psy_mod_long_config_struct * pstr_psy_config,WORD32 ccfl)373*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_long_config_init(WORD32 bit_rate, WORD32 sample_rate, WORD32 band_width,
374*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_long_config_struct *pstr_psy_config, WORD32 ccfl) {
375*15dc779aSAndroid Build Coastguard Worker WORD32 sfb;
376*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_bark_val[MAX_NUM_GROUPED_SFB];
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker iusace_sfb_init(sample_rate, ONLY_LONG_SEQUENCE, pstr_psy_config->sfb_offset,
379*15dc779aSAndroid Build Coastguard Worker &(pstr_psy_config->sfb_count), ccfl);
380*15dc779aSAndroid Build Coastguard Worker
381*15dc779aSAndroid Build Coastguard Worker iusace_bark_values_init(pstr_psy_config->sfb_count, pstr_psy_config->sfb_offset,
382*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_offset[pstr_psy_config->sfb_count], sample_rate,
383*15dc779aSAndroid Build Coastguard Worker sfb_bark_val);
384*15dc779aSAndroid Build Coastguard Worker
385*15dc779aSAndroid Build Coastguard Worker iusace_thr_quiet_init(pstr_psy_config->sfb_count, pstr_psy_config->sfb_offset, sfb_bark_val,
386*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_thr_quiet);
387*15dc779aSAndroid Build Coastguard Worker
388*15dc779aSAndroid Build Coastguard Worker iusace_spreading_init(
389*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_count, sfb_bark_val, pstr_psy_config->sfb_mask_low_fac,
390*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac, pstr_psy_config->sfb_mask_low_fac_spr_ener,
391*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac_spr_ener, bit_rate, ONLY_LONG_SEQUENCE);
392*15dc779aSAndroid Build Coastguard Worker
393*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->ratio = C_RATIO;
394*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->max_allowed_inc_fac = 2.0f;
395*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->min_remaining_thr_fac = 0.01f;
396*15dc779aSAndroid Build Coastguard Worker
397*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->clip_energy = (CLIP_ENERGY_VALUE_LONG * ccfl) / FRAME_LEN_LONG;
398*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->low_pass_line = (WORD32)((2 * band_width * ccfl) / sample_rate);
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < pstr_psy_config->sfb_count; sfb++) {
401*15dc779aSAndroid Build Coastguard Worker if (pstr_psy_config->sfb_offset[sfb] >= pstr_psy_config->low_pass_line) break;
402*15dc779aSAndroid Build Coastguard Worker }
403*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_active = sfb;
404*15dc779aSAndroid Build Coastguard Worker
405*15dc779aSAndroid Build Coastguard Worker iusace_min_snr_init(bit_rate, sample_rate,
406*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_offset[pstr_psy_config->sfb_count],
407*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_offset, sfb_bark_val, pstr_psy_config->sfb_active,
408*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_min_snr);
409*15dc779aSAndroid Build Coastguard Worker
410*15dc779aSAndroid Build Coastguard Worker return;
411*15dc779aSAndroid Build Coastguard Worker }
412*15dc779aSAndroid Build Coastguard Worker
iusace_psy_short_config_init(WORD32 bit_rate,WORD32 sample_rate,WORD32 band_width,ia_psy_mod_short_config_struct * pstr_psy_config,WORD32 ccfl)413*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_short_config_init(WORD32 bit_rate, WORD32 sample_rate, WORD32 band_width,
414*15dc779aSAndroid Build Coastguard Worker ia_psy_mod_short_config_struct *pstr_psy_config, WORD32 ccfl) {
415*15dc779aSAndroid Build Coastguard Worker WORD32 sfb;
416*15dc779aSAndroid Build Coastguard Worker WORD32 frame_len_short = (ccfl * FRAME_LEN_SHORT_128) / FRAME_LEN_LONG;
417*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_bark_val[MAX_NUM_GROUPED_SFB];
418*15dc779aSAndroid Build Coastguard Worker
419*15dc779aSAndroid Build Coastguard Worker iusace_sfb_init(sample_rate, EIGHT_SHORT_SEQUENCE, pstr_psy_config->sfb_offset,
420*15dc779aSAndroid Build Coastguard Worker &(pstr_psy_config->sfb_count), ccfl);
421*15dc779aSAndroid Build Coastguard Worker
422*15dc779aSAndroid Build Coastguard Worker iusace_bark_values_init(pstr_psy_config->sfb_count, pstr_psy_config->sfb_offset,
423*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_offset[pstr_psy_config->sfb_count], sample_rate,
424*15dc779aSAndroid Build Coastguard Worker sfb_bark_val);
425*15dc779aSAndroid Build Coastguard Worker
426*15dc779aSAndroid Build Coastguard Worker iusace_thr_quiet_init(pstr_psy_config->sfb_count, pstr_psy_config->sfb_offset, sfb_bark_val,
427*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_thr_quiet);
428*15dc779aSAndroid Build Coastguard Worker
429*15dc779aSAndroid Build Coastguard Worker iusace_spreading_init(
430*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_count, sfb_bark_val, pstr_psy_config->sfb_mask_low_fac,
431*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac, pstr_psy_config->sfb_mask_low_fac_spr_ener,
432*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_mask_high_fac_spr_ener, bit_rate, EIGHT_SHORT_SEQUENCE);
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->ratio = C_RATIO;
435*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->max_allowed_inc_fac = 2.0f;
436*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->min_remaining_thr_fac = 0.01f;
437*15dc779aSAndroid Build Coastguard Worker
438*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->clip_energy =
439*15dc779aSAndroid Build Coastguard Worker (CLIP_ENERGY_VALUE_SHORT * frame_len_short) / FRAME_LEN_SHORT_128;
440*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->low_pass_line = (WORD32)((2 * band_width * frame_len_short) / sample_rate);
441*15dc779aSAndroid Build Coastguard Worker
442*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < pstr_psy_config->sfb_count; sfb++) {
443*15dc779aSAndroid Build Coastguard Worker if (pstr_psy_config->sfb_offset[sfb] >= pstr_psy_config->low_pass_line) break;
444*15dc779aSAndroid Build Coastguard Worker }
445*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_active = sfb;
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker iusace_min_snr_init(bit_rate, sample_rate,
448*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_offset[pstr_psy_config->sfb_count],
449*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_offset, sfb_bark_val, pstr_psy_config->sfb_active,
450*15dc779aSAndroid Build Coastguard Worker pstr_psy_config->sfb_min_snr);
451*15dc779aSAndroid Build Coastguard Worker
452*15dc779aSAndroid Build Coastguard Worker return;
453*15dc779aSAndroid Build Coastguard Worker }
454*15dc779aSAndroid Build Coastguard Worker
iusace_sfb_params_init(WORD32 sample_rate,WORD32 frame_len,WORD32 * ptr_sfb_width,WORD32 * num_sfb,WORD32 win_seq)455*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE iusace_sfb_params_init(WORD32 sample_rate, WORD32 frame_len, WORD32 *ptr_sfb_width,
456*15dc779aSAndroid Build Coastguard Worker WORD32 *num_sfb, WORD32 win_seq) {
457*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k;
458*15dc779aSAndroid Build Coastguard Worker ia_sfb_info_struct *ptr_sr_info = NULL;
459*15dc779aSAndroid Build Coastguard Worker WORD32 sampling_rate_mapped = 0;
460*15dc779aSAndroid Build Coastguard Worker
461*15dc779aSAndroid Build Coastguard Worker if (frame_len == 1024) {
462*15dc779aSAndroid Build Coastguard Worker ptr_sr_info = &iusace_sfb_info_1024[0];
463*15dc779aSAndroid Build Coastguard Worker } else {
464*15dc779aSAndroid Build Coastguard Worker ptr_sr_info = &iusace_sfb_info_768[0];
465*15dc779aSAndroid Build Coastguard Worker }
466*15dc779aSAndroid Build Coastguard Worker
467*15dc779aSAndroid Build Coastguard Worker if (sample_rate < 0)
468*15dc779aSAndroid Build Coastguard Worker {
469*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_USAC_INVALID_CORE_SAMPLE_RATE;
470*15dc779aSAndroid Build Coastguard Worker }
471*15dc779aSAndroid Build Coastguard Worker
472*15dc779aSAndroid Build Coastguard Worker sampling_rate_mapped = iusace_map_sample_rate(sample_rate);
473*15dc779aSAndroid Build Coastguard Worker
474*15dc779aSAndroid Build Coastguard Worker while (ptr_sr_info->sample_rate != sampling_rate_mapped) {
475*15dc779aSAndroid Build Coastguard Worker if (ptr_sr_info->sample_rate == -1) {
476*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_USAC_INVALID_CORE_SAMPLE_RATE;
477*15dc779aSAndroid Build Coastguard Worker }
478*15dc779aSAndroid Build Coastguard Worker ptr_sr_info++;
479*15dc779aSAndroid Build Coastguard Worker }
480*15dc779aSAndroid Build Coastguard Worker
481*15dc779aSAndroid Build Coastguard Worker j = 0;
482*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_sr_info->num_sfb_long; i++) {
483*15dc779aSAndroid Build Coastguard Worker k = ptr_sr_info->cb_offset_long[i];
484*15dc779aSAndroid Build Coastguard Worker ptr_sr_info->sfb_width_long[i] = k - j;
485*15dc779aSAndroid Build Coastguard Worker j = k;
486*15dc779aSAndroid Build Coastguard Worker }
487*15dc779aSAndroid Build Coastguard Worker j = 0;
488*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_sr_info->num_sfb_short; i++) {
489*15dc779aSAndroid Build Coastguard Worker k = ptr_sr_info->cb_offset_short[i];
490*15dc779aSAndroid Build Coastguard Worker ptr_sr_info->sfb_width_short[i] = k - j;
491*15dc779aSAndroid Build Coastguard Worker j = k;
492*15dc779aSAndroid Build Coastguard Worker }
493*15dc779aSAndroid Build Coastguard Worker
494*15dc779aSAndroid Build Coastguard Worker switch (win_seq) {
495*15dc779aSAndroid Build Coastguard Worker case EIGHT_SHORT_SEQUENCE:
496*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_sfb_width, ptr_sr_info->sfb_width_short, (MAX_SFB_SHORT) * sizeof(WORD32));
497*15dc779aSAndroid Build Coastguard Worker *num_sfb = ptr_sr_info->num_sfb_short;
498*15dc779aSAndroid Build Coastguard Worker break;
499*15dc779aSAndroid Build Coastguard Worker case ONLY_LONG_SEQUENCE:
500*15dc779aSAndroid Build Coastguard Worker case LONG_START_SEQUENCE:
501*15dc779aSAndroid Build Coastguard Worker case STOP_START_SEQUENCE:
502*15dc779aSAndroid Build Coastguard Worker case LONG_STOP_SEQUENCE:
503*15dc779aSAndroid Build Coastguard Worker default:
504*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_sfb_width, ptr_sr_info->sfb_width_long, MAX_SFB_LONG * sizeof(WORD32));
505*15dc779aSAndroid Build Coastguard Worker *num_sfb = ptr_sr_info->num_sfb_long;
506*15dc779aSAndroid Build Coastguard Worker break;
507*15dc779aSAndroid Build Coastguard Worker }
508*15dc779aSAndroid Build Coastguard Worker
509*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
510*15dc779aSAndroid Build Coastguard Worker }
511