xref: /aosp_15_r20/external/aac/libSACenc/src/sacenc_delay.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):   Christian Goettlinger
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: Encoder Library Interface
100*e5436536SAndroid Build Coastguard Worker                 delay management of the encoder
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  This file contains all delay infrastructure
107*e5436536SAndroid Build Coastguard Worker  ******************************************************************************/
108*e5436536SAndroid Build Coastguard Worker 
109*e5436536SAndroid Build Coastguard Worker /* Includes ******************************************************************/
110*e5436536SAndroid Build Coastguard Worker #include "sacenc_delay.h"
111*e5436536SAndroid Build Coastguard Worker #include "sacenc_const.h"
112*e5436536SAndroid Build Coastguard Worker #include "FDK_matrixCalloc.h"
113*e5436536SAndroid Build Coastguard Worker 
114*e5436536SAndroid Build Coastguard Worker /* Defines *******************************************************************/
115*e5436536SAndroid Build Coastguard Worker 
116*e5436536SAndroid Build Coastguard Worker /* Data Types ****************************************************************/
117*e5436536SAndroid Build Coastguard Worker struct DELAY {
118*e5436536SAndroid Build Coastguard Worker   struct DELAY_CONFIG {
119*e5436536SAndroid Build Coastguard Worker     /* Routing Config Switches*/
120*e5436536SAndroid Build Coastguard Worker     INT bDmxAlign;
121*e5436536SAndroid Build Coastguard Worker     INT bTimeDomDmx;
122*e5436536SAndroid Build Coastguard Worker     INT bMinimizeDelay;
123*e5436536SAndroid Build Coastguard Worker     INT bSacTimeAlignmentDynamicOut;
124*e5436536SAndroid Build Coastguard Worker 
125*e5436536SAndroid Build Coastguard Worker     /* Needed Input Variables*/
126*e5436536SAndroid Build Coastguard Worker     INT nQmfLen;
127*e5436536SAndroid Build Coastguard Worker     INT nFrameLen;
128*e5436536SAndroid Build Coastguard Worker     INT nSurroundDelay;
129*e5436536SAndroid Build Coastguard Worker     INT nArbDmxDelay;
130*e5436536SAndroid Build Coastguard Worker     INT nLimiterDelay;
131*e5436536SAndroid Build Coastguard Worker     INT nCoreCoderDelay;
132*e5436536SAndroid Build Coastguard Worker     INT nSacStreamMuxDelay;
133*e5436536SAndroid Build Coastguard Worker     INT nSacTimeAlignment; /* Overwritten, if bSacTimeAlignmentDynamicOut */
134*e5436536SAndroid Build Coastguard Worker   } config;
135*e5436536SAndroid Build Coastguard Worker 
136*e5436536SAndroid Build Coastguard Worker   /* Variable Delaybuffers -> Delays */
137*e5436536SAndroid Build Coastguard Worker   INT nDmxAlignBuffer;
138*e5436536SAndroid Build Coastguard Worker   INT nSurroundAnalysisBuffer;
139*e5436536SAndroid Build Coastguard Worker   INT nArbDmxAnalysisBuffer;
140*e5436536SAndroid Build Coastguard Worker   INT nOutputAudioBuffer;
141*e5436536SAndroid Build Coastguard Worker   INT nBitstreamFrameBuffer;
142*e5436536SAndroid Build Coastguard Worker   INT nOutputAudioQmfFrameBuffer;
143*e5436536SAndroid Build Coastguard Worker   INT nDiscardOutFrames;
144*e5436536SAndroid Build Coastguard Worker 
145*e5436536SAndroid Build Coastguard Worker   /* Variable Delaybuffers Computation Variables */
146*e5436536SAndroid Build Coastguard Worker   INT nBitstreamFrameBufferSize;
147*e5436536SAndroid Build Coastguard Worker 
148*e5436536SAndroid Build Coastguard Worker   /* Output: Infos */
149*e5436536SAndroid Build Coastguard Worker   INT nInfoDmxDelay; /* Delay of the downmixed signal after the space encoder */
150*e5436536SAndroid Build Coastguard Worker   INT nInfoCodecDelay; /* Delay of the whole en-/decoder including CoreCoder */
151*e5436536SAndroid Build Coastguard Worker   INT nInfoDecoderDelay; /* Delay of the Mpeg Surround decoder */
152*e5436536SAndroid Build Coastguard Worker };
153*e5436536SAndroid Build Coastguard Worker 
154*e5436536SAndroid Build Coastguard Worker /* Constants *****************************************************************/
155*e5436536SAndroid Build Coastguard Worker 
156*e5436536SAndroid Build Coastguard Worker /* Function / Class Declarations *********************************************/
157*e5436536SAndroid Build Coastguard Worker 
158*e5436536SAndroid Build Coastguard Worker /* Function / Class Definition ***********************************************/
159*e5436536SAndroid Build Coastguard Worker 
160*e5436536SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------------
161*e5436536SAndroid Build Coastguard Worker functionname: fdk_sacenc_delay_Open()
162*e5436536SAndroid Build Coastguard Worker description:  initializes Delays
163*e5436536SAndroid Build Coastguard Worker returns:      noError on success, an apropriate error code else
164*e5436536SAndroid Build Coastguard Worker -----------------------------------------------------------------------------*/
fdk_sacenc_delay_Open(HANDLE_DELAY * phDelay)165*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_Open(HANDLE_DELAY *phDelay) {
166*e5436536SAndroid Build Coastguard Worker   FDK_SACENC_ERROR error = SACENC_OK;
167*e5436536SAndroid Build Coastguard Worker 
168*e5436536SAndroid Build Coastguard Worker   if (NULL == phDelay) {
169*e5436536SAndroid Build Coastguard Worker     error = SACENC_INVALID_HANDLE;
170*e5436536SAndroid Build Coastguard Worker   } else {
171*e5436536SAndroid Build Coastguard Worker     FDK_ALLOCATE_MEMORY_1D(*phDelay, 1, struct DELAY);
172*e5436536SAndroid Build Coastguard Worker   }
173*e5436536SAndroid Build Coastguard Worker   return error;
174*e5436536SAndroid Build Coastguard Worker 
175*e5436536SAndroid Build Coastguard Worker bail:
176*e5436536SAndroid Build Coastguard Worker   fdk_sacenc_delay_Close(phDelay);
177*e5436536SAndroid Build Coastguard Worker   return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error);
178*e5436536SAndroid Build Coastguard Worker }
179*e5436536SAndroid Build Coastguard Worker 
180*e5436536SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------------
181*e5436536SAndroid Build Coastguard Worker functionname: fdk_sacenc_delay_Close()
182*e5436536SAndroid Build Coastguard Worker description:  destructs Delay
183*e5436536SAndroid Build Coastguard Worker returns:      noError on success, an apropriate error code else
184*e5436536SAndroid Build Coastguard Worker -----------------------------------------------------------------------------*/
fdk_sacenc_delay_Close(HANDLE_DELAY * phDelay)185*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_Close(HANDLE_DELAY *phDelay) {
186*e5436536SAndroid Build Coastguard Worker   FDK_SACENC_ERROR error = SACENC_OK;
187*e5436536SAndroid Build Coastguard Worker 
188*e5436536SAndroid Build Coastguard Worker   if (NULL == phDelay) {
189*e5436536SAndroid Build Coastguard Worker     error = SACENC_INVALID_HANDLE;
190*e5436536SAndroid Build Coastguard Worker   } else {
191*e5436536SAndroid Build Coastguard Worker     if (NULL != *phDelay) {
192*e5436536SAndroid Build Coastguard Worker       FDK_FREE_MEMORY_1D(*phDelay);
193*e5436536SAndroid Build Coastguard Worker     }
194*e5436536SAndroid Build Coastguard Worker   }
195*e5436536SAndroid Build Coastguard Worker   return error;
196*e5436536SAndroid Build Coastguard Worker }
197*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_Init(HANDLE_DELAY hDelay,const INT nQmfLen,const INT nFrameLen,const INT nCoreCoderDelay,const INT nSacStreamMuxDelay)198*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_Init(HANDLE_DELAY hDelay, const INT nQmfLen,
199*e5436536SAndroid Build Coastguard Worker                                        const INT nFrameLen,
200*e5436536SAndroid Build Coastguard Worker                                        const INT nCoreCoderDelay,
201*e5436536SAndroid Build Coastguard Worker                                        const INT nSacStreamMuxDelay) {
202*e5436536SAndroid Build Coastguard Worker   FDK_SACENC_ERROR error = SACENC_OK;
203*e5436536SAndroid Build Coastguard Worker 
204*e5436536SAndroid Build Coastguard Worker   if (NULL == hDelay) {
205*e5436536SAndroid Build Coastguard Worker     error = SACENC_INVALID_HANDLE;
206*e5436536SAndroid Build Coastguard Worker   } else {
207*e5436536SAndroid Build Coastguard Worker     /* Fill structure before calculation */
208*e5436536SAndroid Build Coastguard Worker     FDKmemclear(&hDelay->config, sizeof(hDelay->config));
209*e5436536SAndroid Build Coastguard Worker 
210*e5436536SAndroid Build Coastguard Worker     hDelay->config.nQmfLen = nQmfLen;
211*e5436536SAndroid Build Coastguard Worker     hDelay->config.nFrameLen = nFrameLen;
212*e5436536SAndroid Build Coastguard Worker     hDelay->config.nCoreCoderDelay = nCoreCoderDelay;
213*e5436536SAndroid Build Coastguard Worker     hDelay->config.nSacStreamMuxDelay = nSacStreamMuxDelay;
214*e5436536SAndroid Build Coastguard Worker   }
215*e5436536SAndroid Build Coastguard Worker   return error;
216*e5436536SAndroid Build Coastguard Worker }
217*e5436536SAndroid Build Coastguard Worker 
218*e5436536SAndroid Build Coastguard Worker /*-----------------------------------------------------------------------------
219*e5436536SAndroid Build Coastguard Worker functionname: fdk_sacenc_delay_SubCalulateBufferDelays()
220*e5436536SAndroid Build Coastguard Worker description:  Calculates the Delays of the buffers
221*e5436536SAndroid Build Coastguard Worker returns:      Error Code
222*e5436536SAndroid Build Coastguard Worker -----------------------------------------------------------------------------*/
fdk_sacenc_delay_SubCalulateBufferDelays(HANDLE_DELAY hDel)223*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_SubCalulateBufferDelays(HANDLE_DELAY hDel) {
224*e5436536SAndroid Build Coastguard Worker   FDK_SACENC_ERROR error = SACENC_OK;
225*e5436536SAndroid Build Coastguard Worker 
226*e5436536SAndroid Build Coastguard Worker   if (NULL == hDel) {
227*e5436536SAndroid Build Coastguard Worker     error = SACENC_INVALID_HANDLE;
228*e5436536SAndroid Build Coastguard Worker   } else {
229*e5436536SAndroid Build Coastguard Worker     int nEncoderAnDelay, nEncoderSynDelay, nEncoderWinDelay, nDecoderAnDelay,
230*e5436536SAndroid Build Coastguard Worker         nDecoderSynDelay, nResidualCoderFrameDelay,
231*e5436536SAndroid Build Coastguard Worker         nArbDmxResidualCoderFrameDelay;
232*e5436536SAndroid Build Coastguard Worker 
233*e5436536SAndroid Build Coastguard Worker     if (hDel->config.bSacTimeAlignmentDynamicOut > 0) {
234*e5436536SAndroid Build Coastguard Worker       hDel->config.nSacTimeAlignment = 0;
235*e5436536SAndroid Build Coastguard Worker     }
236*e5436536SAndroid Build Coastguard Worker 
237*e5436536SAndroid Build Coastguard Worker     {
238*e5436536SAndroid Build Coastguard Worker       nEncoderAnDelay =
239*e5436536SAndroid Build Coastguard Worker           2 * hDel->config.nQmfLen +
240*e5436536SAndroid Build Coastguard Worker           hDel->config.nQmfLen / 2; /* Only Ld-QMF Delay, no hybrid */
241*e5436536SAndroid Build Coastguard Worker       nEncoderSynDelay = 1 * hDel->config.nQmfLen + hDel->config.nQmfLen / 2;
242*e5436536SAndroid Build Coastguard Worker       nDecoderAnDelay = 2 * hDel->config.nQmfLen + hDel->config.nQmfLen / 2;
243*e5436536SAndroid Build Coastguard Worker       nDecoderSynDelay = 1 * hDel->config.nQmfLen + hDel->config.nQmfLen / 2;
244*e5436536SAndroid Build Coastguard Worker       nEncoderWinDelay =
245*e5436536SAndroid Build Coastguard Worker           hDel->config.nFrameLen / 2; /* WindowLookahead is just half a frame */
246*e5436536SAndroid Build Coastguard Worker     }
247*e5436536SAndroid Build Coastguard Worker 
248*e5436536SAndroid Build Coastguard Worker     { nResidualCoderFrameDelay = 0; }
249*e5436536SAndroid Build Coastguard Worker 
250*e5436536SAndroid Build Coastguard Worker     { nArbDmxResidualCoderFrameDelay = 0; }
251*e5436536SAndroid Build Coastguard Worker 
252*e5436536SAndroid Build Coastguard Worker     /* Calculate variable Buffer-Delays */
253*e5436536SAndroid Build Coastguard Worker     if (hDel->config.bTimeDomDmx == 0) {
254*e5436536SAndroid Build Coastguard Worker       /* ArbitraryDmx and TdDmx off */
255*e5436536SAndroid Build Coastguard Worker       int tempDelay;
256*e5436536SAndroid Build Coastguard Worker 
257*e5436536SAndroid Build Coastguard Worker       hDel->nSurroundAnalysisBuffer = 0;
258*e5436536SAndroid Build Coastguard Worker       hDel->nArbDmxAnalysisBuffer = 0;
259*e5436536SAndroid Build Coastguard Worker       tempDelay = nEncoderSynDelay + hDel->config.nLimiterDelay +
260*e5436536SAndroid Build Coastguard Worker                   hDel->config.nCoreCoderDelay +
261*e5436536SAndroid Build Coastguard Worker                   hDel->config.nSacTimeAlignment + nDecoderAnDelay;
262*e5436536SAndroid Build Coastguard Worker       tempDelay = (nResidualCoderFrameDelay * hDel->config.nFrameLen) +
263*e5436536SAndroid Build Coastguard Worker                   hDel->config.nSacStreamMuxDelay - tempDelay;
264*e5436536SAndroid Build Coastguard Worker 
265*e5436536SAndroid Build Coastguard Worker       if (tempDelay > 0) {
266*e5436536SAndroid Build Coastguard Worker         hDel->nBitstreamFrameBuffer = 0;
267*e5436536SAndroid Build Coastguard Worker         hDel->nOutputAudioBuffer = tempDelay;
268*e5436536SAndroid Build Coastguard Worker       } else {
269*e5436536SAndroid Build Coastguard Worker         tempDelay = -tempDelay;
270*e5436536SAndroid Build Coastguard Worker         hDel->nBitstreamFrameBuffer =
271*e5436536SAndroid Build Coastguard Worker             (tempDelay + hDel->config.nFrameLen - 1) / hDel->config.nFrameLen;
272*e5436536SAndroid Build Coastguard Worker         hDel->nOutputAudioBuffer =
273*e5436536SAndroid Build Coastguard Worker             (hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen) - tempDelay;
274*e5436536SAndroid Build Coastguard Worker       }
275*e5436536SAndroid Build Coastguard Worker 
276*e5436536SAndroid Build Coastguard Worker       hDel->nOutputAudioQmfFrameBuffer =
277*e5436536SAndroid Build Coastguard Worker           (hDel->nOutputAudioBuffer + (hDel->config.nQmfLen / 2) - 1) /
278*e5436536SAndroid Build Coastguard Worker           hDel->config.nQmfLen;
279*e5436536SAndroid Build Coastguard Worker 
280*e5436536SAndroid Build Coastguard Worker       if (hDel->config.bDmxAlign > 0) {
281*e5436536SAndroid Build Coastguard Worker         tempDelay = nEncoderWinDelay + nEncoderAnDelay + nEncoderSynDelay +
282*e5436536SAndroid Build Coastguard Worker                     hDel->nOutputAudioBuffer + hDel->config.nLimiterDelay +
283*e5436536SAndroid Build Coastguard Worker                     hDel->config.nCoreCoderDelay;
284*e5436536SAndroid Build Coastguard Worker         hDel->nDiscardOutFrames =
285*e5436536SAndroid Build Coastguard Worker             (tempDelay + hDel->config.nFrameLen - 1) / hDel->config.nFrameLen;
286*e5436536SAndroid Build Coastguard Worker         hDel->nDmxAlignBuffer =
287*e5436536SAndroid Build Coastguard Worker             hDel->nDiscardOutFrames * hDel->config.nFrameLen - tempDelay;
288*e5436536SAndroid Build Coastguard Worker       } else {
289*e5436536SAndroid Build Coastguard Worker         hDel->nDiscardOutFrames = 0;
290*e5436536SAndroid Build Coastguard Worker         hDel->nDmxAlignBuffer = 0;
291*e5436536SAndroid Build Coastguard Worker       }
292*e5436536SAndroid Build Coastguard Worker 
293*e5436536SAndroid Build Coastguard Worker       /* Output: Info-Variables */
294*e5436536SAndroid Build Coastguard Worker       hDel->nInfoDmxDelay = hDel->nSurroundAnalysisBuffer + nEncoderAnDelay +
295*e5436536SAndroid Build Coastguard Worker                             nEncoderWinDelay + nEncoderSynDelay +
296*e5436536SAndroid Build Coastguard Worker                             hDel->nOutputAudioBuffer +
297*e5436536SAndroid Build Coastguard Worker                             hDel->config.nLimiterDelay;
298*e5436536SAndroid Build Coastguard Worker       hDel->nInfoCodecDelay =
299*e5436536SAndroid Build Coastguard Worker           hDel->nInfoDmxDelay + hDel->config.nCoreCoderDelay +
300*e5436536SAndroid Build Coastguard Worker           hDel->config.nSacTimeAlignment + nDecoderAnDelay + nDecoderSynDelay;
301*e5436536SAndroid Build Coastguard Worker 
302*e5436536SAndroid Build Coastguard Worker     } else {
303*e5436536SAndroid Build Coastguard Worker       /* ArbitraryDmx or TdDmx on */
304*e5436536SAndroid Build Coastguard Worker       int tempDelay1, tempDelay2, tempDelay12, tempDelay3;
305*e5436536SAndroid Build Coastguard Worker 
306*e5436536SAndroid Build Coastguard Worker       tempDelay1 = hDel->config.nArbDmxDelay - hDel->config.nSurroundDelay;
307*e5436536SAndroid Build Coastguard Worker 
308*e5436536SAndroid Build Coastguard Worker       if (tempDelay1 >= 0) {
309*e5436536SAndroid Build Coastguard Worker         hDel->nSurroundAnalysisBuffer = tempDelay1;
310*e5436536SAndroid Build Coastguard Worker         hDel->nArbDmxAnalysisBuffer = 0;
311*e5436536SAndroid Build Coastguard Worker       } else {
312*e5436536SAndroid Build Coastguard Worker         hDel->nSurroundAnalysisBuffer = 0;
313*e5436536SAndroid Build Coastguard Worker         hDel->nArbDmxAnalysisBuffer = -tempDelay1;
314*e5436536SAndroid Build Coastguard Worker       }
315*e5436536SAndroid Build Coastguard Worker 
316*e5436536SAndroid Build Coastguard Worker       tempDelay1 = nEncoderWinDelay + hDel->config.nSurroundDelay +
317*e5436536SAndroid Build Coastguard Worker                    hDel->nSurroundAnalysisBuffer +
318*e5436536SAndroid Build Coastguard Worker                    nEncoderAnDelay; /*Surround Path*/
319*e5436536SAndroid Build Coastguard Worker       tempDelay2 = nEncoderWinDelay + hDel->config.nArbDmxDelay +
320*e5436536SAndroid Build Coastguard Worker                    hDel->nArbDmxAnalysisBuffer +
321*e5436536SAndroid Build Coastguard Worker                    nEncoderAnDelay; /* ArbDmx Compare Path */
322*e5436536SAndroid Build Coastguard Worker       tempDelay3 = hDel->config.nArbDmxDelay + hDel->config.nLimiterDelay +
323*e5436536SAndroid Build Coastguard Worker                    hDel->config.nCoreCoderDelay +
324*e5436536SAndroid Build Coastguard Worker                    hDel->config.nSacTimeAlignment +
325*e5436536SAndroid Build Coastguard Worker                    nDecoderAnDelay; /* ArbDmx Passthrough*/
326*e5436536SAndroid Build Coastguard Worker 
327*e5436536SAndroid Build Coastguard Worker       tempDelay12 =
328*e5436536SAndroid Build Coastguard Worker           FDKmax(nResidualCoderFrameDelay, nArbDmxResidualCoderFrameDelay) *
329*e5436536SAndroid Build Coastguard Worker           hDel->config.nFrameLen;
330*e5436536SAndroid Build Coastguard Worker       tempDelay12 += hDel->config.nSacStreamMuxDelay;
331*e5436536SAndroid Build Coastguard Worker 
332*e5436536SAndroid Build Coastguard Worker       if (tempDelay1 > tempDelay2) {
333*e5436536SAndroid Build Coastguard Worker         tempDelay12 += tempDelay1;
334*e5436536SAndroid Build Coastguard Worker       } else {
335*e5436536SAndroid Build Coastguard Worker         tempDelay12 += tempDelay2;
336*e5436536SAndroid Build Coastguard Worker       }
337*e5436536SAndroid Build Coastguard Worker 
338*e5436536SAndroid Build Coastguard Worker       if (tempDelay3 > tempDelay12) {
339*e5436536SAndroid Build Coastguard Worker         if (hDel->config.bMinimizeDelay > 0) {
340*e5436536SAndroid Build Coastguard Worker           hDel->nBitstreamFrameBuffer =
341*e5436536SAndroid Build Coastguard Worker               (tempDelay3 - tempDelay12) / hDel->config.nFrameLen; /*floor*/
342*e5436536SAndroid Build Coastguard Worker           hDel->nOutputAudioBuffer = 0;
343*e5436536SAndroid Build Coastguard Worker           hDel->nSurroundAnalysisBuffer +=
344*e5436536SAndroid Build Coastguard Worker               (tempDelay3 - tempDelay12 -
345*e5436536SAndroid Build Coastguard Worker                (hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen));
346*e5436536SAndroid Build Coastguard Worker           hDel->nArbDmxAnalysisBuffer +=
347*e5436536SAndroid Build Coastguard Worker               (tempDelay3 - tempDelay12 -
348*e5436536SAndroid Build Coastguard Worker                (hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen));
349*e5436536SAndroid Build Coastguard Worker         } else {
350*e5436536SAndroid Build Coastguard Worker           hDel->nBitstreamFrameBuffer =
351*e5436536SAndroid Build Coastguard Worker               ((tempDelay3 - tempDelay12) + hDel->config.nFrameLen - 1) /
352*e5436536SAndroid Build Coastguard Worker               hDel->config.nFrameLen;
353*e5436536SAndroid Build Coastguard Worker           hDel->nOutputAudioBuffer =
354*e5436536SAndroid Build Coastguard Worker               hDel->nBitstreamFrameBuffer * hDel->config.nFrameLen +
355*e5436536SAndroid Build Coastguard Worker               tempDelay12 - tempDelay3;
356*e5436536SAndroid Build Coastguard Worker         }
357*e5436536SAndroid Build Coastguard Worker       } else {
358*e5436536SAndroid Build Coastguard Worker         hDel->nBitstreamFrameBuffer = 0;
359*e5436536SAndroid Build Coastguard Worker         hDel->nOutputAudioBuffer = tempDelay12 - tempDelay3;
360*e5436536SAndroid Build Coastguard Worker       }
361*e5436536SAndroid Build Coastguard Worker 
362*e5436536SAndroid Build Coastguard Worker       if (hDel->config.bDmxAlign > 0) {
363*e5436536SAndroid Build Coastguard Worker         int tempDelay = hDel->config.nArbDmxDelay + hDel->nOutputAudioBuffer +
364*e5436536SAndroid Build Coastguard Worker                         hDel->config.nLimiterDelay +
365*e5436536SAndroid Build Coastguard Worker                         hDel->config.nCoreCoderDelay;
366*e5436536SAndroid Build Coastguard Worker         hDel->nDiscardOutFrames =
367*e5436536SAndroid Build Coastguard Worker             (tempDelay + hDel->config.nFrameLen - 1) / hDel->config.nFrameLen;
368*e5436536SAndroid Build Coastguard Worker         hDel->nDmxAlignBuffer =
369*e5436536SAndroid Build Coastguard Worker             hDel->nDiscardOutFrames * hDel->config.nFrameLen - tempDelay;
370*e5436536SAndroid Build Coastguard Worker       } else {
371*e5436536SAndroid Build Coastguard Worker         hDel->nDiscardOutFrames = 0;
372*e5436536SAndroid Build Coastguard Worker         hDel->nDmxAlignBuffer = 0;
373*e5436536SAndroid Build Coastguard Worker       }
374*e5436536SAndroid Build Coastguard Worker 
375*e5436536SAndroid Build Coastguard Worker       /* Output: Info-Variables */
376*e5436536SAndroid Build Coastguard Worker       hDel->nInfoDmxDelay = hDel->config.nArbDmxDelay +
377*e5436536SAndroid Build Coastguard Worker                             hDel->nOutputAudioBuffer +
378*e5436536SAndroid Build Coastguard Worker                             hDel->config.nLimiterDelay;
379*e5436536SAndroid Build Coastguard Worker       hDel->nInfoCodecDelay =
380*e5436536SAndroid Build Coastguard Worker           hDel->nInfoDmxDelay + hDel->config.nCoreCoderDelay +
381*e5436536SAndroid Build Coastguard Worker           hDel->config.nSacTimeAlignment + nDecoderAnDelay + nDecoderSynDelay;
382*e5436536SAndroid Build Coastguard Worker       hDel->nInfoDecoderDelay = nDecoderAnDelay + nDecoderSynDelay;
383*e5436536SAndroid Build Coastguard Worker 
384*e5436536SAndroid Build Coastguard Worker     } /* ArbitraryDmx or TdDmx on */
385*e5436536SAndroid Build Coastguard Worker 
386*e5436536SAndroid Build Coastguard Worker     /* Additonal Variables needed for Computation Issues */
387*e5436536SAndroid Build Coastguard Worker     hDel->nBitstreamFrameBufferSize = hDel->nBitstreamFrameBuffer + 1;
388*e5436536SAndroid Build Coastguard Worker   }
389*e5436536SAndroid Build Coastguard Worker 
390*e5436536SAndroid Build Coastguard Worker   return error;
391*e5436536SAndroid Build Coastguard Worker }
392*e5436536SAndroid Build Coastguard Worker 
assignParameterInRange(const INT startRange,const INT stopRange,const INT value,INT * const ptr)393*e5436536SAndroid Build Coastguard Worker static FDK_SACENC_ERROR assignParameterInRange(
394*e5436536SAndroid Build Coastguard Worker     const INT startRange, /* including startRange */
395*e5436536SAndroid Build Coastguard Worker     const INT stopRange,  /* including stopRange */
396*e5436536SAndroid Build Coastguard Worker     const INT value,      /* value to write*/
397*e5436536SAndroid Build Coastguard Worker     INT *const ptr        /* destination pointer*/
398*e5436536SAndroid Build Coastguard Worker ) {
399*e5436536SAndroid Build Coastguard Worker   FDK_SACENC_ERROR error = SACENC_INVALID_CONFIG;
400*e5436536SAndroid Build Coastguard Worker 
401*e5436536SAndroid Build Coastguard Worker   if ((startRange <= value) && (value <= stopRange)) {
402*e5436536SAndroid Build Coastguard Worker     *ptr = value;
403*e5436536SAndroid Build Coastguard Worker     error = SACENC_OK;
404*e5436536SAndroid Build Coastguard Worker   }
405*e5436536SAndroid Build Coastguard Worker 
406*e5436536SAndroid Build Coastguard Worker   return error;
407*e5436536SAndroid Build Coastguard Worker }
408*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_SetDmxAlign(HANDLE_DELAY hDelay,const INT bDmxAlignIn)409*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_SetDmxAlign(HANDLE_DELAY hDelay,
410*e5436536SAndroid Build Coastguard Worker                                               const INT bDmxAlignIn) {
411*e5436536SAndroid Build Coastguard Worker   return (assignParameterInRange(0, 1, bDmxAlignIn, &hDelay->config.bDmxAlign));
412*e5436536SAndroid Build Coastguard Worker }
413*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_SetTimeDomDmx(HANDLE_DELAY hDelay,const INT bTimeDomDmxIn)414*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_SetTimeDomDmx(HANDLE_DELAY hDelay,
415*e5436536SAndroid Build Coastguard Worker                                                 const INT bTimeDomDmxIn) {
416*e5436536SAndroid Build Coastguard Worker   return (
417*e5436536SAndroid Build Coastguard Worker       assignParameterInRange(0, 1, bTimeDomDmxIn, &hDelay->config.bTimeDomDmx));
418*e5436536SAndroid Build Coastguard Worker }
419*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_SetSacTimeAlignmentDynamicOut(HANDLE_DELAY hDelay,const INT bSacTimeAlignmentDynamicOutIn)420*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_SetSacTimeAlignmentDynamicOut(
421*e5436536SAndroid Build Coastguard Worker     HANDLE_DELAY hDelay, const INT bSacTimeAlignmentDynamicOutIn) {
422*e5436536SAndroid Build Coastguard Worker   return (assignParameterInRange(0, 1, bSacTimeAlignmentDynamicOutIn,
423*e5436536SAndroid Build Coastguard Worker                                  &hDelay->config.bSacTimeAlignmentDynamicOut));
424*e5436536SAndroid Build Coastguard Worker }
425*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_SetNSacTimeAlignment(HANDLE_DELAY hDelay,const INT nSacTimeAlignmentIn)426*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_SetNSacTimeAlignment(
427*e5436536SAndroid Build Coastguard Worker     HANDLE_DELAY hDelay, const INT nSacTimeAlignmentIn) {
428*e5436536SAndroid Build Coastguard Worker   return (assignParameterInRange(-32768, 32767, nSacTimeAlignmentIn,
429*e5436536SAndroid Build Coastguard Worker                                  &hDelay->config.nSacTimeAlignment));
430*e5436536SAndroid Build Coastguard Worker }
431*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_SetMinimizeDelay(HANDLE_DELAY hDelay,const INT bMinimizeDelay)432*e5436536SAndroid Build Coastguard Worker FDK_SACENC_ERROR fdk_sacenc_delay_SetMinimizeDelay(HANDLE_DELAY hDelay,
433*e5436536SAndroid Build Coastguard Worker                                                    const INT bMinimizeDelay) {
434*e5436536SAndroid Build Coastguard Worker   return (assignParameterInRange(0, 1, bMinimizeDelay,
435*e5436536SAndroid Build Coastguard Worker                                  &hDelay->config.bMinimizeDelay));
436*e5436536SAndroid Build Coastguard Worker }
437*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetOutputAudioBufferDelay(HANDLE_DELAY hDelay)438*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetOutputAudioBufferDelay(HANDLE_DELAY hDelay) {
439*e5436536SAndroid Build Coastguard Worker   return (hDelay->nOutputAudioBuffer);
440*e5436536SAndroid Build Coastguard Worker }
441*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetSurroundAnalysisBufferDelay(HANDLE_DELAY hDelay)442*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetSurroundAnalysisBufferDelay(HANDLE_DELAY hDelay) {
443*e5436536SAndroid Build Coastguard Worker   return (hDelay->nSurroundAnalysisBuffer);
444*e5436536SAndroid Build Coastguard Worker }
445*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetArbDmxAnalysisBufferDelay(HANDLE_DELAY hDelay)446*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetArbDmxAnalysisBufferDelay(HANDLE_DELAY hDelay) {
447*e5436536SAndroid Build Coastguard Worker   return (hDelay->nArbDmxAnalysisBuffer);
448*e5436536SAndroid Build Coastguard Worker }
449*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetBitstreamFrameBufferSize(HANDLE_DELAY hDelay)450*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetBitstreamFrameBufferSize(HANDLE_DELAY hDelay) {
451*e5436536SAndroid Build Coastguard Worker   return (hDelay->nBitstreamFrameBufferSize);
452*e5436536SAndroid Build Coastguard Worker }
453*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetDmxAlignBufferDelay(HANDLE_DELAY hDelay)454*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetDmxAlignBufferDelay(HANDLE_DELAY hDelay) {
455*e5436536SAndroid Build Coastguard Worker   return (hDelay->nDmxAlignBuffer);
456*e5436536SAndroid Build Coastguard Worker }
457*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetDiscardOutFrames(HANDLE_DELAY hDelay)458*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetDiscardOutFrames(HANDLE_DELAY hDelay) {
459*e5436536SAndroid Build Coastguard Worker   return (hDelay->nDiscardOutFrames);
460*e5436536SAndroid Build Coastguard Worker }
461*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetInfoDmxDelay(HANDLE_DELAY hDelay)462*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetInfoDmxDelay(HANDLE_DELAY hDelay) {
463*e5436536SAndroid Build Coastguard Worker   return (hDelay->nInfoDmxDelay);
464*e5436536SAndroid Build Coastguard Worker }
465*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetInfoCodecDelay(HANDLE_DELAY hDelay)466*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetInfoCodecDelay(HANDLE_DELAY hDelay) {
467*e5436536SAndroid Build Coastguard Worker   return (hDelay->nInfoCodecDelay);
468*e5436536SAndroid Build Coastguard Worker }
469*e5436536SAndroid Build Coastguard Worker 
fdk_sacenc_delay_GetInfoDecoderDelay(HANDLE_DELAY hDelay)470*e5436536SAndroid Build Coastguard Worker INT fdk_sacenc_delay_GetInfoDecoderDelay(HANDLE_DELAY hDelay) {
471*e5436536SAndroid Build Coastguard Worker   return (hDelay->nInfoDecoderDelay);
472*e5436536SAndroid Build Coastguard Worker }
473