1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker
4*e5436536SAndroid Build Coastguard Worker © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker
7*e5436536SAndroid Build Coastguard Worker 1. INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker
34*e5436536SAndroid Build Coastguard Worker 2. COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker
61*e5436536SAndroid Build Coastguard Worker 3. NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker
71*e5436536SAndroid Build Coastguard Worker 4. DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker
84*e5436536SAndroid Build Coastguard Worker 5. CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker
95*e5436536SAndroid Build Coastguard Worker /*********************** MPEG surround encoder library *************************
96*e5436536SAndroid Build Coastguard Worker
97*e5436536SAndroid Build Coastguard Worker Author(s): Max Neuendorf
98*e5436536SAndroid Build Coastguard Worker
99*e5436536SAndroid Build Coastguard Worker Description: Encoder Library Interface
100*e5436536SAndroid Build Coastguard Worker Get windows for framing
101*e5436536SAndroid Build Coastguard Worker
102*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
103*e5436536SAndroid Build Coastguard Worker
104*e5436536SAndroid Build Coastguard Worker /**************************************************************************/ /**
105*e5436536SAndroid Build Coastguard Worker \file
106*e5436536SAndroid Build Coastguard Worker Description of file contents
107*e5436536SAndroid Build Coastguard Worker ******************************************************************************/
108*e5436536SAndroid Build Coastguard Worker
109*e5436536SAndroid Build Coastguard Worker /* Includes ******************************************************************/
110*e5436536SAndroid Build Coastguard Worker #include "sacenc_framewindowing.h"
111*e5436536SAndroid Build Coastguard Worker #include "sacenc_vectorfunctions.h"
112*e5436536SAndroid Build Coastguard Worker
113*e5436536SAndroid Build Coastguard Worker /* Defines *******************************************************************/
114*e5436536SAndroid Build Coastguard Worker
115*e5436536SAndroid Build Coastguard Worker /* Data Types ****************************************************************/
116*e5436536SAndroid Build Coastguard Worker typedef struct T_FRAMEWINDOW {
117*e5436536SAndroid Build Coastguard Worker INT nTimeSlotsMax;
118*e5436536SAndroid Build Coastguard Worker INT bFrameKeep;
119*e5436536SAndroid Build Coastguard Worker INT startSlope;
120*e5436536SAndroid Build Coastguard Worker INT stopSlope;
121*e5436536SAndroid Build Coastguard Worker INT startRect;
122*e5436536SAndroid Build Coastguard Worker INT stopRect;
123*e5436536SAndroid Build Coastguard Worker
124*e5436536SAndroid Build Coastguard Worker INT taperAnaLen;
125*e5436536SAndroid Build Coastguard Worker INT taperSynLen;
126*e5436536SAndroid Build Coastguard Worker FIXP_WIN pTaperAna__FDK[MAX_TIME_SLOTS];
127*e5436536SAndroid Build Coastguard Worker FIXP_WIN pTaperSyn__FDK[MAX_TIME_SLOTS];
128*e5436536SAndroid Build Coastguard Worker
129*e5436536SAndroid Build Coastguard Worker } FRAMEWINDOW;
130*e5436536SAndroid Build Coastguard Worker
131*e5436536SAndroid Build Coastguard Worker typedef enum {
132*e5436536SAndroid Build Coastguard Worker FIX_INVALID = -1,
133*e5436536SAndroid Build Coastguard Worker FIX_RECT_SMOOTH = 0,
134*e5436536SAndroid Build Coastguard Worker FIX_SMOOTH_RECT = 1,
135*e5436536SAndroid Build Coastguard Worker FIX_LARGE_SMOOTH = 2,
136*e5436536SAndroid Build Coastguard Worker FIX_RECT_TRIANG = 3
137*e5436536SAndroid Build Coastguard Worker
138*e5436536SAndroid Build Coastguard Worker } FIX_TYPE;
139*e5436536SAndroid Build Coastguard Worker
140*e5436536SAndroid Build Coastguard Worker typedef enum {
141*e5436536SAndroid Build Coastguard Worker VAR_INVALID = -1,
142*e5436536SAndroid Build Coastguard Worker VAR_HOLD = 0,
143*e5436536SAndroid Build Coastguard Worker VAR_ISOLATE = 1
144*e5436536SAndroid Build Coastguard Worker
145*e5436536SAndroid Build Coastguard Worker } VAR_TYPE;
146*e5436536SAndroid Build Coastguard Worker
147*e5436536SAndroid Build Coastguard Worker /* Constants *****************************************************************/
148*e5436536SAndroid Build Coastguard Worker
149*e5436536SAndroid Build Coastguard Worker /* Function / Class Declarations *********************************************/
150*e5436536SAndroid Build Coastguard Worker
151*e5436536SAndroid Build Coastguard Worker /* Function / Class Definition ***********************************************/
calcTaperWin(FIXP_WIN * pTaperWin,INT timeSlots)152*e5436536SAndroid Build Coastguard Worker static void calcTaperWin(FIXP_WIN *pTaperWin, INT timeSlots) {
153*e5436536SAndroid Build Coastguard Worker FIXP_DBL x;
154*e5436536SAndroid Build Coastguard Worker int i, scale;
155*e5436536SAndroid Build Coastguard Worker
156*e5436536SAndroid Build Coastguard Worker for (i = 0; i < timeSlots; i++) {
157*e5436536SAndroid Build Coastguard Worker x = fDivNormHighPrec((FIXP_DBL)i, (FIXP_DBL)timeSlots, &scale);
158*e5436536SAndroid Build Coastguard Worker
159*e5436536SAndroid Build Coastguard Worker if (scale < 0) {
160*e5436536SAndroid Build Coastguard Worker pTaperWin[i] = FX_DBL2FX_WIN(x >> (-scale));
161*e5436536SAndroid Build Coastguard Worker } else {
162*e5436536SAndroid Build Coastguard Worker pTaperWin[i] = FX_DBL2FX_WIN(x << (scale));
163*e5436536SAndroid Build Coastguard Worker }
164*e5436536SAndroid Build Coastguard Worker }
165*e5436536SAndroid Build Coastguard Worker pTaperWin[timeSlots] = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL);
166*e5436536SAndroid Build Coastguard Worker }
167*e5436536SAndroid Build Coastguard Worker
fdk_sacenc_frameWindow_Create(HANDLE_FRAMEWINDOW * phFrameWindow)168*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_frameWindow_Create(
169*e5436536SAndroid Build Coastguard Worker HANDLE_FRAMEWINDOW *phFrameWindow) {
170*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
171*e5436536SAndroid Build Coastguard Worker
172*e5436536SAndroid Build Coastguard Worker if (NULL == phFrameWindow) {
173*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
174*e5436536SAndroid Build Coastguard Worker } else {
175*e5436536SAndroid Build Coastguard Worker /* Memory Allocation */
176*e5436536SAndroid Build Coastguard Worker FDK_ALLOCATE_MEMORY_1D(*phFrameWindow, 1, FRAMEWINDOW);
177*e5436536SAndroid Build Coastguard Worker }
178*e5436536SAndroid Build Coastguard Worker return error;
179*e5436536SAndroid Build Coastguard Worker
180*e5436536SAndroid Build Coastguard Worker bail:
181*e5436536SAndroid Build Coastguard Worker fdk_sacenc_frameWindow_Destroy(phFrameWindow);
182*e5436536SAndroid Build Coastguard Worker return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error);
183*e5436536SAndroid Build Coastguard Worker }
184*e5436536SAndroid Build Coastguard Worker
fdk_sacenc_frameWindow_Init(HANDLE_FRAMEWINDOW hFrameWindow,const FRAMEWINDOW_CONFIG * const pFrameWindowConfig)185*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_frameWindow_Init(
186*e5436536SAndroid Build Coastguard Worker HANDLE_FRAMEWINDOW hFrameWindow,
187*e5436536SAndroid Build Coastguard Worker const FRAMEWINDOW_CONFIG *const pFrameWindowConfig) {
188*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
189*e5436536SAndroid Build Coastguard Worker
190*e5436536SAndroid Build Coastguard Worker if ((hFrameWindow == NULL) || (pFrameWindowConfig == NULL)) {
191*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
192*e5436536SAndroid Build Coastguard Worker } else if (pFrameWindowConfig->nTimeSlotsMax < 0) {
193*e5436536SAndroid Build Coastguard Worker error = SACENC_INIT_ERROR;
194*e5436536SAndroid Build Coastguard Worker } else {
195*e5436536SAndroid Build Coastguard Worker int ts;
196*e5436536SAndroid Build Coastguard Worker hFrameWindow->bFrameKeep = pFrameWindowConfig->bFrameKeep;
197*e5436536SAndroid Build Coastguard Worker hFrameWindow->nTimeSlotsMax = pFrameWindowConfig->nTimeSlotsMax;
198*e5436536SAndroid Build Coastguard Worker
199*e5436536SAndroid Build Coastguard Worker FIXP_WIN winMaxVal = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL);
200*e5436536SAndroid Build Coastguard Worker int timeSlots = pFrameWindowConfig->nTimeSlotsMax;
201*e5436536SAndroid Build Coastguard Worker {
202*e5436536SAndroid Build Coastguard Worker hFrameWindow->startSlope = 0;
203*e5436536SAndroid Build Coastguard Worker hFrameWindow->stopSlope = ((3 * timeSlots) >> 1) - 1;
204*e5436536SAndroid Build Coastguard Worker hFrameWindow->startRect = timeSlots >> 1;
205*e5436536SAndroid Build Coastguard Worker hFrameWindow->stopRect = timeSlots;
206*e5436536SAndroid Build Coastguard Worker calcTaperWin(hFrameWindow->pTaperSyn__FDK, timeSlots >> 1);
207*e5436536SAndroid Build Coastguard Worker hFrameWindow->taperSynLen = timeSlots >> 1;
208*e5436536SAndroid Build Coastguard Worker }
209*e5436536SAndroid Build Coastguard Worker
210*e5436536SAndroid Build Coastguard Worker /* Calculate Taper for non-rect. ana. windows */
211*e5436536SAndroid Build Coastguard Worker hFrameWindow->taperAnaLen =
212*e5436536SAndroid Build Coastguard Worker hFrameWindow->startRect - hFrameWindow->startSlope;
213*e5436536SAndroid Build Coastguard Worker for (ts = 0; ts < hFrameWindow->taperAnaLen; ts++) {
214*e5436536SAndroid Build Coastguard Worker { hFrameWindow->pTaperAna__FDK[ts] = winMaxVal; }
215*e5436536SAndroid Build Coastguard Worker }
216*e5436536SAndroid Build Coastguard Worker }
217*e5436536SAndroid Build Coastguard Worker
218*e5436536SAndroid Build Coastguard Worker return error;
219*e5436536SAndroid Build Coastguard Worker }
220*e5436536SAndroid Build Coastguard Worker
fdk_sacenc_frameWindow_Destroy(HANDLE_FRAMEWINDOW * phFrameWindow)221*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_frameWindow_Destroy(
222*e5436536SAndroid Build Coastguard Worker HANDLE_FRAMEWINDOW *phFrameWindow) {
223*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
224*e5436536SAndroid Build Coastguard Worker
225*e5436536SAndroid Build Coastguard Worker if ((NULL != phFrameWindow) && (NULL != *phFrameWindow)) {
226*e5436536SAndroid Build Coastguard Worker FDKfree(*phFrameWindow);
227*e5436536SAndroid Build Coastguard Worker *phFrameWindow = NULL;
228*e5436536SAndroid Build Coastguard Worker }
229*e5436536SAndroid Build Coastguard Worker return error;
230*e5436536SAndroid Build Coastguard Worker }
231*e5436536SAndroid Build Coastguard Worker
FrameWinList_Reset(FRAMEWIN_LIST * const pFrameWinList)232*e5436536SAndroid Build Coastguard Worker static FDK_SACENC_ERROR FrameWinList_Reset(FRAMEWIN_LIST *const pFrameWinList) {
233*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
234*e5436536SAndroid Build Coastguard Worker
235*e5436536SAndroid Build Coastguard Worker if (NULL == pFrameWinList) {
236*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
237*e5436536SAndroid Build Coastguard Worker } else {
238*e5436536SAndroid Build Coastguard Worker int k = 0;
239*e5436536SAndroid Build Coastguard Worker for (k = 0; k < MAX_NUM_PARAMS; k++) {
240*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[k].slot = -1;
241*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[k].hold = FW_INTP;
242*e5436536SAndroid Build Coastguard Worker }
243*e5436536SAndroid Build Coastguard Worker pFrameWinList->n = 0;
244*e5436536SAndroid Build Coastguard Worker }
245*e5436536SAndroid Build Coastguard Worker return error;
246*e5436536SAndroid Build Coastguard Worker }
247*e5436536SAndroid Build Coastguard Worker
FrameWindowList_Add(FRAMEWIN_LIST * const pFrameWinList,const INT slot,const FW_SLOTTYPE hold)248*e5436536SAndroid Build Coastguard Worker static FDK_SACENC_ERROR FrameWindowList_Add(FRAMEWIN_LIST *const pFrameWinList,
249*e5436536SAndroid Build Coastguard Worker const INT slot,
250*e5436536SAndroid Build Coastguard Worker const FW_SLOTTYPE hold) {
251*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
252*e5436536SAndroid Build Coastguard Worker
253*e5436536SAndroid Build Coastguard Worker if (NULL == pFrameWinList) {
254*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
255*e5436536SAndroid Build Coastguard Worker } else {
256*e5436536SAndroid Build Coastguard Worker if (pFrameWinList->n >= MAX_NUM_PARAMS) { /* Place left in List ?*/
257*e5436536SAndroid Build Coastguard Worker error = SACENC_PARAM_ERROR;
258*e5436536SAndroid Build Coastguard Worker } else if (pFrameWinList->n > 0 &&
259*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[pFrameWinList->n - 1].slot - slot > 0) {
260*e5436536SAndroid Build Coastguard Worker error = SACENC_PARAM_ERROR;
261*e5436536SAndroid Build Coastguard Worker } else {
262*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[pFrameWinList->n].slot = slot;
263*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[pFrameWinList->n].hold = hold;
264*e5436536SAndroid Build Coastguard Worker pFrameWinList->n++;
265*e5436536SAndroid Build Coastguard Worker }
266*e5436536SAndroid Build Coastguard Worker }
267*e5436536SAndroid Build Coastguard Worker return error;
268*e5436536SAndroid Build Coastguard Worker }
269*e5436536SAndroid Build Coastguard Worker
FrameWindowList_Remove(FRAMEWIN_LIST * const pFrameWinList,const INT idx)270*e5436536SAndroid Build Coastguard Worker static FDK_SACENC_ERROR FrameWindowList_Remove(
271*e5436536SAndroid Build Coastguard Worker FRAMEWIN_LIST *const pFrameWinList, const INT idx) {
272*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
273*e5436536SAndroid Build Coastguard Worker
274*e5436536SAndroid Build Coastguard Worker if (NULL == pFrameWinList) {
275*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
276*e5436536SAndroid Build Coastguard Worker } else {
277*e5436536SAndroid Build Coastguard Worker int k = 0;
278*e5436536SAndroid Build Coastguard Worker if (idx < 0 || idx >= MAX_NUM_PARAMS) {
279*e5436536SAndroid Build Coastguard Worker error = SACENC_PARAM_ERROR;
280*e5436536SAndroid Build Coastguard Worker } else if (pFrameWinList->n > 0) {
281*e5436536SAndroid Build Coastguard Worker if (idx == MAX_NUM_PARAMS - 1) {
282*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[idx].slot = -1;
283*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[idx].hold = FW_INTP;
284*e5436536SAndroid Build Coastguard Worker } else {
285*e5436536SAndroid Build Coastguard Worker for (k = idx; k < MAX_NUM_PARAMS - 1; k++) {
286*e5436536SAndroid Build Coastguard Worker pFrameWinList->dat[k] = pFrameWinList->dat[k + 1];
287*e5436536SAndroid Build Coastguard Worker }
288*e5436536SAndroid Build Coastguard Worker }
289*e5436536SAndroid Build Coastguard Worker pFrameWinList->n--;
290*e5436536SAndroid Build Coastguard Worker }
291*e5436536SAndroid Build Coastguard Worker }
292*e5436536SAndroid Build Coastguard Worker return error;
293*e5436536SAndroid Build Coastguard Worker }
294*e5436536SAndroid Build Coastguard Worker
FrameWindowList_Limit(FRAMEWIN_LIST * const pFrameWinList,const INT ll,const INT ul)295*e5436536SAndroid Build Coastguard Worker static FDK_SACENC_ERROR FrameWindowList_Limit(
296*e5436536SAndroid Build Coastguard Worker FRAMEWIN_LIST *const pFrameWinList, const INT ll /*lower limit*/,
297*e5436536SAndroid Build Coastguard Worker const INT ul /*upper limit*/
298*e5436536SAndroid Build Coastguard Worker ) {
299*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
300*e5436536SAndroid Build Coastguard Worker
301*e5436536SAndroid Build Coastguard Worker if (NULL == pFrameWinList) {
302*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
303*e5436536SAndroid Build Coastguard Worker } else {
304*e5436536SAndroid Build Coastguard Worker int k = 0;
305*e5436536SAndroid Build Coastguard Worker for (k = 0; k < pFrameWinList->n; k++) {
306*e5436536SAndroid Build Coastguard Worker if (pFrameWinList->dat[k].slot < ll || pFrameWinList->dat[k].slot > ul) {
307*e5436536SAndroid Build Coastguard Worker FrameWindowList_Remove(pFrameWinList, k);
308*e5436536SAndroid Build Coastguard Worker --k;
309*e5436536SAndroid Build Coastguard Worker }
310*e5436536SAndroid Build Coastguard Worker }
311*e5436536SAndroid Build Coastguard Worker }
312*e5436536SAndroid Build Coastguard Worker return error;
313*e5436536SAndroid Build Coastguard Worker }
314*e5436536SAndroid Build Coastguard Worker
fdk_sacenc_frameWindow_GetWindow(HANDLE_FRAMEWINDOW hFrameWindow,INT tr_pos[MAX_NUM_PARAMS],const INT timeSlots,FRAMINGINFO * const pFramingInfo,FIXP_WIN * pWindowAna__FDK[MAX_NUM_PARAMS],FRAMEWIN_LIST * const pFrameWinList,const INT avoid_keep)315*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_frameWindow_GetWindow(
316*e5436536SAndroid Build Coastguard Worker HANDLE_FRAMEWINDOW hFrameWindow, INT tr_pos[MAX_NUM_PARAMS],
317*e5436536SAndroid Build Coastguard Worker const INT timeSlots, FRAMINGINFO *const pFramingInfo,
318*e5436536SAndroid Build Coastguard Worker FIXP_WIN *pWindowAna__FDK[MAX_NUM_PARAMS],
319*e5436536SAndroid Build Coastguard Worker FRAMEWIN_LIST *const pFrameWinList, const INT avoid_keep) {
320*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
321*e5436536SAndroid Build Coastguard Worker
322*e5436536SAndroid Build Coastguard Worker if ((hFrameWindow == NULL) || (tr_pos == NULL) || (pFramingInfo == NULL) ||
323*e5436536SAndroid Build Coastguard Worker (pFrameWinList == NULL) || (pWindowAna__FDK == NULL)) {
324*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
325*e5436536SAndroid Build Coastguard Worker } else {
326*e5436536SAndroid Build Coastguard Worker const VAR_TYPE varType = VAR_HOLD;
327*e5436536SAndroid Build Coastguard Worker const int tranL = 4;
328*e5436536SAndroid Build Coastguard Worker int winCnt = 0;
329*e5436536SAndroid Build Coastguard Worker int w, ps;
330*e5436536SAndroid Build Coastguard Worker
331*e5436536SAndroid Build Coastguard Worker int startSlope = hFrameWindow->startSlope;
332*e5436536SAndroid Build Coastguard Worker int stopSlope = hFrameWindow->stopSlope;
333*e5436536SAndroid Build Coastguard Worker int startRect = hFrameWindow->startRect;
334*e5436536SAndroid Build Coastguard Worker int stopRect = hFrameWindow->stopRect;
335*e5436536SAndroid Build Coastguard Worker int taperAnaLen = hFrameWindow->taperAnaLen;
336*e5436536SAndroid Build Coastguard Worker
337*e5436536SAndroid Build Coastguard Worker FIXP_WIN winMaxVal = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL);
338*e5436536SAndroid Build Coastguard Worker FIXP_WIN applyRightWindowGain__FDK[MAX_NUM_PARAMS];
339*e5436536SAndroid Build Coastguard Worker FIXP_WIN *pTaperAna__FDK = hFrameWindow->pTaperAna__FDK;
340*e5436536SAndroid Build Coastguard Worker
341*e5436536SAndroid Build Coastguard Worker /* sanity check */
342*e5436536SAndroid Build Coastguard Worker for (ps = 0; ps < MAX_NUM_PARAMS; ps++) {
343*e5436536SAndroid Build Coastguard Worker if (pWindowAna__FDK[ps] == NULL) {
344*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
345*e5436536SAndroid Build Coastguard Worker goto bail;
346*e5436536SAndroid Build Coastguard Worker }
347*e5436536SAndroid Build Coastguard Worker }
348*e5436536SAndroid Build Coastguard Worker
349*e5436536SAndroid Build Coastguard Worker if ((timeSlots > hFrameWindow->nTimeSlotsMax) || (timeSlots < 0)) {
350*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_CONFIG;
351*e5436536SAndroid Build Coastguard Worker goto bail;
352*e5436536SAndroid Build Coastguard Worker }
353*e5436536SAndroid Build Coastguard Worker
354*e5436536SAndroid Build Coastguard Worker /* Reset */
355*e5436536SAndroid Build Coastguard Worker if (SACENC_OK != (error = FrameWinList_Reset(pFrameWinList))) goto bail;
356*e5436536SAndroid Build Coastguard Worker
357*e5436536SAndroid Build Coastguard Worker FDKmemclear(applyRightWindowGain__FDK, sizeof(applyRightWindowGain__FDK));
358*e5436536SAndroid Build Coastguard Worker
359*e5436536SAndroid Build Coastguard Worker if (tr_pos[0] > -1) { /* Transients in first (left) half? */
360*e5436536SAndroid Build Coastguard Worker int p_l = tr_pos[0];
361*e5436536SAndroid Build Coastguard Worker winCnt = 0;
362*e5436536SAndroid Build Coastguard Worker
363*e5436536SAndroid Build Coastguard Worker /* Create Parameter Positions */
364*e5436536SAndroid Build Coastguard Worker switch (varType) {
365*e5436536SAndroid Build Coastguard Worker case VAR_HOLD:
366*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
367*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Add(pFrameWinList, p_l - 1, FW_HOLD)))
368*e5436536SAndroid Build Coastguard Worker goto bail;
369*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
370*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Add(pFrameWinList, p_l, FW_INTP)))
371*e5436536SAndroid Build Coastguard Worker goto bail;
372*e5436536SAndroid Build Coastguard Worker break;
373*e5436536SAndroid Build Coastguard Worker case VAR_ISOLATE:
374*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
375*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Add(pFrameWinList, p_l - 1, FW_HOLD)))
376*e5436536SAndroid Build Coastguard Worker goto bail;
377*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
378*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Add(pFrameWinList, p_l, FW_INTP)))
379*e5436536SAndroid Build Coastguard Worker goto bail;
380*e5436536SAndroid Build Coastguard Worker if (SACENC_OK != (error = FrameWindowList_Add(pFrameWinList,
381*e5436536SAndroid Build Coastguard Worker p_l + tranL, FW_HOLD)))
382*e5436536SAndroid Build Coastguard Worker goto bail;
383*e5436536SAndroid Build Coastguard Worker if (SACENC_OK != (error = FrameWindowList_Add(
384*e5436536SAndroid Build Coastguard Worker pFrameWinList, p_l + tranL + 1, FW_INTP)))
385*e5436536SAndroid Build Coastguard Worker goto bail;
386*e5436536SAndroid Build Coastguard Worker break;
387*e5436536SAndroid Build Coastguard Worker default:
388*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_CONFIG;
389*e5436536SAndroid Build Coastguard Worker break;
390*e5436536SAndroid Build Coastguard Worker }
391*e5436536SAndroid Build Coastguard Worker
392*e5436536SAndroid Build Coastguard Worker /* Outside of frame? => Kick Out */
393*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
394*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Limit(pFrameWinList, 0, timeSlots - 1)))
395*e5436536SAndroid Build Coastguard Worker goto bail;
396*e5436536SAndroid Build Coastguard Worker
397*e5436536SAndroid Build Coastguard Worker /* Add timeSlots as temporary border for window creation */
398*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
399*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Add(pFrameWinList, timeSlots - 1, FW_HOLD)))
400*e5436536SAndroid Build Coastguard Worker goto bail;
401*e5436536SAndroid Build Coastguard Worker
402*e5436536SAndroid Build Coastguard Worker /* Create Windows */
403*e5436536SAndroid Build Coastguard Worker for (ps = 0; ps < pFrameWinList->n - 1; ps++) {
404*e5436536SAndroid Build Coastguard Worker if (FW_HOLD != pFrameWinList->dat[ps].hold) {
405*e5436536SAndroid Build Coastguard Worker int const start = pFrameWinList->dat[ps].slot;
406*e5436536SAndroid Build Coastguard Worker int const stop = pFrameWinList->dat[ps + 1].slot;
407*e5436536SAndroid Build Coastguard Worker
408*e5436536SAndroid Build Coastguard Worker /* Analysis Window */
409*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(pWindowAna__FDK[winCnt], FX_DBL2FX_WIN((FIXP_DBL)0),
410*e5436536SAndroid Build Coastguard Worker start);
411*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[winCnt][start], winMaxVal,
412*e5436536SAndroid Build Coastguard Worker stop - start + 1);
413*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[winCnt][stop + 1],
414*e5436536SAndroid Build Coastguard Worker FX_DBL2FX_WIN((FIXP_DBL)0), timeSlots - stop - 1);
415*e5436536SAndroid Build Coastguard Worker
416*e5436536SAndroid Build Coastguard Worker applyRightWindowGain__FDK[winCnt] =
417*e5436536SAndroid Build Coastguard Worker pWindowAna__FDK[winCnt][timeSlots - 1];
418*e5436536SAndroid Build Coastguard Worker winCnt++;
419*e5436536SAndroid Build Coastguard Worker }
420*e5436536SAndroid Build Coastguard Worker } /* ps */
421*e5436536SAndroid Build Coastguard Worker
422*e5436536SAndroid Build Coastguard Worker /* Pop temporary frame border */
423*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
424*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Remove(pFrameWinList, pFrameWinList->n - 1)))
425*e5436536SAndroid Build Coastguard Worker goto bail;
426*e5436536SAndroid Build Coastguard Worker } else { /* No transient in left half of ana. window */
427*e5436536SAndroid Build Coastguard Worker winCnt = 0;
428*e5436536SAndroid Build Coastguard Worker
429*e5436536SAndroid Build Coastguard Worker /* Add paramter set at end of frame */
430*e5436536SAndroid Build Coastguard Worker if (SACENC_OK !=
431*e5436536SAndroid Build Coastguard Worker (error = FrameWindowList_Add(pFrameWinList, timeSlots - 1, FW_INTP)))
432*e5436536SAndroid Build Coastguard Worker goto bail;
433*e5436536SAndroid Build Coastguard Worker /* Analysis Window */
434*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(pWindowAna__FDK[winCnt], FX_DBL2FX_WIN((FIXP_DBL)0),
435*e5436536SAndroid Build Coastguard Worker startSlope);
436*e5436536SAndroid Build Coastguard Worker FDKmemcpy_flex(&pWindowAna__FDK[winCnt][startSlope], 1, pTaperAna__FDK, 1,
437*e5436536SAndroid Build Coastguard Worker taperAnaLen);
438*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[winCnt][startRect], winMaxVal,
439*e5436536SAndroid Build Coastguard Worker timeSlots - startRect);
440*e5436536SAndroid Build Coastguard Worker
441*e5436536SAndroid Build Coastguard Worker applyRightWindowGain__FDK[winCnt] = winMaxVal;
442*e5436536SAndroid Build Coastguard Worker winCnt++;
443*e5436536SAndroid Build Coastguard Worker } /* if (tr_pos[0] > -1) */
444*e5436536SAndroid Build Coastguard Worker
445*e5436536SAndroid Build Coastguard Worker for (w = 0; w < winCnt; w++) {
446*e5436536SAndroid Build Coastguard Worker if (applyRightWindowGain__FDK[w] > (FIXP_WIN)0) {
447*e5436536SAndroid Build Coastguard Worker if (tr_pos[1] > -1) { /* Transients in second (right) half? */
448*e5436536SAndroid Build Coastguard Worker int p_r = tr_pos[1];
449*e5436536SAndroid Build Coastguard Worker
450*e5436536SAndroid Build Coastguard Worker /* Analysis Window */
451*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[w][timeSlots], winMaxVal,
452*e5436536SAndroid Build Coastguard Worker p_r - timeSlots);
453*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[w][p_r], FX_DBL2FX_WIN((FIXP_DBL)0),
454*e5436536SAndroid Build Coastguard Worker 2 * timeSlots - p_r);
455*e5436536SAndroid Build Coastguard Worker
456*e5436536SAndroid Build Coastguard Worker } else { /* No transient in right half of ana. window */
457*e5436536SAndroid Build Coastguard Worker /* Analysis Window */
458*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[w][timeSlots], winMaxVal,
459*e5436536SAndroid Build Coastguard Worker stopRect - timeSlots + 1);
460*e5436536SAndroid Build Coastguard Worker FDKmemcpy_flex(&pWindowAna__FDK[w][stopRect], 1,
461*e5436536SAndroid Build Coastguard Worker &pTaperAna__FDK[taperAnaLen - 1], -1, taperAnaLen);
462*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[w][stopSlope + 1],
463*e5436536SAndroid Build Coastguard Worker FX_DBL2FX_WIN((FIXP_DBL)0),
464*e5436536SAndroid Build Coastguard Worker 2 * timeSlots - stopSlope - 1);
465*e5436536SAndroid Build Coastguard Worker
466*e5436536SAndroid Build Coastguard Worker } /* if (tr_pos[1] > -1) */
467*e5436536SAndroid Build Coastguard Worker
468*e5436536SAndroid Build Coastguard Worker /* Weight */
469*e5436536SAndroid Build Coastguard Worker if (applyRightWindowGain__FDK[w] < winMaxVal) {
470*e5436536SAndroid Build Coastguard Worker int ts;
471*e5436536SAndroid Build Coastguard Worker for (ts = 0; ts < timeSlots; ts++) {
472*e5436536SAndroid Build Coastguard Worker pWindowAna__FDK[w][timeSlots + ts] =
473*e5436536SAndroid Build Coastguard Worker FX_DBL2FX_WIN(fMult(pWindowAna__FDK[w][timeSlots + ts],
474*e5436536SAndroid Build Coastguard Worker applyRightWindowGain__FDK[w]));
475*e5436536SAndroid Build Coastguard Worker }
476*e5436536SAndroid Build Coastguard Worker }
477*e5436536SAndroid Build Coastguard Worker } /* if (applyRightWindowGain[w] > 0.0f) */
478*e5436536SAndroid Build Coastguard Worker else {
479*e5436536SAndroid Build Coastguard Worker /* All Zero */
480*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(&pWindowAna__FDK[w][timeSlots],
481*e5436536SAndroid Build Coastguard Worker FX_DBL2FX_WIN((FIXP_DBL)0), timeSlots);
482*e5436536SAndroid Build Coastguard Worker }
483*e5436536SAndroid Build Coastguard Worker } /* loop over windows */
484*e5436536SAndroid Build Coastguard Worker
485*e5436536SAndroid Build Coastguard Worker if (hFrameWindow->bFrameKeep == 1) {
486*e5436536SAndroid Build Coastguard Worker FDKmemcpy_flex(&pWindowAna__FDK[0][2 * timeSlots], 1,
487*e5436536SAndroid Build Coastguard Worker &pWindowAna__FDK[0][timeSlots], 1, timeSlots);
488*e5436536SAndroid Build Coastguard Worker FDKmemcpy_flex(&pWindowAna__FDK[0][timeSlots], 1, pWindowAna__FDK[0], 1,
489*e5436536SAndroid Build Coastguard Worker timeSlots);
490*e5436536SAndroid Build Coastguard Worker
491*e5436536SAndroid Build Coastguard Worker if (avoid_keep != 0) {
492*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(pWindowAna__FDK[0], FX_DBL2FX_WIN((FIXP_DBL)0),
493*e5436536SAndroid Build Coastguard Worker timeSlots);
494*e5436536SAndroid Build Coastguard Worker } else {
495*e5436536SAndroid Build Coastguard Worker FDKmemset_flex(pWindowAna__FDK[0], winMaxVal, timeSlots);
496*e5436536SAndroid Build Coastguard Worker }
497*e5436536SAndroid Build Coastguard Worker } /* if (hFrameWindow->bFrameKeep==1) */
498*e5436536SAndroid Build Coastguard Worker
499*e5436536SAndroid Build Coastguard Worker /* Feed Info to Bitstream Formatter */
500*e5436536SAndroid Build Coastguard Worker pFramingInfo->numParamSets = pFrameWinList->n;
501*e5436536SAndroid Build Coastguard Worker pFramingInfo->bsFramingType = 1; /* variable framing */
502*e5436536SAndroid Build Coastguard Worker for (ps = 0; ps < pFramingInfo->numParamSets; ps++) {
503*e5436536SAndroid Build Coastguard Worker pFramingInfo->bsParamSlots[ps] = pFrameWinList->dat[ps].slot;
504*e5436536SAndroid Build Coastguard Worker }
505*e5436536SAndroid Build Coastguard Worker
506*e5436536SAndroid Build Coastguard Worker /* if there is just one param set at last slot,
507*e5436536SAndroid Build Coastguard Worker use fixed framing to save some bits */
508*e5436536SAndroid Build Coastguard Worker if ((pFramingInfo->numParamSets == 1) &&
509*e5436536SAndroid Build Coastguard Worker (pFramingInfo->bsParamSlots[0] == timeSlots - 1)) {
510*e5436536SAndroid Build Coastguard Worker pFramingInfo->bsFramingType = 0;
511*e5436536SAndroid Build Coastguard Worker }
512*e5436536SAndroid Build Coastguard Worker
513*e5436536SAndroid Build Coastguard Worker } /* valid handle */
514*e5436536SAndroid Build Coastguard Worker
515*e5436536SAndroid Build Coastguard Worker bail:
516*e5436536SAndroid Build Coastguard Worker
517*e5436536SAndroid Build Coastguard Worker return error;
518*e5436536SAndroid Build Coastguard Worker }
519*e5436536SAndroid Build Coastguard Worker
fdk_sacenc_analysisWindowing(const INT nTimeSlots,const INT startTimeSlot,FIXP_WIN * pFrameWindowAna__FDK,const FIXP_DPK * const * const ppDataIn__FDK,FIXP_DPK * const * const ppDataOut__FDK,const INT nHybridBands,const INT dim)520*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_analysisWindowing(
521*e5436536SAndroid Build Coastguard Worker const INT nTimeSlots, const INT startTimeSlot,
522*e5436536SAndroid Build Coastguard Worker FIXP_WIN *pFrameWindowAna__FDK, const FIXP_DPK *const *const ppDataIn__FDK,
523*e5436536SAndroid Build Coastguard Worker FIXP_DPK *const *const ppDataOut__FDK, const INT nHybridBands,
524*e5436536SAndroid Build Coastguard Worker const INT dim) {
525*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR error = SACENC_OK;
526*e5436536SAndroid Build Coastguard Worker
527*e5436536SAndroid Build Coastguard Worker if ((pFrameWindowAna__FDK == NULL) || (ppDataIn__FDK == NULL) ||
528*e5436536SAndroid Build Coastguard Worker (ppDataOut__FDK == NULL)) {
529*e5436536SAndroid Build Coastguard Worker error = SACENC_INVALID_HANDLE;
530*e5436536SAndroid Build Coastguard Worker } else {
531*e5436536SAndroid Build Coastguard Worker int i, ts;
532*e5436536SAndroid Build Coastguard Worker FIXP_WIN maxVal = FX_DBL2FX_WIN((FIXP_DBL)MAXVAL_DBL);
533*e5436536SAndroid Build Coastguard Worker
534*e5436536SAndroid Build Coastguard Worker if (dim == FW_CHANGE_DIM) {
535*e5436536SAndroid Build Coastguard Worker for (ts = startTimeSlot; ts < nTimeSlots; ts++) {
536*e5436536SAndroid Build Coastguard Worker FIXP_WIN win = pFrameWindowAna__FDK[ts];
537*e5436536SAndroid Build Coastguard Worker if (win == maxVal) {
538*e5436536SAndroid Build Coastguard Worker for (i = 0; i < nHybridBands; i++) {
539*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[i][ts].v.re = ppDataIn__FDK[ts][i].v.re;
540*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[i][ts].v.im = ppDataIn__FDK[ts][i].v.im;
541*e5436536SAndroid Build Coastguard Worker }
542*e5436536SAndroid Build Coastguard Worker } else {
543*e5436536SAndroid Build Coastguard Worker for (i = 0; i < nHybridBands; i++) {
544*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[i][ts].v.re = fMult(win, ppDataIn__FDK[ts][i].v.re);
545*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[i][ts].v.im = fMult(win, ppDataIn__FDK[ts][i].v.im);
546*e5436536SAndroid Build Coastguard Worker }
547*e5436536SAndroid Build Coastguard Worker }
548*e5436536SAndroid Build Coastguard Worker } /* ts */
549*e5436536SAndroid Build Coastguard Worker } else {
550*e5436536SAndroid Build Coastguard Worker for (ts = startTimeSlot; ts < nTimeSlots; ts++) {
551*e5436536SAndroid Build Coastguard Worker FIXP_WIN win = pFrameWindowAna__FDK[ts];
552*e5436536SAndroid Build Coastguard Worker if (win == maxVal) {
553*e5436536SAndroid Build Coastguard Worker for (i = 0; i < nHybridBands; i++) {
554*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[ts][i].v.re = ppDataIn__FDK[ts][i].v.re;
555*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[ts][i].v.im = ppDataIn__FDK[ts][i].v.im;
556*e5436536SAndroid Build Coastguard Worker }
557*e5436536SAndroid Build Coastguard Worker } else {
558*e5436536SAndroid Build Coastguard Worker for (i = 0; i < nHybridBands; i++) {
559*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[ts][i].v.re = fMult(win, ppDataIn__FDK[ts][i].v.re);
560*e5436536SAndroid Build Coastguard Worker ppDataOut__FDK[ts][i].v.im = fMult(win, ppDataIn__FDK[ts][i].v.im);
561*e5436536SAndroid Build Coastguard Worker }
562*e5436536SAndroid Build Coastguard Worker }
563*e5436536SAndroid Build Coastguard Worker } /* ts */
564*e5436536SAndroid Build Coastguard Worker }
565*e5436536SAndroid Build Coastguard Worker }
566*e5436536SAndroid Build Coastguard Worker
567*e5436536SAndroid Build Coastguard Worker return error;
568*e5436536SAndroid Build Coastguard Worker }
569