1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker
21*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <string.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_fix.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_defines.h"
28*15dc779aSAndroid Build Coastguard Worker
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_bitstream.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_frame_windowing.h"
32*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_frame_window_list_limit(ixheaace_mps_pstr_frame_win_list const pstr_frame_win_list,const WORD32 lower_limit,const WORD32 upper_limit)33*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_frame_window_list_limit(
34*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_frame_win_list const pstr_frame_win_list, const WORD32 lower_limit,
35*15dc779aSAndroid Build Coastguard Worker const WORD32 upper_limit) {
36*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
37*15dc779aSAndroid Build Coastguard Worker WORD32 list_cnt = 0;
38*15dc779aSAndroid Build Coastguard Worker for (list_cnt = 0; list_cnt < pstr_frame_win_list->win_list_cnt; list_cnt++) {
39*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_win_list->dat[list_cnt].slot < lower_limit ||
40*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[list_cnt].slot > upper_limit) {
41*15dc779aSAndroid Build Coastguard Worker if (list_cnt == MAX_NUM_PARAMS - 1) {
42*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[list_cnt].hold = IXHEAACE_MPS_FRAME_WINDOWING_INTP;
43*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[list_cnt].slot = -1;
44*15dc779aSAndroid Build Coastguard Worker } else {
45*15dc779aSAndroid Build Coastguard Worker WORD32 param = 0;
46*15dc779aSAndroid Build Coastguard Worker for (param = list_cnt; param < MAX_NUM_PARAMS - 1; param++) {
47*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[param] = pstr_frame_win_list->dat[param + 1];
48*15dc779aSAndroid Build Coastguard Worker }
49*15dc779aSAndroid Build Coastguard Worker }
50*15dc779aSAndroid Build Coastguard Worker
51*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->win_list_cnt--;
52*15dc779aSAndroid Build Coastguard Worker --list_cnt;
53*15dc779aSAndroid Build Coastguard Worker }
54*15dc779aSAndroid Build Coastguard Worker }
55*15dc779aSAndroid Build Coastguard Worker return error;
56*15dc779aSAndroid Build Coastguard Worker }
57*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_frame_window_list_add(ixheaace_mps_pstr_frame_win_list const pstr_frame_win_list,const WORD32 slot,const WORD32 hold)58*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_mps_212_frame_window_list_add(
59*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_frame_win_list const pstr_frame_win_list, const WORD32 slot,
60*15dc779aSAndroid Build Coastguard Worker const WORD32 hold) {
61*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_win_list->win_list_cnt >= MAX_NUM_PARAMS) {
64*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_PARAM_ERROR;
65*15dc779aSAndroid Build Coastguard Worker } else if (pstr_frame_win_list->win_list_cnt > 0 &&
66*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[pstr_frame_win_list->win_list_cnt - 1].slot - slot > 0) {
67*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_PARAM_ERROR;
68*15dc779aSAndroid Build Coastguard Worker } else {
69*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[pstr_frame_win_list->win_list_cnt].hold = hold;
70*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[pstr_frame_win_list->win_list_cnt].slot = slot;
71*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->win_list_cnt++;
72*15dc779aSAndroid Build Coastguard Worker }
73*15dc779aSAndroid Build Coastguard Worker return error;
74*15dc779aSAndroid Build Coastguard Worker }
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_mps_212_frame_window_init(ixheaace_mps_pstr_frame_win pstr_frame_win,const ixheaace_mps_pstr_frame_win_config pstr_frame_win_config)77*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_frame_window_init(
78*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_frame_win pstr_frame_win,
79*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_pstr_frame_win_config pstr_frame_win_config) {
80*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
81*15dc779aSAndroid Build Coastguard Worker WORD32 slot;
82*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = pstr_frame_win_config->num_time_slots_max;
83*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->frame_keep_flag = pstr_frame_win_config->frame_keep_flag;
84*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->num_time_slots_max = pstr_frame_win_config->num_time_slots_max;
85*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->start_slope = 0;
86*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->start_rect = time_slots >> 1;
87*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->stop_slope = ((3 * time_slots) >> 1) - 1;
88*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->stop_rect = time_slots;
89*15dc779aSAndroid Build Coastguard Worker for (slot = 0; slot<time_slots>> 1; slot++) {
90*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->p_tapper_sync_flt[slot] = (FLOAT32)slot / time_slots;
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->p_tapper_sync_flt[time_slots >> 1] = 1.0f;
93*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->taper_syn_len = time_slots >> 1;
94*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->taper_ana_len = pstr_frame_win->start_rect - pstr_frame_win->start_slope;
95*15dc779aSAndroid Build Coastguard Worker for (slot = 0; slot < pstr_frame_win->taper_ana_len; slot++) {
96*15dc779aSAndroid Build Coastguard Worker pstr_frame_win->p_taper_ana_flt[slot] = 1.0f;
97*15dc779aSAndroid Build Coastguard Worker }
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker return error;
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_frame_window_get_window(ixheaace_mps_pstr_frame_win pstr_frame_win,WORD32 tr_pos[MAX_NUM_PARAMS],const WORD32 time_slots,ixheaace_mps_framing_info * const pstr_framing_info,FLOAT32 * ptr_window_ana[MAX_NUM_PARAMS],ixheaace_mps_pstr_frame_win_list const pstr_frame_win_list,const WORD32 avoid_keep)102*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_frame_window_get_window(
103*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_frame_win pstr_frame_win, WORD32 tr_pos[MAX_NUM_PARAMS],
104*15dc779aSAndroid Build Coastguard Worker const WORD32 time_slots, ixheaace_mps_framing_info *const pstr_framing_info,
105*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_window_ana[MAX_NUM_PARAMS],
106*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_frame_win_list const pstr_frame_win_list, const WORD32 avoid_keep) {
107*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
108*15dc779aSAndroid Build Coastguard Worker WORD32 win_cnt = 0;
109*15dc779aSAndroid Build Coastguard Worker WORD32 w, ps;
110*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
111*15dc779aSAndroid Build Coastguard Worker WORD32 param;
112*15dc779aSAndroid Build Coastguard Worker WORD32 start_slope = pstr_frame_win->start_slope;
113*15dc779aSAndroid Build Coastguard Worker WORD32 start_rect = pstr_frame_win->start_rect;
114*15dc779aSAndroid Build Coastguard Worker WORD32 stop_slope = pstr_frame_win->stop_slope;
115*15dc779aSAndroid Build Coastguard Worker WORD32 stop_rect = pstr_frame_win->stop_rect;
116*15dc779aSAndroid Build Coastguard Worker WORD32 taper_ana_len = pstr_frame_win->taper_ana_len;
117*15dc779aSAndroid Build Coastguard Worker FLOAT32 apply_right_window_gain[MAX_NUM_PARAMS];
118*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_taper_ana = pstr_frame_win->p_taper_ana_flt;
119*15dc779aSAndroid Build Coastguard Worker
120*15dc779aSAndroid Build Coastguard Worker if ((time_slots > pstr_frame_win->num_time_slots_max) || (time_slots < 0)) {
121*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
122*15dc779aSAndroid Build Coastguard Worker }
123*15dc779aSAndroid Build Coastguard Worker
124*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->win_list_cnt = 0;
125*15dc779aSAndroid Build Coastguard Worker for (param = 0; param < MAX_NUM_PARAMS; param++) {
126*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[param].slot = -1;
127*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[param].hold = IXHEAACE_MPS_FRAME_WINDOWING_INTP;
128*15dc779aSAndroid Build Coastguard Worker }
129*15dc779aSAndroid Build Coastguard Worker memset(apply_right_window_gain, 0, sizeof(apply_right_window_gain));
130*15dc779aSAndroid Build Coastguard Worker if (tr_pos[0] <= 0) {
131*15dc779aSAndroid Build Coastguard Worker win_cnt = 0;
132*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_frame_window_list_add(pstr_frame_win_list, time_slots - 1,
133*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MPS_FRAME_WINDOWING_INTP);
134*15dc779aSAndroid Build Coastguard Worker if (error) {
135*15dc779aSAndroid Build Coastguard Worker return error;
136*15dc779aSAndroid Build Coastguard Worker }
137*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < start_slope; idx++) {
138*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[win_cnt][idx] = 0.0f;
139*15dc779aSAndroid Build Coastguard Worker }
140*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < taper_ana_len; idx++) {
141*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[win_cnt][start_slope + idx] = p_taper_ana[idx];
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < time_slots - start_rect; idx++) {
145*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[win_cnt][start_rect + idx] = 1.0f;
146*15dc779aSAndroid Build Coastguard Worker }
147*15dc779aSAndroid Build Coastguard Worker
148*15dc779aSAndroid Build Coastguard Worker apply_right_window_gain[win_cnt] = 1.0f;
149*15dc779aSAndroid Build Coastguard Worker win_cnt++;
150*15dc779aSAndroid Build Coastguard Worker } else {
151*15dc779aSAndroid Build Coastguard Worker WORD32 p_l = tr_pos[0];
152*15dc779aSAndroid Build Coastguard Worker win_cnt = 0;
153*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_frame_window_list_add(pstr_frame_win_list, p_l - 1,
154*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MPS_FRAME_WINDOWING_HOLD);
155*15dc779aSAndroid Build Coastguard Worker if (error) {
156*15dc779aSAndroid Build Coastguard Worker return error;
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_frame_window_list_add(pstr_frame_win_list, p_l,
159*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MPS_FRAME_WINDOWING_INTP);
160*15dc779aSAndroid Build Coastguard Worker if (error) {
161*15dc779aSAndroid Build Coastguard Worker return error;
162*15dc779aSAndroid Build Coastguard Worker }
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_frame_window_list_limit(pstr_frame_win_list, 0, time_slots - 1);
165*15dc779aSAndroid Build Coastguard Worker if (error) {
166*15dc779aSAndroid Build Coastguard Worker return error;
167*15dc779aSAndroid Build Coastguard Worker }
168*15dc779aSAndroid Build Coastguard Worker
169*15dc779aSAndroid Build Coastguard Worker error = ixheaace_mps_212_frame_window_list_add(pstr_frame_win_list, time_slots - 1,
170*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MPS_FRAME_WINDOWING_HOLD);
171*15dc779aSAndroid Build Coastguard Worker if (error) {
172*15dc779aSAndroid Build Coastguard Worker return error;
173*15dc779aSAndroid Build Coastguard Worker }
174*15dc779aSAndroid Build Coastguard Worker
175*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_win_list->win_list_cnt > MAX_NUM_PARAMS) {
176*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
177*15dc779aSAndroid Build Coastguard Worker }
178*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < pstr_frame_win_list->win_list_cnt - 1; ps++) {
179*15dc779aSAndroid Build Coastguard Worker if (IXHEAACE_MPS_FRAME_WINDOWING_HOLD != pstr_frame_win_list->dat[ps].hold) {
180*15dc779aSAndroid Build Coastguard Worker WORD32 start = pstr_frame_win_list->dat[ps].slot;
181*15dc779aSAndroid Build Coastguard Worker WORD32 stop = pstr_frame_win_list->dat[ps + 1].slot;
182*15dc779aSAndroid Build Coastguard Worker
183*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < start; idx++) {
184*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[win_cnt][idx] = 0.0f;
185*15dc779aSAndroid Build Coastguard Worker }
186*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < stop - start + 1; idx++) {
187*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[win_cnt][start + idx] = 1.0f;
188*15dc779aSAndroid Build Coastguard Worker }
189*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < time_slots - stop - 1; idx++) {
190*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[win_cnt][stop + 1 + idx] = 0.0f;
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker apply_right_window_gain[win_cnt] = ptr_window_ana[win_cnt][time_slots - 1];
194*15dc779aSAndroid Build Coastguard Worker win_cnt++;
195*15dc779aSAndroid Build Coastguard Worker }
196*15dc779aSAndroid Build Coastguard Worker }
197*15dc779aSAndroid Build Coastguard Worker
198*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_win_list->win_list_cnt - 1 < 0 ||
199*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->win_list_cnt - 1 >= MAX_NUM_PARAMS) {
200*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_PARAM_ERROR;
201*15dc779aSAndroid Build Coastguard Worker } else if (pstr_frame_win_list->win_list_cnt > 0) {
202*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_win_list->win_list_cnt - 1 == MAX_NUM_PARAMS - 1) {
203*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[pstr_frame_win_list->win_list_cnt - 1].slot = -1;
204*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[pstr_frame_win_list->win_list_cnt - 1].hold =
205*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MPS_FRAME_WINDOWING_INTP;
206*15dc779aSAndroid Build Coastguard Worker } else {
207*15dc779aSAndroid Build Coastguard Worker for (param = pstr_frame_win_list->win_list_cnt - 1; param < MAX_NUM_PARAMS - 1; param++) {
208*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->dat[param] = pstr_frame_win_list->dat[param + 1];
209*15dc779aSAndroid Build Coastguard Worker }
210*15dc779aSAndroid Build Coastguard Worker }
211*15dc779aSAndroid Build Coastguard Worker pstr_frame_win_list->win_list_cnt--;
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker if (error) {
214*15dc779aSAndroid Build Coastguard Worker return error;
215*15dc779aSAndroid Build Coastguard Worker }
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker for (w = 0; w < win_cnt; w++) {
219*15dc779aSAndroid Build Coastguard Worker if (apply_right_window_gain[w] <= 0) {
220*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < time_slots; idx++) {
221*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][time_slots + idx] = 0.0f;
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker } else {
224*15dc779aSAndroid Build Coastguard Worker if (tr_pos[1] < 0) {
225*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < stop_rect - time_slots + 1; idx++) {
226*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][time_slots + idx] = 1.0f;
227*15dc779aSAndroid Build Coastguard Worker }
228*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < taper_ana_len; idx++) {
229*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][stop_rect + idx] = p_taper_ana[taper_ana_len - 1 - idx];
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < 2 * time_slots - stop_slope - 1; idx++) {
232*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][stop_slope + 1 + idx] = 0.0f;
233*15dc779aSAndroid Build Coastguard Worker }
234*15dc779aSAndroid Build Coastguard Worker } else {
235*15dc779aSAndroid Build Coastguard Worker WORD32 p_r = tr_pos[1];
236*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < p_r - time_slots; idx++) {
237*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][time_slots + idx] = 1.0f;
238*15dc779aSAndroid Build Coastguard Worker }
239*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < 2 * time_slots - p_r; idx++) {
240*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][p_r + idx] = 0.0f;
241*15dc779aSAndroid Build Coastguard Worker }
242*15dc779aSAndroid Build Coastguard Worker }
243*15dc779aSAndroid Build Coastguard Worker if (apply_right_window_gain[w] < 1.0f) {
244*15dc779aSAndroid Build Coastguard Worker WORD32 slot;
245*15dc779aSAndroid Build Coastguard Worker for (slot = 0; slot < time_slots; slot++) {
246*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][time_slots + slot] =
247*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[w][time_slots + slot] * apply_right_window_gain[w];
248*15dc779aSAndroid Build Coastguard Worker }
249*15dc779aSAndroid Build Coastguard Worker }
250*15dc779aSAndroid Build Coastguard Worker }
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_win->frame_keep_flag == 1) {
253*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < time_slots; idx++) {
254*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[0][2 * time_slots + idx] = ptr_window_ana[0][time_slots + idx];
255*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[0][time_slots + idx] = ptr_window_ana[0][idx];
256*15dc779aSAndroid Build Coastguard Worker }
257*15dc779aSAndroid Build Coastguard Worker if (avoid_keep == 0) {
258*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < time_slots; idx++) {
259*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[0][idx] = 1.0f;
260*15dc779aSAndroid Build Coastguard Worker }
261*15dc779aSAndroid Build Coastguard Worker } else {
262*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < time_slots; idx++) {
263*15dc779aSAndroid Build Coastguard Worker ptr_window_ana[0][idx] = 0.0f;
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker }
266*15dc779aSAndroid Build Coastguard Worker }
267*15dc779aSAndroid Build Coastguard Worker pstr_framing_info->num_param_sets = pstr_frame_win_list->win_list_cnt;
268*15dc779aSAndroid Build Coastguard Worker pstr_framing_info->bs_framing_type = 1;
269*15dc779aSAndroid Build Coastguard Worker for (ps = 0; ps < pstr_framing_info->num_param_sets; ps++) {
270*15dc779aSAndroid Build Coastguard Worker pstr_framing_info->bs_param_slots[ps] = pstr_frame_win_list->dat[ps].slot;
271*15dc779aSAndroid Build Coastguard Worker }
272*15dc779aSAndroid Build Coastguard Worker if ((pstr_framing_info->num_param_sets == 1) &&
273*15dc779aSAndroid Build Coastguard Worker (pstr_framing_info->bs_param_slots[0] == time_slots - 1)) {
274*15dc779aSAndroid Build Coastguard Worker pstr_framing_info->bs_framing_type = 0;
275*15dc779aSAndroid Build Coastguard Worker }
276*15dc779aSAndroid Build Coastguard Worker return error;
277*15dc779aSAndroid Build Coastguard Worker }
278*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_analysis_windowing(const WORD32 num_time_slots,const WORD32 start_time_slot,FLOAT32 * ptr_window_ana,ixheaace_cmplx_str pp_cmplx_data_in[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS],ixheaace_cmplx_str pp_cmplx_data_out[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS],const WORD32 num_hybrid_bands)279*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_mps_212_analysis_windowing(
280*15dc779aSAndroid Build Coastguard Worker const WORD32 num_time_slots, const WORD32 start_time_slot, FLOAT32 *ptr_window_ana,
281*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str pp_cmplx_data_in[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS],
282*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str pp_cmplx_data_out[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS],
283*15dc779aSAndroid Build Coastguard Worker const WORD32 num_hybrid_bands) {
284*15dc779aSAndroid Build Coastguard Worker WORD32 band, slot;
285*15dc779aSAndroid Build Coastguard Worker FLOAT32 win;
286*15dc779aSAndroid Build Coastguard Worker
287*15dc779aSAndroid Build Coastguard Worker for (slot = start_time_slot; slot < num_time_slots; slot++) {
288*15dc779aSAndroid Build Coastguard Worker win = ptr_window_ana[slot];
289*15dc779aSAndroid Build Coastguard Worker if (win != 1.0f) {
290*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_hybrid_bands; band++) {
291*15dc779aSAndroid Build Coastguard Worker pp_cmplx_data_out[slot][band].re = win * pp_cmplx_data_in[slot][band].re;
292*15dc779aSAndroid Build Coastguard Worker pp_cmplx_data_out[slot][band].im = win * pp_cmplx_data_in[slot][band].im;
293*15dc779aSAndroid Build Coastguard Worker }
294*15dc779aSAndroid Build Coastguard Worker } else {
295*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_hybrid_bands; band++) {
296*15dc779aSAndroid Build Coastguard Worker pp_cmplx_data_out[slot][band].re = pp_cmplx_data_in[slot][band].re;
297*15dc779aSAndroid Build Coastguard Worker pp_cmplx_data_out[slot][band].im = pp_cmplx_data_in[slot][band].im;
298*15dc779aSAndroid Build Coastguard Worker }
299*15dc779aSAndroid Build Coastguard Worker }
300*15dc779aSAndroid Build Coastguard Worker }
301*15dc779aSAndroid Build Coastguard Worker }
302