xref: /aosp_15_r20/external/aac/libSACenc/src/sacenc_framewindowing.cpp (revision e54365361535b070c2db7374cec45c159c7d0e7a)
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