xref: /aosp_15_r20/external/aac/libAACenc/src/mps_main.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 /**************************** AAC encoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   Markus Lohwasser
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: Mpeg Surround library interface functions
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker /* Includes ******************************************************************/
104*e5436536SAndroid Build Coastguard Worker #include "mps_main.h"
105*e5436536SAndroid Build Coastguard Worker #include "sacenc_lib.h"
106*e5436536SAndroid Build Coastguard Worker 
107*e5436536SAndroid Build Coastguard Worker /* Data Types ****************************************************************/
108*e5436536SAndroid Build Coastguard Worker struct MPS_ENCODER {
109*e5436536SAndroid Build Coastguard Worker   HANDLE_MP4SPACE_ENCODER hSacEncoder;
110*e5436536SAndroid Build Coastguard Worker 
111*e5436536SAndroid Build Coastguard Worker   AUDIO_OBJECT_TYPE audioObjectType;
112*e5436536SAndroid Build Coastguard Worker 
113*e5436536SAndroid Build Coastguard Worker   FDK_bufDescr inBufDesc;
114*e5436536SAndroid Build Coastguard Worker   FDK_bufDescr outBufDesc;
115*e5436536SAndroid Build Coastguard Worker   SACENC_InArgs inargs;
116*e5436536SAndroid Build Coastguard Worker   SACENC_OutArgs outargs;
117*e5436536SAndroid Build Coastguard Worker 
118*e5436536SAndroid Build Coastguard Worker   void *pInBuffer[1];
119*e5436536SAndroid Build Coastguard Worker   UINT pInBufferSize[1];
120*e5436536SAndroid Build Coastguard Worker   UINT pInBufferElSize[1];
121*e5436536SAndroid Build Coastguard Worker   UINT pInBufferType[1];
122*e5436536SAndroid Build Coastguard Worker 
123*e5436536SAndroid Build Coastguard Worker   void *pOutBuffer[2];
124*e5436536SAndroid Build Coastguard Worker   UINT pOutBufferSize[2];
125*e5436536SAndroid Build Coastguard Worker   UINT pOutBufferElSize[2];
126*e5436536SAndroid Build Coastguard Worker   UINT pOutBufferType[2];
127*e5436536SAndroid Build Coastguard Worker 
128*e5436536SAndroid Build Coastguard Worker   UCHAR sacOutBuffer[1024]; /* Worst case memory consumption for ELDv2: 768
129*e5436536SAndroid Build Coastguard Worker                                bytes => 6144 bits (Core + SBR + MPS) */
130*e5436536SAndroid Build Coastguard Worker };
131*e5436536SAndroid Build Coastguard Worker 
132*e5436536SAndroid Build Coastguard Worker struct MPS_CONFIG_TAB {
133*e5436536SAndroid Build Coastguard Worker   AUDIO_OBJECT_TYPE audio_object_type;
134*e5436536SAndroid Build Coastguard Worker   CHANNEL_MODE channel_mode;
135*e5436536SAndroid Build Coastguard Worker   ULONG sbr_ratio;
136*e5436536SAndroid Build Coastguard Worker   ULONG sampling_rate;
137*e5436536SAndroid Build Coastguard Worker   ULONG bitrate_min;
138*e5436536SAndroid Build Coastguard Worker   ULONG bitrate_max;
139*e5436536SAndroid Build Coastguard Worker };
140*e5436536SAndroid Build Coastguard Worker 
141*e5436536SAndroid Build Coastguard Worker /* Constants *****************************************************************/
142*e5436536SAndroid Build Coastguard Worker static const MPS_CONFIG_TAB mpsConfigTab[] = {
143*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 0, 16000, 16000, 39999},
144*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 0, 22050, 16000, 49999},
145*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 0, 24000, 16000, 61999},
146*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 0, 32000, 20000, 84999},
147*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 0, 44100, 50000, 192000},
148*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 0, 48000, 62000, 192000},
149*e5436536SAndroid Build Coastguard Worker 
150*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 1, 16000, 18000, 31999},
151*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 1, 22050, 18000, 31999},
152*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 1, 24000, 20000, 64000},
153*e5436536SAndroid Build Coastguard Worker 
154*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 2, 32000, 18000, 64000},
155*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 2, 44100, 21000, 64000},
156*e5436536SAndroid Build Coastguard Worker     {AOT_ER_AAC_ELD, MODE_212, 2, 48000, 26000, 64000}
157*e5436536SAndroid Build Coastguard Worker 
158*e5436536SAndroid Build Coastguard Worker };
159*e5436536SAndroid Build Coastguard Worker 
160*e5436536SAndroid Build Coastguard Worker /* Function / Class Declarations *********************************************/
161*e5436536SAndroid Build Coastguard Worker 
162*e5436536SAndroid Build Coastguard Worker /* Function / Class Definition ***********************************************/
163*e5436536SAndroid Build Coastguard Worker static INT FDK_MpegsEnc_WriteFrameHeader(HANDLE_MPS_ENCODER hMpsEnc,
164*e5436536SAndroid Build Coastguard Worker                                          UCHAR *const pOutputBuffer,
165*e5436536SAndroid Build Coastguard Worker                                          const int outputBufferSize);
166*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_Open(HANDLE_MPS_ENCODER * phMpsEnc)167*e5436536SAndroid Build Coastguard Worker MPS_ENCODER_ERROR FDK_MpegsEnc_Open(HANDLE_MPS_ENCODER *phMpsEnc) {
168*e5436536SAndroid Build Coastguard Worker   MPS_ENCODER_ERROR error = MPS_ENCODER_OK;
169*e5436536SAndroid Build Coastguard Worker   HANDLE_MPS_ENCODER hMpsEnc = NULL;
170*e5436536SAndroid Build Coastguard Worker 
171*e5436536SAndroid Build Coastguard Worker   if (phMpsEnc == NULL) {
172*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INVALID_HANDLE;
173*e5436536SAndroid Build Coastguard Worker     goto bail;
174*e5436536SAndroid Build Coastguard Worker   }
175*e5436536SAndroid Build Coastguard Worker 
176*e5436536SAndroid Build Coastguard Worker   if (NULL ==
177*e5436536SAndroid Build Coastguard Worker       (hMpsEnc = (HANDLE_MPS_ENCODER)FDKcalloc(1, sizeof(MPS_ENCODER)))) {
178*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_MEMORY_ERROR;
179*e5436536SAndroid Build Coastguard Worker     goto bail;
180*e5436536SAndroid Build Coastguard Worker   }
181*e5436536SAndroid Build Coastguard Worker   FDKmemclear(hMpsEnc, sizeof(MPS_ENCODER));
182*e5436536SAndroid Build Coastguard Worker 
183*e5436536SAndroid Build Coastguard Worker   if (SACENC_OK != FDK_sacenc_open(&hMpsEnc->hSacEncoder)) {
184*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_MEMORY_ERROR;
185*e5436536SAndroid Build Coastguard Worker     goto bail;
186*e5436536SAndroid Build Coastguard Worker   }
187*e5436536SAndroid Build Coastguard Worker 
188*e5436536SAndroid Build Coastguard Worker   /* Return mps encoder instance */
189*e5436536SAndroid Build Coastguard Worker   *phMpsEnc = hMpsEnc;
190*e5436536SAndroid Build Coastguard Worker 
191*e5436536SAndroid Build Coastguard Worker bail:
192*e5436536SAndroid Build Coastguard Worker   if (error != MPS_ENCODER_OK) {
193*e5436536SAndroid Build Coastguard Worker     FDK_MpegsEnc_Close(&hMpsEnc);
194*e5436536SAndroid Build Coastguard Worker   }
195*e5436536SAndroid Build Coastguard Worker   return error;
196*e5436536SAndroid Build Coastguard Worker }
197*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_Close(HANDLE_MPS_ENCODER * phMpsEnc)198*e5436536SAndroid Build Coastguard Worker MPS_ENCODER_ERROR FDK_MpegsEnc_Close(HANDLE_MPS_ENCODER *phMpsEnc) {
199*e5436536SAndroid Build Coastguard Worker   MPS_ENCODER_ERROR error = MPS_ENCODER_OK;
200*e5436536SAndroid Build Coastguard Worker 
201*e5436536SAndroid Build Coastguard Worker   if (phMpsEnc == NULL) {
202*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INVALID_HANDLE;
203*e5436536SAndroid Build Coastguard Worker     goto bail;
204*e5436536SAndroid Build Coastguard Worker   }
205*e5436536SAndroid Build Coastguard Worker 
206*e5436536SAndroid Build Coastguard Worker   if (*phMpsEnc != NULL) {
207*e5436536SAndroid Build Coastguard Worker     FDK_sacenc_close(&(*phMpsEnc)->hSacEncoder);
208*e5436536SAndroid Build Coastguard Worker     FDKfree(*phMpsEnc);
209*e5436536SAndroid Build Coastguard Worker     *phMpsEnc = NULL;
210*e5436536SAndroid Build Coastguard Worker   }
211*e5436536SAndroid Build Coastguard Worker bail:
212*e5436536SAndroid Build Coastguard Worker   return error;
213*e5436536SAndroid Build Coastguard Worker }
214*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_Init(HANDLE_MPS_ENCODER hMpsEnc,const AUDIO_OBJECT_TYPE audioObjectType,const UINT samplingrate,const UINT bitrate,const UINT sbrRatio,const UINT framelength,const UINT inputBufferSizePerChannel,const UINT coreCoderDelay)215*e5436536SAndroid Build Coastguard Worker MPS_ENCODER_ERROR FDK_MpegsEnc_Init(HANDLE_MPS_ENCODER hMpsEnc,
216*e5436536SAndroid Build Coastguard Worker                                     const AUDIO_OBJECT_TYPE audioObjectType,
217*e5436536SAndroid Build Coastguard Worker                                     const UINT samplingrate, const UINT bitrate,
218*e5436536SAndroid Build Coastguard Worker                                     const UINT sbrRatio, const UINT framelength,
219*e5436536SAndroid Build Coastguard Worker                                     const UINT inputBufferSizePerChannel,
220*e5436536SAndroid Build Coastguard Worker                                     const UINT coreCoderDelay) {
221*e5436536SAndroid Build Coastguard Worker   MPS_ENCODER_ERROR error = MPS_ENCODER_OK;
222*e5436536SAndroid Build Coastguard Worker   const UINT fs_low = 27713;  /* low MPS sampling frequencies */
223*e5436536SAndroid Build Coastguard Worker   const UINT fs_high = 55426; /* high MPS sampling frequencies */
224*e5436536SAndroid Build Coastguard Worker   UINT nTimeSlots = 0, nQmfBandsLd = 0;
225*e5436536SAndroid Build Coastguard Worker 
226*e5436536SAndroid Build Coastguard Worker   if (hMpsEnc == NULL) {
227*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INVALID_HANDLE;
228*e5436536SAndroid Build Coastguard Worker     goto bail;
229*e5436536SAndroid Build Coastguard Worker   }
230*e5436536SAndroid Build Coastguard Worker 
231*e5436536SAndroid Build Coastguard Worker   /* Combine MPS with SBR only if the number of QMF band fits together.*/
232*e5436536SAndroid Build Coastguard Worker   switch (sbrRatio) {
233*e5436536SAndroid Build Coastguard Worker     case 1: /* downsampled sbr - 32 QMF bands required */
234*e5436536SAndroid Build Coastguard Worker       if (!(samplingrate < fs_low)) {
235*e5436536SAndroid Build Coastguard Worker         error = MPS_ENCODER_INIT_ERROR;
236*e5436536SAndroid Build Coastguard Worker         goto bail;
237*e5436536SAndroid Build Coastguard Worker       }
238*e5436536SAndroid Build Coastguard Worker       break;
239*e5436536SAndroid Build Coastguard Worker     case 2: /* dualrate - 64 QMF bands required */
240*e5436536SAndroid Build Coastguard Worker       if (!((samplingrate >= fs_low) && (samplingrate < fs_high))) {
241*e5436536SAndroid Build Coastguard Worker         error = MPS_ENCODER_INIT_ERROR;
242*e5436536SAndroid Build Coastguard Worker         goto bail;
243*e5436536SAndroid Build Coastguard Worker       }
244*e5436536SAndroid Build Coastguard Worker       break;
245*e5436536SAndroid Build Coastguard Worker     case 0:
246*e5436536SAndroid Build Coastguard Worker     default:; /* time interface - no samplingrate restriction */
247*e5436536SAndroid Build Coastguard Worker   }
248*e5436536SAndroid Build Coastguard Worker 
249*e5436536SAndroid Build Coastguard Worker   /* 32  QMF-Bands  ( fs < 27713 )
250*e5436536SAndroid Build Coastguard Worker    * 64  QMF-Bands  ( 27713 >= fs <= 55426 )
251*e5436536SAndroid Build Coastguard Worker    * 128 QMF-Bands  ( fs > 55426 )
252*e5436536SAndroid Build Coastguard Worker    */
253*e5436536SAndroid Build Coastguard Worker   nQmfBandsLd =
254*e5436536SAndroid Build Coastguard Worker       (samplingrate < fs_low) ? 5 : ((samplingrate > fs_high) ? 7 : 6);
255*e5436536SAndroid Build Coastguard Worker   nTimeSlots = framelength >> nQmfBandsLd;
256*e5436536SAndroid Build Coastguard Worker 
257*e5436536SAndroid Build Coastguard Worker   /* check if number of qmf bands is usable for given framelength */
258*e5436536SAndroid Build Coastguard Worker   if (framelength != (nTimeSlots << nQmfBandsLd)) {
259*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INIT_ERROR;
260*e5436536SAndroid Build Coastguard Worker     goto bail;
261*e5436536SAndroid Build Coastguard Worker   }
262*e5436536SAndroid Build Coastguard Worker 
263*e5436536SAndroid Build Coastguard Worker   /* is given bitrate intended to be supported */
264*e5436536SAndroid Build Coastguard Worker   if ((INT)bitrate != FDK_MpegsEnc_GetClosestBitRate(audioObjectType, MODE_212,
265*e5436536SAndroid Build Coastguard Worker                                                      samplingrate, sbrRatio,
266*e5436536SAndroid Build Coastguard Worker                                                      bitrate)) {
267*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INIT_ERROR;
268*e5436536SAndroid Build Coastguard Worker     goto bail;
269*e5436536SAndroid Build Coastguard Worker   }
270*e5436536SAndroid Build Coastguard Worker 
271*e5436536SAndroid Build Coastguard Worker   /* init SAC library */
272*e5436536SAndroid Build Coastguard Worker   switch (audioObjectType) {
273*e5436536SAndroid Build Coastguard Worker     case AOT_ER_AAC_ELD: {
274*e5436536SAndroid Build Coastguard Worker       const UINT noInterFrameCoding = 0;
275*e5436536SAndroid Build Coastguard Worker 
276*e5436536SAndroid Build Coastguard Worker       if ((SACENC_OK !=
277*e5436536SAndroid Build Coastguard Worker            FDK_sacenc_setParam(hMpsEnc->hSacEncoder, SACENC_LOWDELAY,
278*e5436536SAndroid Build Coastguard Worker                                (noInterFrameCoding == 1) ? 1 : 2)) ||
279*e5436536SAndroid Build Coastguard Worker           (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder,
280*e5436536SAndroid Build Coastguard Worker                                             SACENC_ENC_MODE, SACENC_212)) ||
281*e5436536SAndroid Build Coastguard Worker           (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder,
282*e5436536SAndroid Build Coastguard Worker                                             SACENC_SAMPLERATE, samplingrate)) ||
283*e5436536SAndroid Build Coastguard Worker           (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder,
284*e5436536SAndroid Build Coastguard Worker                                             SACENC_FRAME_TIME_SLOTS,
285*e5436536SAndroid Build Coastguard Worker                                             nTimeSlots)) ||
286*e5436536SAndroid Build Coastguard Worker           (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder,
287*e5436536SAndroid Build Coastguard Worker                                             SACENC_PARAM_BANDS,
288*e5436536SAndroid Build Coastguard Worker                                             SACENC_BANDS_15)) ||
289*e5436536SAndroid Build Coastguard Worker           (SACENC_OK !=
290*e5436536SAndroid Build Coastguard Worker            FDK_sacenc_setParam(hMpsEnc->hSacEncoder, SACENC_TIME_DOM_DMX, 2)) ||
291*e5436536SAndroid Build Coastguard Worker           (SACENC_OK !=
292*e5436536SAndroid Build Coastguard Worker            FDK_sacenc_setParam(hMpsEnc->hSacEncoder, SACENC_COARSE_QUANT, 0)) ||
293*e5436536SAndroid Build Coastguard Worker           (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder,
294*e5436536SAndroid Build Coastguard Worker                                             SACENC_QUANT_MODE,
295*e5436536SAndroid Build Coastguard Worker                                             SACENC_QUANTMODE_FINE)) ||
296*e5436536SAndroid Build Coastguard Worker           (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder,
297*e5436536SAndroid Build Coastguard Worker                                             SACENC_TIME_ALIGNMENT, 0)) ||
298*e5436536SAndroid Build Coastguard Worker           (SACENC_OK != FDK_sacenc_setParam(hMpsEnc->hSacEncoder,
299*e5436536SAndroid Build Coastguard Worker                                             SACENC_INDEPENDENCY_FACTOR, 20))) {
300*e5436536SAndroid Build Coastguard Worker         error = MPS_ENCODER_INIT_ERROR;
301*e5436536SAndroid Build Coastguard Worker         goto bail;
302*e5436536SAndroid Build Coastguard Worker       }
303*e5436536SAndroid Build Coastguard Worker       break;
304*e5436536SAndroid Build Coastguard Worker     }
305*e5436536SAndroid Build Coastguard Worker     default:
306*e5436536SAndroid Build Coastguard Worker       error = MPS_ENCODER_INIT_ERROR;
307*e5436536SAndroid Build Coastguard Worker       goto bail;
308*e5436536SAndroid Build Coastguard Worker   }
309*e5436536SAndroid Build Coastguard Worker 
310*e5436536SAndroid Build Coastguard Worker   if (SACENC_OK != FDK_sacenc_init(hMpsEnc->hSacEncoder, coreCoderDelay)) {
311*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INIT_ERROR;
312*e5436536SAndroid Build Coastguard Worker   }
313*e5436536SAndroid Build Coastguard Worker 
314*e5436536SAndroid Build Coastguard Worker   hMpsEnc->audioObjectType = audioObjectType;
315*e5436536SAndroid Build Coastguard Worker 
316*e5436536SAndroid Build Coastguard Worker   hMpsEnc->inBufDesc.ppBase = (void **)&hMpsEnc->pInBuffer;
317*e5436536SAndroid Build Coastguard Worker   hMpsEnc->inBufDesc.pBufSize = hMpsEnc->pInBufferSize;
318*e5436536SAndroid Build Coastguard Worker   hMpsEnc->inBufDesc.pEleSize = hMpsEnc->pInBufferElSize;
319*e5436536SAndroid Build Coastguard Worker   hMpsEnc->inBufDesc.pBufType = hMpsEnc->pInBufferType;
320*e5436536SAndroid Build Coastguard Worker   hMpsEnc->inBufDesc.numBufs = 1;
321*e5436536SAndroid Build Coastguard Worker 
322*e5436536SAndroid Build Coastguard Worker   hMpsEnc->outBufDesc.ppBase = (void **)&hMpsEnc->pOutBuffer;
323*e5436536SAndroid Build Coastguard Worker   hMpsEnc->outBufDesc.pBufSize = hMpsEnc->pOutBufferSize;
324*e5436536SAndroid Build Coastguard Worker   hMpsEnc->outBufDesc.pEleSize = hMpsEnc->pOutBufferElSize;
325*e5436536SAndroid Build Coastguard Worker   hMpsEnc->outBufDesc.pBufType = hMpsEnc->pOutBufferType;
326*e5436536SAndroid Build Coastguard Worker   hMpsEnc->outBufDesc.numBufs = 2;
327*e5436536SAndroid Build Coastguard Worker 
328*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pInBuffer[0] = NULL;
329*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pInBufferSize[0] = 0;
330*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pInBufferElSize[0] = sizeof(INT_PCM);
331*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pInBufferType[0] = (FDK_BUF_TYPE_INPUT | FDK_BUF_TYPE_PCM_DATA);
332*e5436536SAndroid Build Coastguard Worker 
333*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBuffer[0] = NULL;
334*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBufferSize[0] = 0;
335*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBufferElSize[0] = sizeof(INT_PCM);
336*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBufferType[0] = (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_PCM_DATA);
337*e5436536SAndroid Build Coastguard Worker 
338*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBuffer[1] = NULL;
339*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBufferSize[1] = 0;
340*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBufferElSize[1] = sizeof(UCHAR);
341*e5436536SAndroid Build Coastguard Worker   hMpsEnc->pOutBufferType[1] = (FDK_BUF_TYPE_OUTPUT | FDK_BUF_TYPE_BS_DATA);
342*e5436536SAndroid Build Coastguard Worker 
343*e5436536SAndroid Build Coastguard Worker   hMpsEnc->inargs.isInputInterleaved = 0;
344*e5436536SAndroid Build Coastguard Worker   hMpsEnc->inargs.inputBufferSizePerChannel = inputBufferSizePerChannel;
345*e5436536SAndroid Build Coastguard Worker 
346*e5436536SAndroid Build Coastguard Worker bail:
347*e5436536SAndroid Build Coastguard Worker   return error;
348*e5436536SAndroid Build Coastguard Worker }
349*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_Process(HANDLE_MPS_ENCODER hMpsEnc,INT_PCM * const pAudioSamples,const INT nAudioSamples,AACENC_EXT_PAYLOAD * pMpsExtPayload)350*e5436536SAndroid Build Coastguard Worker MPS_ENCODER_ERROR FDK_MpegsEnc_Process(HANDLE_MPS_ENCODER hMpsEnc,
351*e5436536SAndroid Build Coastguard Worker                                        INT_PCM *const pAudioSamples,
352*e5436536SAndroid Build Coastguard Worker                                        const INT nAudioSamples,
353*e5436536SAndroid Build Coastguard Worker                                        AACENC_EXT_PAYLOAD *pMpsExtPayload) {
354*e5436536SAndroid Build Coastguard Worker   MPS_ENCODER_ERROR error = MPS_ENCODER_OK;
355*e5436536SAndroid Build Coastguard Worker 
356*e5436536SAndroid Build Coastguard Worker   if (hMpsEnc == NULL) {
357*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INVALID_HANDLE;
358*e5436536SAndroid Build Coastguard Worker   } else {
359*e5436536SAndroid Build Coastguard Worker     int sacHeaderFlag = 1;
360*e5436536SAndroid Build Coastguard Worker     int sacOutBufferOffset = 0;
361*e5436536SAndroid Build Coastguard Worker 
362*e5436536SAndroid Build Coastguard Worker     /* In case of eld the ssc is explicit and doesn't need to be inband */
363*e5436536SAndroid Build Coastguard Worker     if (hMpsEnc->audioObjectType == AOT_ER_AAC_ELD) {
364*e5436536SAndroid Build Coastguard Worker       sacHeaderFlag = 0;
365*e5436536SAndroid Build Coastguard Worker     }
366*e5436536SAndroid Build Coastguard Worker 
367*e5436536SAndroid Build Coastguard Worker     /* 4 bits nibble after extension type */
368*e5436536SAndroid Build Coastguard Worker     hMpsEnc->sacOutBuffer[0] = (sacHeaderFlag == 0) ? 0x3 : 0x7;
369*e5436536SAndroid Build Coastguard Worker     sacOutBufferOffset += 1;
370*e5436536SAndroid Build Coastguard Worker 
371*e5436536SAndroid Build Coastguard Worker     if (sacHeaderFlag) {
372*e5436536SAndroid Build Coastguard Worker       sacOutBufferOffset += FDK_MpegsEnc_WriteFrameHeader(
373*e5436536SAndroid Build Coastguard Worker           hMpsEnc, &hMpsEnc->sacOutBuffer[sacOutBufferOffset],
374*e5436536SAndroid Build Coastguard Worker           sizeof(hMpsEnc->sacOutBuffer) - sacOutBufferOffset);
375*e5436536SAndroid Build Coastguard Worker     }
376*e5436536SAndroid Build Coastguard Worker 
377*e5436536SAndroid Build Coastguard Worker     /* Register input and output buffer. */
378*e5436536SAndroid Build Coastguard Worker     hMpsEnc->pInBuffer[0] = (void *)pAudioSamples;
379*e5436536SAndroid Build Coastguard Worker     hMpsEnc->inargs.nInputSamples = nAudioSamples;
380*e5436536SAndroid Build Coastguard Worker 
381*e5436536SAndroid Build Coastguard Worker     hMpsEnc->pOutBuffer[0] = (void *)pAudioSamples;
382*e5436536SAndroid Build Coastguard Worker     hMpsEnc->pOutBufferSize[0] = sizeof(INT_PCM) * nAudioSamples / 2;
383*e5436536SAndroid Build Coastguard Worker 
384*e5436536SAndroid Build Coastguard Worker     hMpsEnc->pOutBuffer[1] = (void *)&hMpsEnc->sacOutBuffer[sacOutBufferOffset];
385*e5436536SAndroid Build Coastguard Worker     hMpsEnc->pOutBufferSize[1] =
386*e5436536SAndroid Build Coastguard Worker         sizeof(hMpsEnc->sacOutBuffer) - sacOutBufferOffset;
387*e5436536SAndroid Build Coastguard Worker 
388*e5436536SAndroid Build Coastguard Worker     /* encode SAC frame */
389*e5436536SAndroid Build Coastguard Worker     if (SACENC_OK != FDK_sacenc_encode(hMpsEnc->hSacEncoder,
390*e5436536SAndroid Build Coastguard Worker                                        &hMpsEnc->inBufDesc,
391*e5436536SAndroid Build Coastguard Worker                                        &hMpsEnc->outBufDesc, &hMpsEnc->inargs,
392*e5436536SAndroid Build Coastguard Worker                                        &hMpsEnc->outargs)) {
393*e5436536SAndroid Build Coastguard Worker       error = MPS_ENCODER_ENCODE_ERROR;
394*e5436536SAndroid Build Coastguard Worker       goto bail;
395*e5436536SAndroid Build Coastguard Worker     }
396*e5436536SAndroid Build Coastguard Worker 
397*e5436536SAndroid Build Coastguard Worker     /* export MPS payload */
398*e5436536SAndroid Build Coastguard Worker     pMpsExtPayload->pData = (UCHAR *)hMpsEnc->sacOutBuffer;
399*e5436536SAndroid Build Coastguard Worker     pMpsExtPayload->dataSize =
400*e5436536SAndroid Build Coastguard Worker         hMpsEnc->outargs.nOutputBits + 8 * (sacOutBufferOffset - 1);
401*e5436536SAndroid Build Coastguard Worker     pMpsExtPayload->dataType = EXT_LDSAC_DATA;
402*e5436536SAndroid Build Coastguard Worker     pMpsExtPayload->associatedChElement = -1;
403*e5436536SAndroid Build Coastguard Worker   }
404*e5436536SAndroid Build Coastguard Worker 
405*e5436536SAndroid Build Coastguard Worker bail:
406*e5436536SAndroid Build Coastguard Worker   return error;
407*e5436536SAndroid Build Coastguard Worker }
408*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_WriteSpatialSpecificConfig(HANDLE_MPS_ENCODER hMpsEnc,HANDLE_FDK_BITSTREAM hBs)409*e5436536SAndroid Build Coastguard Worker INT FDK_MpegsEnc_WriteSpatialSpecificConfig(HANDLE_MPS_ENCODER hMpsEnc,
410*e5436536SAndroid Build Coastguard Worker                                             HANDLE_FDK_BITSTREAM hBs) {
411*e5436536SAndroid Build Coastguard Worker   INT sscBits = 0;
412*e5436536SAndroid Build Coastguard Worker 
413*e5436536SAndroid Build Coastguard Worker   if (NULL != hMpsEnc) {
414*e5436536SAndroid Build Coastguard Worker     MP4SPACEENC_INFO mp4SpaceEncoderInfo;
415*e5436536SAndroid Build Coastguard Worker     FDK_sacenc_getInfo(hMpsEnc->hSacEncoder, &mp4SpaceEncoderInfo);
416*e5436536SAndroid Build Coastguard Worker 
417*e5436536SAndroid Build Coastguard Worker     if (hBs != NULL) {
418*e5436536SAndroid Build Coastguard Worker       int i;
419*e5436536SAndroid Build Coastguard Worker       int writtenBits = 0;
420*e5436536SAndroid Build Coastguard Worker       for (i = 0; i<mp4SpaceEncoderInfo.pSscBuf->nSscSizeBits>> 3; i++) {
421*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBs, mp4SpaceEncoderInfo.pSscBuf->pSsc[i], 8);
422*e5436536SAndroid Build Coastguard Worker         writtenBits += 8;
423*e5436536SAndroid Build Coastguard Worker       }
424*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(hBs, mp4SpaceEncoderInfo.pSscBuf->pSsc[i],
425*e5436536SAndroid Build Coastguard Worker                    mp4SpaceEncoderInfo.pSscBuf->nSscSizeBits - writtenBits);
426*e5436536SAndroid Build Coastguard Worker     } /* hBS */
427*e5436536SAndroid Build Coastguard Worker 
428*e5436536SAndroid Build Coastguard Worker     sscBits = mp4SpaceEncoderInfo.pSscBuf->nSscSizeBits;
429*e5436536SAndroid Build Coastguard Worker 
430*e5436536SAndroid Build Coastguard Worker   } /* valid hMpsEnc */
431*e5436536SAndroid Build Coastguard Worker 
432*e5436536SAndroid Build Coastguard Worker   return sscBits;
433*e5436536SAndroid Build Coastguard Worker }
434*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_WriteFrameHeader(HANDLE_MPS_ENCODER hMpsEnc,UCHAR * const pOutputBuffer,const int outputBufferSize)435*e5436536SAndroid Build Coastguard Worker static INT FDK_MpegsEnc_WriteFrameHeader(HANDLE_MPS_ENCODER hMpsEnc,
436*e5436536SAndroid Build Coastguard Worker                                          UCHAR *const pOutputBuffer,
437*e5436536SAndroid Build Coastguard Worker                                          const int outputBufferSize) {
438*e5436536SAndroid Build Coastguard Worker   const int sacTimeAlignFlag = 0;
439*e5436536SAndroid Build Coastguard Worker 
440*e5436536SAndroid Build Coastguard Worker   /* Initialize variables */
441*e5436536SAndroid Build Coastguard Worker   int numBits = 0;
442*e5436536SAndroid Build Coastguard Worker 
443*e5436536SAndroid Build Coastguard Worker   if ((NULL != hMpsEnc) && (NULL != pOutputBuffer)) {
444*e5436536SAndroid Build Coastguard Worker     UINT alignAnchor, cnt;
445*e5436536SAndroid Build Coastguard Worker     FDK_BITSTREAM Bs;
446*e5436536SAndroid Build Coastguard Worker     FDKinitBitStream(&Bs, pOutputBuffer, outputBufferSize, 0, BS_WRITER);
447*e5436536SAndroid Build Coastguard Worker 
448*e5436536SAndroid Build Coastguard Worker     /* Calculate SSC length information */
449*e5436536SAndroid Build Coastguard Worker     cnt = (FDK_MpegsEnc_WriteSpatialSpecificConfig(hMpsEnc, NULL) + 7) >> 3;
450*e5436536SAndroid Build Coastguard Worker 
451*e5436536SAndroid Build Coastguard Worker     /* Write SSC */
452*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(&Bs, sacTimeAlignFlag, 1);
453*e5436536SAndroid Build Coastguard Worker 
454*e5436536SAndroid Build Coastguard Worker     if (cnt < 127) {
455*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(&Bs, cnt, 7);
456*e5436536SAndroid Build Coastguard Worker     } else {
457*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(&Bs, 127, 7);
458*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(&Bs, cnt - 127, 16);
459*e5436536SAndroid Build Coastguard Worker     }
460*e5436536SAndroid Build Coastguard Worker 
461*e5436536SAndroid Build Coastguard Worker     alignAnchor = FDKgetValidBits(&Bs);
462*e5436536SAndroid Build Coastguard Worker     FDK_MpegsEnc_WriteSpatialSpecificConfig(hMpsEnc, &Bs);
463*e5436536SAndroid Build Coastguard Worker     FDKbyteAlign(&Bs, alignAnchor); /* bsFillBits */
464*e5436536SAndroid Build Coastguard Worker 
465*e5436536SAndroid Build Coastguard Worker     if (sacTimeAlignFlag) {
466*e5436536SAndroid Build Coastguard Worker       FDK_ASSERT(1); /* time alignment not supported */
467*e5436536SAndroid Build Coastguard Worker     }
468*e5436536SAndroid Build Coastguard Worker 
469*e5436536SAndroid Build Coastguard Worker     numBits = FDKgetValidBits(&Bs);
470*e5436536SAndroid Build Coastguard Worker   } /* valid handle */
471*e5436536SAndroid Build Coastguard Worker 
472*e5436536SAndroid Build Coastguard Worker   return ((numBits + 7) >> 3);
473*e5436536SAndroid Build Coastguard Worker }
474*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_GetClosestBitRate(const AUDIO_OBJECT_TYPE audioObjectType,const CHANNEL_MODE channelMode,const UINT samplingrate,const UINT sbrRatio,const UINT bitrate)475*e5436536SAndroid Build Coastguard Worker INT FDK_MpegsEnc_GetClosestBitRate(const AUDIO_OBJECT_TYPE audioObjectType,
476*e5436536SAndroid Build Coastguard Worker                                    const CHANNEL_MODE channelMode,
477*e5436536SAndroid Build Coastguard Worker                                    const UINT samplingrate, const UINT sbrRatio,
478*e5436536SAndroid Build Coastguard Worker                                    const UINT bitrate) {
479*e5436536SAndroid Build Coastguard Worker   unsigned int i;
480*e5436536SAndroid Build Coastguard Worker   int targetBitrate = -1;
481*e5436536SAndroid Build Coastguard Worker 
482*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < sizeof(mpsConfigTab) / sizeof(MPS_CONFIG_TAB); i++) {
483*e5436536SAndroid Build Coastguard Worker     if ((mpsConfigTab[i].audio_object_type == audioObjectType) &&
484*e5436536SAndroid Build Coastguard Worker         (mpsConfigTab[i].channel_mode == channelMode) &&
485*e5436536SAndroid Build Coastguard Worker         (mpsConfigTab[i].sbr_ratio == sbrRatio) &&
486*e5436536SAndroid Build Coastguard Worker         (mpsConfigTab[i].sampling_rate == samplingrate)) {
487*e5436536SAndroid Build Coastguard Worker       targetBitrate = fMin(fMax(bitrate, mpsConfigTab[i].bitrate_min),
488*e5436536SAndroid Build Coastguard Worker                            mpsConfigTab[i].bitrate_max);
489*e5436536SAndroid Build Coastguard Worker     }
490*e5436536SAndroid Build Coastguard Worker   }
491*e5436536SAndroid Build Coastguard Worker 
492*e5436536SAndroid Build Coastguard Worker   return targetBitrate;
493*e5436536SAndroid Build Coastguard Worker }
494*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_GetDelay(HANDLE_MPS_ENCODER hMpsEnc)495*e5436536SAndroid Build Coastguard Worker INT FDK_MpegsEnc_GetDelay(HANDLE_MPS_ENCODER hMpsEnc) {
496*e5436536SAndroid Build Coastguard Worker   INT delay = 0;
497*e5436536SAndroid Build Coastguard Worker 
498*e5436536SAndroid Build Coastguard Worker   if (NULL != hMpsEnc) {
499*e5436536SAndroid Build Coastguard Worker     MP4SPACEENC_INFO mp4SpaceEncoderInfo;
500*e5436536SAndroid Build Coastguard Worker     FDK_sacenc_getInfo(hMpsEnc->hSacEncoder, &mp4SpaceEncoderInfo);
501*e5436536SAndroid Build Coastguard Worker     delay = mp4SpaceEncoderInfo.nCodecDelay;
502*e5436536SAndroid Build Coastguard Worker   }
503*e5436536SAndroid Build Coastguard Worker 
504*e5436536SAndroid Build Coastguard Worker   return delay;
505*e5436536SAndroid Build Coastguard Worker }
506*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_GetDecDelay(HANDLE_MPS_ENCODER hMpsEnc)507*e5436536SAndroid Build Coastguard Worker INT FDK_MpegsEnc_GetDecDelay(HANDLE_MPS_ENCODER hMpsEnc) {
508*e5436536SAndroid Build Coastguard Worker   INT delay = 0;
509*e5436536SAndroid Build Coastguard Worker 
510*e5436536SAndroid Build Coastguard Worker   if (NULL != hMpsEnc) {
511*e5436536SAndroid Build Coastguard Worker     MP4SPACEENC_INFO mp4SpaceEncoderInfo;
512*e5436536SAndroid Build Coastguard Worker     FDK_sacenc_getInfo(hMpsEnc->hSacEncoder, &mp4SpaceEncoderInfo);
513*e5436536SAndroid Build Coastguard Worker     delay = mp4SpaceEncoderInfo.nDecoderDelay;
514*e5436536SAndroid Build Coastguard Worker   }
515*e5436536SAndroid Build Coastguard Worker 
516*e5436536SAndroid Build Coastguard Worker   return delay;
517*e5436536SAndroid Build Coastguard Worker }
518*e5436536SAndroid Build Coastguard Worker 
FDK_MpegsEnc_GetLibInfo(LIB_INFO * info)519*e5436536SAndroid Build Coastguard Worker MPS_ENCODER_ERROR FDK_MpegsEnc_GetLibInfo(LIB_INFO *info) {
520*e5436536SAndroid Build Coastguard Worker   MPS_ENCODER_ERROR error = MPS_ENCODER_OK;
521*e5436536SAndroid Build Coastguard Worker 
522*e5436536SAndroid Build Coastguard Worker   if (NULL == info) {
523*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INVALID_HANDLE;
524*e5436536SAndroid Build Coastguard Worker   } else if (SACENC_OK != FDK_sacenc_getLibInfo(info)) {
525*e5436536SAndroid Build Coastguard Worker     error = MPS_ENCODER_INIT_ERROR;
526*e5436536SAndroid Build Coastguard Worker   }
527*e5436536SAndroid Build Coastguard Worker 
528*e5436536SAndroid Build Coastguard Worker   return error;
529*e5436536SAndroid Build Coastguard Worker }
530