xref: /aosp_15_r20/external/aac/libMpegTPEnc/src/tpenc_lib.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 transport format encoder library *********************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   Manuel Jander
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: MPEG Transport encode
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #include "tpenc_lib.h"
104*e5436536SAndroid Build Coastguard Worker 
105*e5436536SAndroid Build Coastguard Worker /* library info */
106*e5436536SAndroid Build Coastguard Worker #include "tp_version.h"
107*e5436536SAndroid Build Coastguard Worker 
108*e5436536SAndroid Build Coastguard Worker #define MODULE_NAME "transportEnc"
109*e5436536SAndroid Build Coastguard Worker 
110*e5436536SAndroid Build Coastguard Worker #include "tpenc_asc.h"
111*e5436536SAndroid Build Coastguard Worker 
112*e5436536SAndroid Build Coastguard Worker #include "tpenc_adts.h"
113*e5436536SAndroid Build Coastguard Worker 
114*e5436536SAndroid Build Coastguard Worker #include "tpenc_adif.h"
115*e5436536SAndroid Build Coastguard Worker 
116*e5436536SAndroid Build Coastguard Worker #include "tpenc_latm.h"
117*e5436536SAndroid Build Coastguard Worker 
118*e5436536SAndroid Build Coastguard Worker typedef struct {
119*e5436536SAndroid Build Coastguard Worker   int curSubFrame;
120*e5436536SAndroid Build Coastguard Worker   int nSubFrames;
121*e5436536SAndroid Build Coastguard Worker   int prevBits;
122*e5436536SAndroid Build Coastguard Worker } RAWPACKETS_INFO;
123*e5436536SAndroid Build Coastguard Worker 
124*e5436536SAndroid Build Coastguard Worker struct TRANSPORTENC {
125*e5436536SAndroid Build Coastguard Worker   CODER_CONFIG config;
126*e5436536SAndroid Build Coastguard Worker   TRANSPORT_TYPE transportFmt; /*!< MPEG4 transport type. */
127*e5436536SAndroid Build Coastguard Worker 
128*e5436536SAndroid Build Coastguard Worker   FDK_BITSTREAM bitStream;
129*e5436536SAndroid Build Coastguard Worker   UCHAR *bsBuffer;
130*e5436536SAndroid Build Coastguard Worker   INT bsBufferSize;
131*e5436536SAndroid Build Coastguard Worker 
132*e5436536SAndroid Build Coastguard Worker   INT pceFrameCounter; /*!< Indicates frame period when PCE must be written in
133*e5436536SAndroid Build Coastguard Worker                           raw_data_block. -1 means not to write a PCE in
134*e5436536SAndroid Build Coastguard Worker                           raw_dat_block. */
135*e5436536SAndroid Build Coastguard Worker   union {
136*e5436536SAndroid Build Coastguard Worker     STRUCT_ADTS adts;
137*e5436536SAndroid Build Coastguard Worker 
138*e5436536SAndroid Build Coastguard Worker     ADIF_INFO adif;
139*e5436536SAndroid Build Coastguard Worker 
140*e5436536SAndroid Build Coastguard Worker     LATM_STREAM latm;
141*e5436536SAndroid Build Coastguard Worker 
142*e5436536SAndroid Build Coastguard Worker     RAWPACKETS_INFO raw;
143*e5436536SAndroid Build Coastguard Worker 
144*e5436536SAndroid Build Coastguard Worker   } writer;
145*e5436536SAndroid Build Coastguard Worker 
146*e5436536SAndroid Build Coastguard Worker   CSTpCallBacks callbacks;
147*e5436536SAndroid Build Coastguard Worker };
148*e5436536SAndroid Build Coastguard Worker 
149*e5436536SAndroid Build Coastguard Worker typedef struct _TRANSPORTENC_STRUCT TRANSPORTENC_STRUCT;
150*e5436536SAndroid Build Coastguard Worker 
151*e5436536SAndroid Build Coastguard Worker /*
152*e5436536SAndroid Build Coastguard Worker  * MEMORY Declaration
153*e5436536SAndroid Build Coastguard Worker  */
154*e5436536SAndroid Build Coastguard Worker 
155*e5436536SAndroid Build Coastguard Worker C_ALLOC_MEM(Ram_TransportEncoder, struct TRANSPORTENC, 1)
156*e5436536SAndroid Build Coastguard Worker 
transportEnc_Open(HANDLE_TRANSPORTENC * phTpEnc)157*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_Open(HANDLE_TRANSPORTENC *phTpEnc) {
158*e5436536SAndroid Build Coastguard Worker   HANDLE_TRANSPORTENC hTpEnc;
159*e5436536SAndroid Build Coastguard Worker 
160*e5436536SAndroid Build Coastguard Worker   if (phTpEnc == NULL) {
161*e5436536SAndroid Build Coastguard Worker     return TRANSPORTENC_INVALID_PARAMETER;
162*e5436536SAndroid Build Coastguard Worker   }
163*e5436536SAndroid Build Coastguard Worker 
164*e5436536SAndroid Build Coastguard Worker   hTpEnc = GetRam_TransportEncoder(0);
165*e5436536SAndroid Build Coastguard Worker 
166*e5436536SAndroid Build Coastguard Worker   if (hTpEnc == NULL) {
167*e5436536SAndroid Build Coastguard Worker     return TRANSPORTENC_NO_MEM;
168*e5436536SAndroid Build Coastguard Worker   }
169*e5436536SAndroid Build Coastguard Worker 
170*e5436536SAndroid Build Coastguard Worker   *phTpEnc = hTpEnc;
171*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
172*e5436536SAndroid Build Coastguard Worker }
173*e5436536SAndroid Build Coastguard Worker 
174*e5436536SAndroid Build Coastguard Worker /**
175*e5436536SAndroid Build Coastguard Worker  * \brief  Get frame period of PCE in raw_data_block.
176*e5436536SAndroid Build Coastguard Worker  *
177*e5436536SAndroid Build Coastguard Worker  * - Write PCE only if necessary. PCE can be part of the ASC if chConfig==0
178*e5436536SAndroid Build Coastguard Worker  * whererfore no additonal PCE will be written in raw_data_block.
179*e5436536SAndroid Build Coastguard Worker  * - A matrixMixdown coefficient can only be written if chConfig is 5.0 or 5.1.
180*e5436536SAndroid Build Coastguard Worker  * - The PCE repetition rate in raw_data_block can be controlled via
181*e5436536SAndroid Build Coastguard Worker  * headerPeriod parameter.
182*e5436536SAndroid Build Coastguard Worker  *
183*e5436536SAndroid Build Coastguard Worker  * \param channelMode           Encoder Channel Mode.
184*e5436536SAndroid Build Coastguard Worker  * \param channelConfigZero     No standard channel configuration.
185*e5436536SAndroid Build Coastguard Worker  * \param transportFmt          Format of the transport to be written.
186*e5436536SAndroid Build Coastguard Worker  * \param headerPeriod          Chosen PCE frame repetition rate.
187*e5436536SAndroid Build Coastguard Worker  * \param matrixMixdownA        Indicates if a valid Matrix Mixdown coefficient
188*e5436536SAndroid Build Coastguard Worker  * is available.
189*e5436536SAndroid Build Coastguard Worker  *
190*e5436536SAndroid Build Coastguard Worker  * \return  PCE frame repetition rate. -1 means no PCE present in
191*e5436536SAndroid Build Coastguard Worker  * raw_data_block.
192*e5436536SAndroid Build Coastguard Worker  */
getPceRepetitionRate(const CHANNEL_MODE channelMode,const int channelConfigZero,const TRANSPORT_TYPE transportFmt,const int headerPeriod,const int matrixMixdownA)193*e5436536SAndroid Build Coastguard Worker static INT getPceRepetitionRate(const CHANNEL_MODE channelMode,
194*e5436536SAndroid Build Coastguard Worker                                 const int channelConfigZero,
195*e5436536SAndroid Build Coastguard Worker                                 const TRANSPORT_TYPE transportFmt,
196*e5436536SAndroid Build Coastguard Worker                                 const int headerPeriod,
197*e5436536SAndroid Build Coastguard Worker                                 const int matrixMixdownA) {
198*e5436536SAndroid Build Coastguard Worker   INT pceFrameCounter = -1; /* variable to be returned */
199*e5436536SAndroid Build Coastguard Worker 
200*e5436536SAndroid Build Coastguard Worker   if (headerPeriod > 0) {
201*e5436536SAndroid Build Coastguard Worker     switch (getChannelConfig(channelMode, channelConfigZero)) {
202*e5436536SAndroid Build Coastguard Worker       case 0:
203*e5436536SAndroid Build Coastguard Worker         switch (transportFmt) {
204*e5436536SAndroid Build Coastguard Worker           case TT_MP4_ADTS:
205*e5436536SAndroid Build Coastguard Worker           case TT_MP4_LATM_MCP0:
206*e5436536SAndroid Build Coastguard Worker           case TT_MP4_RAW:
207*e5436536SAndroid Build Coastguard Worker             pceFrameCounter = headerPeriod;
208*e5436536SAndroid Build Coastguard Worker             break;
209*e5436536SAndroid Build Coastguard Worker           case TT_MP4_ADIF: /* ADIF header comprises PCE */
210*e5436536SAndroid Build Coastguard Worker             if ((channelMode == MODE_1_2_2) || (channelMode == MODE_1_2_2_1)) {
211*e5436536SAndroid Build Coastguard Worker               pceFrameCounter = headerPeriod; /* repeating pce only meaningful
212*e5436536SAndroid Build Coastguard Worker                                                  for potential matrix mixdown */
213*e5436536SAndroid Build Coastguard Worker               break;
214*e5436536SAndroid Build Coastguard Worker             }
215*e5436536SAndroid Build Coastguard Worker             FDK_FALLTHROUGH;
216*e5436536SAndroid Build Coastguard Worker           case TT_MP4_LOAS:      /* PCE in ASC if chChonfig==0 */
217*e5436536SAndroid Build Coastguard Worker           case TT_MP4_LATM_MCP1: /* PCE in ASC if chChonfig==0 */
218*e5436536SAndroid Build Coastguard Worker           default:
219*e5436536SAndroid Build Coastguard Worker             pceFrameCounter = -1; /* no PCE in raw_data_block */
220*e5436536SAndroid Build Coastguard Worker         }
221*e5436536SAndroid Build Coastguard Worker         break;
222*e5436536SAndroid Build Coastguard Worker       case 5: /* MODE_1_2_2 */
223*e5436536SAndroid Build Coastguard Worker       case 6: /* MODE_1_2_2_1 */
224*e5436536SAndroid Build Coastguard Worker         /* matrixMixdownCoefficient can only be written if 5.0 and 5.1 config
225*e5436536SAndroid Build Coastguard Worker          * present. */
226*e5436536SAndroid Build Coastguard Worker         if (matrixMixdownA != 0) {
227*e5436536SAndroid Build Coastguard Worker           switch (transportFmt) {
228*e5436536SAndroid Build Coastguard Worker             case TT_MP4_ADIF: /* ADIF header comprises PCE */
229*e5436536SAndroid Build Coastguard Worker             case TT_MP4_ADTS:
230*e5436536SAndroid Build Coastguard Worker             case TT_MP4_LOAS:      /* no PCE in ASC because chConfig!=0 */
231*e5436536SAndroid Build Coastguard Worker             case TT_MP4_LATM_MCP1: /* no PCE in ASC because chConfig!=0 */
232*e5436536SAndroid Build Coastguard Worker             case TT_MP4_LATM_MCP0:
233*e5436536SAndroid Build Coastguard Worker             case TT_MP4_RAW:
234*e5436536SAndroid Build Coastguard Worker               pceFrameCounter = headerPeriod;
235*e5436536SAndroid Build Coastguard Worker               break;
236*e5436536SAndroid Build Coastguard Worker             default:
237*e5436536SAndroid Build Coastguard Worker               pceFrameCounter = -1; /* no PCE in raw_data_block */
238*e5436536SAndroid Build Coastguard Worker           }                         /* switch transportFmt */
239*e5436536SAndroid Build Coastguard Worker         }                           /* if matrixMixdownA!=0 */
240*e5436536SAndroid Build Coastguard Worker         break;
241*e5436536SAndroid Build Coastguard Worker       default:
242*e5436536SAndroid Build Coastguard Worker         pceFrameCounter = -1; /* no PCE in raw_data_block */
243*e5436536SAndroid Build Coastguard Worker     }                         /* switch getChannelConfig() */
244*e5436536SAndroid Build Coastguard Worker   }                           /* if headerPeriod>0  */
245*e5436536SAndroid Build Coastguard Worker   else {
246*e5436536SAndroid Build Coastguard Worker     pceFrameCounter = -1; /* no PCE in raw_data_block */
247*e5436536SAndroid Build Coastguard Worker   }
248*e5436536SAndroid Build Coastguard Worker 
249*e5436536SAndroid Build Coastguard Worker   return pceFrameCounter;
250*e5436536SAndroid Build Coastguard Worker }
251*e5436536SAndroid Build Coastguard Worker 
transportEnc_Init(HANDLE_TRANSPORTENC hTpEnc,UCHAR * bsBuffer,INT bsBufferSize,TRANSPORT_TYPE transportFmt,CODER_CONFIG * cconfig,UINT flags)252*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_Init(HANDLE_TRANSPORTENC hTpEnc,
253*e5436536SAndroid Build Coastguard Worker                                      UCHAR *bsBuffer, INT bsBufferSize,
254*e5436536SAndroid Build Coastguard Worker                                      TRANSPORT_TYPE transportFmt,
255*e5436536SAndroid Build Coastguard Worker                                      CODER_CONFIG *cconfig, UINT flags) {
256*e5436536SAndroid Build Coastguard Worker   /* Copy configuration structure */
257*e5436536SAndroid Build Coastguard Worker   FDKmemcpy(&hTpEnc->config, cconfig, sizeof(CODER_CONFIG));
258*e5436536SAndroid Build Coastguard Worker 
259*e5436536SAndroid Build Coastguard Worker   /* Init transportEnc struct. */
260*e5436536SAndroid Build Coastguard Worker   hTpEnc->transportFmt = transportFmt;
261*e5436536SAndroid Build Coastguard Worker 
262*e5436536SAndroid Build Coastguard Worker   hTpEnc->bsBuffer = bsBuffer;
263*e5436536SAndroid Build Coastguard Worker   hTpEnc->bsBufferSize = bsBufferSize;
264*e5436536SAndroid Build Coastguard Worker 
265*e5436536SAndroid Build Coastguard Worker   FDKinitBitStream(&hTpEnc->bitStream, hTpEnc->bsBuffer, hTpEnc->bsBufferSize,
266*e5436536SAndroid Build Coastguard Worker                    0, BS_WRITER);
267*e5436536SAndroid Build Coastguard Worker 
268*e5436536SAndroid Build Coastguard Worker   switch (transportFmt) {
269*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADIF:
270*e5436536SAndroid Build Coastguard Worker       /* Sanity checks */
271*e5436536SAndroid Build Coastguard Worker       if ((hTpEnc->config.aot != AOT_AAC_LC) ||
272*e5436536SAndroid Build Coastguard Worker           (hTpEnc->config.samplesPerFrame != 1024)) {
273*e5436536SAndroid Build Coastguard Worker         return TRANSPORTENC_INVALID_PARAMETER;
274*e5436536SAndroid Build Coastguard Worker       }
275*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.headerWritten = 0;
276*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.samplingRate = hTpEnc->config.samplingRate;
277*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.bitRate = hTpEnc->config.bitRate;
278*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.profile = ((int)hTpEnc->config.aot) - 1;
279*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.cm = hTpEnc->config.channelMode;
280*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.bVariableRate = 0;
281*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.instanceTag = 0;
282*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.matrixMixdownA = hTpEnc->config.matrixMixdownA;
283*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.adif.pseudoSurroundEnable =
284*e5436536SAndroid Build Coastguard Worker           (hTpEnc->config.flags & CC_PSEUDO_SURROUND) ? 1 : 0;
285*e5436536SAndroid Build Coastguard Worker       break;
286*e5436536SAndroid Build Coastguard Worker 
287*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
288*e5436536SAndroid Build Coastguard Worker       /* Sanity checks */
289*e5436536SAndroid Build Coastguard Worker       if ((hTpEnc->config.aot != AOT_AAC_LC) ||
290*e5436536SAndroid Build Coastguard Worker           (hTpEnc->config.samplesPerFrame != 1024)) {
291*e5436536SAndroid Build Coastguard Worker         return TRANSPORTENC_INVALID_PARAMETER;
292*e5436536SAndroid Build Coastguard Worker       }
293*e5436536SAndroid Build Coastguard Worker       if (adtsWrite_Init(&hTpEnc->writer.adts, &hTpEnc->config) != 0) {
294*e5436536SAndroid Build Coastguard Worker         return TRANSPORTENC_INVALID_PARAMETER;
295*e5436536SAndroid Build Coastguard Worker       }
296*e5436536SAndroid Build Coastguard Worker       break;
297*e5436536SAndroid Build Coastguard Worker 
298*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
299*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
300*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1: {
301*e5436536SAndroid Build Coastguard Worker       TRANSPORTENC_ERROR error;
302*e5436536SAndroid Build Coastguard Worker 
303*e5436536SAndroid Build Coastguard Worker       error = transportEnc_Latm_Init(&hTpEnc->writer.latm, &hTpEnc->bitStream,
304*e5436536SAndroid Build Coastguard Worker                                      &hTpEnc->config, flags & TP_FLAG_LATM_AMV,
305*e5436536SAndroid Build Coastguard Worker                                      transportFmt, &hTpEnc->callbacks);
306*e5436536SAndroid Build Coastguard Worker       if (error != TRANSPORTENC_OK) {
307*e5436536SAndroid Build Coastguard Worker         return error;
308*e5436536SAndroid Build Coastguard Worker       }
309*e5436536SAndroid Build Coastguard Worker     } break;
310*e5436536SAndroid Build Coastguard Worker 
311*e5436536SAndroid Build Coastguard Worker     case TT_MP4_RAW:
312*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.raw.curSubFrame = 0;
313*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.raw.nSubFrames = hTpEnc->config.nSubFrames;
314*e5436536SAndroid Build Coastguard Worker       break;
315*e5436536SAndroid Build Coastguard Worker 
316*e5436536SAndroid Build Coastguard Worker     default:
317*e5436536SAndroid Build Coastguard Worker       return TRANSPORTENC_INVALID_PARAMETER;
318*e5436536SAndroid Build Coastguard Worker   }
319*e5436536SAndroid Build Coastguard Worker 
320*e5436536SAndroid Build Coastguard Worker   /* pceFrameCounter indicates if PCE must be written in raw_data_block. */
321*e5436536SAndroid Build Coastguard Worker   hTpEnc->pceFrameCounter = getPceRepetitionRate(
322*e5436536SAndroid Build Coastguard Worker       hTpEnc->config.channelMode, hTpEnc->config.channelConfigZero,
323*e5436536SAndroid Build Coastguard Worker       transportFmt, hTpEnc->config.headerPeriod, hTpEnc->config.matrixMixdownA);
324*e5436536SAndroid Build Coastguard Worker 
325*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
326*e5436536SAndroid Build Coastguard Worker }
327*e5436536SAndroid Build Coastguard Worker 
transportEnc_AddOtherDataBits(HANDLE_TRANSPORTENC hTpEnc,const int nBits)328*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_AddOtherDataBits(HANDLE_TRANSPORTENC hTpEnc,
329*e5436536SAndroid Build Coastguard Worker                                                  const int nBits) {
330*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
331*e5436536SAndroid Build Coastguard Worker 
332*e5436536SAndroid Build Coastguard Worker   switch (hTpEnc->transportFmt) {
333*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
334*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1:
335*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
336*e5436536SAndroid Build Coastguard Worker       tpErr = transportEnc_LatmAddOtherDataBits(&hTpEnc->writer.latm, nBits);
337*e5436536SAndroid Build Coastguard Worker       break;
338*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
339*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADIF:
340*e5436536SAndroid Build Coastguard Worker     case TT_MP4_RAW:
341*e5436536SAndroid Build Coastguard Worker     default:
342*e5436536SAndroid Build Coastguard Worker       tpErr = TRANSPORTENC_UNKOWN_ERROR;
343*e5436536SAndroid Build Coastguard Worker   }
344*e5436536SAndroid Build Coastguard Worker 
345*e5436536SAndroid Build Coastguard Worker   return tpErr;
346*e5436536SAndroid Build Coastguard Worker }
347*e5436536SAndroid Build Coastguard Worker 
transportEnc_GetBitstream(HANDLE_TRANSPORTENC hTp)348*e5436536SAndroid Build Coastguard Worker HANDLE_FDK_BITSTREAM transportEnc_GetBitstream(HANDLE_TRANSPORTENC hTp) {
349*e5436536SAndroid Build Coastguard Worker   return &hTp->bitStream;
350*e5436536SAndroid Build Coastguard Worker }
351*e5436536SAndroid Build Coastguard Worker 
transportEnc_RegisterSbrCallback(HANDLE_TRANSPORTENC hTpEnc,const cbSbr_t cbSbr,void * user_data)352*e5436536SAndroid Build Coastguard Worker int transportEnc_RegisterSbrCallback(HANDLE_TRANSPORTENC hTpEnc,
353*e5436536SAndroid Build Coastguard Worker                                      const cbSbr_t cbSbr, void *user_data) {
354*e5436536SAndroid Build Coastguard Worker   if (hTpEnc == NULL) {
355*e5436536SAndroid Build Coastguard Worker     return -1;
356*e5436536SAndroid Build Coastguard Worker   }
357*e5436536SAndroid Build Coastguard Worker   hTpEnc->callbacks.cbSbr = cbSbr;
358*e5436536SAndroid Build Coastguard Worker   hTpEnc->callbacks.cbSbrData = user_data;
359*e5436536SAndroid Build Coastguard Worker   return 0;
360*e5436536SAndroid Build Coastguard Worker }
transportEnc_RegisterUsacCallback(HANDLE_TRANSPORTENC hTpEnc,const cbUsac_t cbUsac,void * user_data)361*e5436536SAndroid Build Coastguard Worker int transportEnc_RegisterUsacCallback(HANDLE_TRANSPORTENC hTpEnc,
362*e5436536SAndroid Build Coastguard Worker                                       const cbUsac_t cbUsac, void *user_data) {
363*e5436536SAndroid Build Coastguard Worker   if (hTpEnc == NULL) {
364*e5436536SAndroid Build Coastguard Worker     return -1;
365*e5436536SAndroid Build Coastguard Worker   }
366*e5436536SAndroid Build Coastguard Worker   hTpEnc->callbacks.cbUsac = cbUsac;
367*e5436536SAndroid Build Coastguard Worker   hTpEnc->callbacks.cbUsacData = user_data;
368*e5436536SAndroid Build Coastguard Worker   return 0;
369*e5436536SAndroid Build Coastguard Worker }
370*e5436536SAndroid Build Coastguard Worker 
transportEnc_RegisterSscCallback(HANDLE_TRANSPORTENC hTpEnc,const cbSsc_t cbSsc,void * user_data)371*e5436536SAndroid Build Coastguard Worker int transportEnc_RegisterSscCallback(HANDLE_TRANSPORTENC hTpEnc,
372*e5436536SAndroid Build Coastguard Worker                                      const cbSsc_t cbSsc, void *user_data) {
373*e5436536SAndroid Build Coastguard Worker   if (hTpEnc == NULL) {
374*e5436536SAndroid Build Coastguard Worker     return -1;
375*e5436536SAndroid Build Coastguard Worker   }
376*e5436536SAndroid Build Coastguard Worker   hTpEnc->callbacks.cbSsc = cbSsc;
377*e5436536SAndroid Build Coastguard Worker   hTpEnc->callbacks.cbSscData = user_data;
378*e5436536SAndroid Build Coastguard Worker   return 0;
379*e5436536SAndroid Build Coastguard Worker }
380*e5436536SAndroid Build Coastguard Worker 
transportEnc_WriteAccessUnit(HANDLE_TRANSPORTENC hTp,INT frameUsedBits,int bufferFullness,int ncc)381*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_WriteAccessUnit(HANDLE_TRANSPORTENC hTp,
382*e5436536SAndroid Build Coastguard Worker                                                 INT frameUsedBits,
383*e5436536SAndroid Build Coastguard Worker                                                 int bufferFullness, int ncc) {
384*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR err = TRANSPORTENC_OK;
385*e5436536SAndroid Build Coastguard Worker 
386*e5436536SAndroid Build Coastguard Worker   if (!hTp) {
387*e5436536SAndroid Build Coastguard Worker     return TRANSPORTENC_INVALID_PARAMETER;
388*e5436536SAndroid Build Coastguard Worker   }
389*e5436536SAndroid Build Coastguard Worker   HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream;
390*e5436536SAndroid Build Coastguard Worker 
391*e5436536SAndroid Build Coastguard Worker   /* In case of writing PCE in raw_data_block frameUsedBits must be adapted. */
392*e5436536SAndroid Build Coastguard Worker   if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
393*e5436536SAndroid Build Coastguard Worker     frameUsedBits += transportEnc_GetPCEBits(
394*e5436536SAndroid Build Coastguard Worker         hTp->config.channelMode, hTp->config.matrixMixdownA,
395*e5436536SAndroid Build Coastguard Worker         3); /* Consider 3 bits ID signalling in alignment */
396*e5436536SAndroid Build Coastguard Worker   }
397*e5436536SAndroid Build Coastguard Worker 
398*e5436536SAndroid Build Coastguard Worker   switch (hTp->transportFmt) {
399*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADIF:
400*e5436536SAndroid Build Coastguard Worker       FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0,
401*e5436536SAndroid Build Coastguard Worker                        BS_WRITER);
402*e5436536SAndroid Build Coastguard Worker       if (0 != adifWrite_EncodeHeader(&hTp->writer.adif, hBs, bufferFullness)) {
403*e5436536SAndroid Build Coastguard Worker         err = TRANSPORTENC_INVALID_CONFIG;
404*e5436536SAndroid Build Coastguard Worker       }
405*e5436536SAndroid Build Coastguard Worker       break;
406*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
407*e5436536SAndroid Build Coastguard Worker       bufferFullness /= ncc; /* Number of Considered Channels */
408*e5436536SAndroid Build Coastguard Worker       bufferFullness /= 32;
409*e5436536SAndroid Build Coastguard Worker       bufferFullness = FDKmin(0x7FF, bufferFullness); /* Signal variable rate */
410*e5436536SAndroid Build Coastguard Worker       adtsWrite_EncodeHeader(&hTp->writer.adts, &hTp->bitStream, bufferFullness,
411*e5436536SAndroid Build Coastguard Worker                              frameUsedBits);
412*e5436536SAndroid Build Coastguard Worker       break;
413*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
414*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
415*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1:
416*e5436536SAndroid Build Coastguard Worker       bufferFullness /= ncc; /* Number of Considered Channels */
417*e5436536SAndroid Build Coastguard Worker       bufferFullness /= 32;
418*e5436536SAndroid Build Coastguard Worker       bufferFullness = FDKmin(0xFF, bufferFullness); /* Signal variable rate */
419*e5436536SAndroid Build Coastguard Worker       transportEnc_LatmWrite(&hTp->writer.latm, hBs, frameUsedBits,
420*e5436536SAndroid Build Coastguard Worker                              bufferFullness, &hTp->callbacks);
421*e5436536SAndroid Build Coastguard Worker       break;
422*e5436536SAndroid Build Coastguard Worker     case TT_MP4_RAW:
423*e5436536SAndroid Build Coastguard Worker       if (hTp->writer.raw.curSubFrame >= hTp->writer.raw.nSubFrames) {
424*e5436536SAndroid Build Coastguard Worker         hTp->writer.raw.curSubFrame = 0;
425*e5436536SAndroid Build Coastguard Worker         FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0,
426*e5436536SAndroid Build Coastguard Worker                          BS_WRITER);
427*e5436536SAndroid Build Coastguard Worker       }
428*e5436536SAndroid Build Coastguard Worker       hTp->writer.raw.prevBits = FDKgetValidBits(hBs);
429*e5436536SAndroid Build Coastguard Worker       break;
430*e5436536SAndroid Build Coastguard Worker     default:
431*e5436536SAndroid Build Coastguard Worker       err = TRANSPORTENC_UNSUPPORTED_FORMAT;
432*e5436536SAndroid Build Coastguard Worker       break;
433*e5436536SAndroid Build Coastguard Worker   }
434*e5436536SAndroid Build Coastguard Worker 
435*e5436536SAndroid Build Coastguard Worker   /* Write PCE in raw_data_block if required */
436*e5436536SAndroid Build Coastguard Worker   if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
437*e5436536SAndroid Build Coastguard Worker     INT crcIndex = 0;
438*e5436536SAndroid Build Coastguard Worker     /* Align inside PCE with repsect to the first bit of the raw_data_block() */
439*e5436536SAndroid Build Coastguard Worker     UINT alignAnchor = FDKgetValidBits(&hTp->bitStream);
440*e5436536SAndroid Build Coastguard Worker 
441*e5436536SAndroid Build Coastguard Worker     /* Write PCE element ID bits */
442*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(&hTp->bitStream, ID_PCE, 3);
443*e5436536SAndroid Build Coastguard Worker 
444*e5436536SAndroid Build Coastguard Worker     if ((hTp->transportFmt == TT_MP4_ADTS) &&
445*e5436536SAndroid Build Coastguard Worker         !hTp->writer.adts.protection_absent) {
446*e5436536SAndroid Build Coastguard Worker       crcIndex = adtsWrite_CrcStartReg(&hTp->writer.adts, &hTp->bitStream, 0);
447*e5436536SAndroid Build Coastguard Worker     }
448*e5436536SAndroid Build Coastguard Worker 
449*e5436536SAndroid Build Coastguard Worker     /* Write PCE as first raw_data_block element */
450*e5436536SAndroid Build Coastguard Worker     transportEnc_writePCE(
451*e5436536SAndroid Build Coastguard Worker         &hTp->bitStream, hTp->config.channelMode, hTp->config.samplingRate, 0,
452*e5436536SAndroid Build Coastguard Worker         1, hTp->config.matrixMixdownA,
453*e5436536SAndroid Build Coastguard Worker         (hTp->config.flags & CC_PSEUDO_SURROUND) ? 1 : 0, alignAnchor);
454*e5436536SAndroid Build Coastguard Worker 
455*e5436536SAndroid Build Coastguard Worker     if ((hTp->transportFmt == TT_MP4_ADTS) &&
456*e5436536SAndroid Build Coastguard Worker         !hTp->writer.adts.protection_absent) {
457*e5436536SAndroid Build Coastguard Worker       adtsWrite_CrcEndReg(&hTp->writer.adts, &hTp->bitStream, crcIndex);
458*e5436536SAndroid Build Coastguard Worker     }
459*e5436536SAndroid Build Coastguard Worker     hTp->pceFrameCounter = 0; /* reset pce frame counter */
460*e5436536SAndroid Build Coastguard Worker   }
461*e5436536SAndroid Build Coastguard Worker 
462*e5436536SAndroid Build Coastguard Worker   if (hTp->pceFrameCounter != -1) {
463*e5436536SAndroid Build Coastguard Worker     hTp->pceFrameCounter++; /* Update pceFrameCounter only if PCE writing is
464*e5436536SAndroid Build Coastguard Worker                                active. */
465*e5436536SAndroid Build Coastguard Worker   }
466*e5436536SAndroid Build Coastguard Worker 
467*e5436536SAndroid Build Coastguard Worker   return err;
468*e5436536SAndroid Build Coastguard Worker }
469*e5436536SAndroid Build Coastguard Worker 
transportEnc_EndAccessUnit(HANDLE_TRANSPORTENC hTp,int * bits)470*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_EndAccessUnit(HANDLE_TRANSPORTENC hTp,
471*e5436536SAndroid Build Coastguard Worker                                               int *bits) {
472*e5436536SAndroid Build Coastguard Worker   switch (hTp->transportFmt) {
473*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
474*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1:
475*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
476*e5436536SAndroid Build Coastguard Worker       transportEnc_LatmAdjustSubframeBits(&hTp->writer.latm, bits);
477*e5436536SAndroid Build Coastguard Worker       break;
478*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
479*e5436536SAndroid Build Coastguard Worker       adtsWrite_EndRawDataBlock(&hTp->writer.adts, &hTp->bitStream, bits);
480*e5436536SAndroid Build Coastguard Worker       break;
481*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADIF:
482*e5436536SAndroid Build Coastguard Worker       /* Substract ADIF header from AU bits, not to be considered. */
483*e5436536SAndroid Build Coastguard Worker       *bits -= adifWrite_GetHeaderBits(&hTp->writer.adif);
484*e5436536SAndroid Build Coastguard Worker       hTp->writer.adif.headerWritten = 1;
485*e5436536SAndroid Build Coastguard Worker       break;
486*e5436536SAndroid Build Coastguard Worker     case TT_MP4_RAW:
487*e5436536SAndroid Build Coastguard Worker       *bits -= hTp->writer.raw.prevBits;
488*e5436536SAndroid Build Coastguard Worker       break;
489*e5436536SAndroid Build Coastguard Worker     default:
490*e5436536SAndroid Build Coastguard Worker       break;
491*e5436536SAndroid Build Coastguard Worker   }
492*e5436536SAndroid Build Coastguard Worker 
493*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
494*e5436536SAndroid Build Coastguard Worker }
495*e5436536SAndroid Build Coastguard Worker 
transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc,int * nbytes)496*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc,
497*e5436536SAndroid Build Coastguard Worker                                          int *nbytes) {
498*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
499*e5436536SAndroid Build Coastguard Worker   HANDLE_FDK_BITSTREAM hBs = &hTpEnc->bitStream;
500*e5436536SAndroid Build Coastguard Worker 
501*e5436536SAndroid Build Coastguard Worker   switch (hTpEnc->transportFmt) {
502*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
503*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1:
504*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
505*e5436536SAndroid Build Coastguard Worker       *nbytes = hTpEnc->bsBufferSize;
506*e5436536SAndroid Build Coastguard Worker       tpErr = transportEnc_LatmGetFrame(&hTpEnc->writer.latm, hBs, nbytes);
507*e5436536SAndroid Build Coastguard Worker       break;
508*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
509*e5436536SAndroid Build Coastguard Worker       if (hTpEnc->writer.adts.currentBlock >=
510*e5436536SAndroid Build Coastguard Worker           hTpEnc->writer.adts.num_raw_blocks + 1) {
511*e5436536SAndroid Build Coastguard Worker         *nbytes = (FDKgetValidBits(hBs) + 7) >> 3;
512*e5436536SAndroid Build Coastguard Worker         hTpEnc->writer.adts.currentBlock = 0;
513*e5436536SAndroid Build Coastguard Worker       } else {
514*e5436536SAndroid Build Coastguard Worker         *nbytes = 0;
515*e5436536SAndroid Build Coastguard Worker       }
516*e5436536SAndroid Build Coastguard Worker       break;
517*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADIF:
518*e5436536SAndroid Build Coastguard Worker       FDK_ASSERT((INT)FDKgetValidBits(hBs) >= 0);
519*e5436536SAndroid Build Coastguard Worker       *nbytes = (FDKgetValidBits(hBs) + 7) >> 3;
520*e5436536SAndroid Build Coastguard Worker       break;
521*e5436536SAndroid Build Coastguard Worker     case TT_MP4_RAW:
522*e5436536SAndroid Build Coastguard Worker       FDKsyncCache(hBs);
523*e5436536SAndroid Build Coastguard Worker       hTpEnc->writer.raw.curSubFrame++;
524*e5436536SAndroid Build Coastguard Worker       *nbytes = ((FDKgetValidBits(hBs) - hTpEnc->writer.raw.prevBits) + 7) >> 3;
525*e5436536SAndroid Build Coastguard Worker       break;
526*e5436536SAndroid Build Coastguard Worker     default:
527*e5436536SAndroid Build Coastguard Worker       break;
528*e5436536SAndroid Build Coastguard Worker   }
529*e5436536SAndroid Build Coastguard Worker 
530*e5436536SAndroid Build Coastguard Worker   return tpErr;
531*e5436536SAndroid Build Coastguard Worker }
532*e5436536SAndroid Build Coastguard Worker 
transportEnc_GetStaticBits(HANDLE_TRANSPORTENC hTp,int auBits)533*e5436536SAndroid Build Coastguard Worker INT transportEnc_GetStaticBits(HANDLE_TRANSPORTENC hTp, int auBits) {
534*e5436536SAndroid Build Coastguard Worker   INT nbits = 0, nPceBits = 0;
535*e5436536SAndroid Build Coastguard Worker 
536*e5436536SAndroid Build Coastguard Worker   /* Write PCE within raw_data_block in transport lib. */
537*e5436536SAndroid Build Coastguard Worker   if (hTp->pceFrameCounter >= hTp->config.headerPeriod) {
538*e5436536SAndroid Build Coastguard Worker     nPceBits = transportEnc_GetPCEBits(
539*e5436536SAndroid Build Coastguard Worker         hTp->config.channelMode, hTp->config.matrixMixdownA,
540*e5436536SAndroid Build Coastguard Worker         3);             /* Consider 3 bits ID signalling in alignment */
541*e5436536SAndroid Build Coastguard Worker     auBits += nPceBits; /* Adapt required raw_data_block bit consumtpion for AU
542*e5436536SAndroid Build Coastguard Worker                            length information e.g. in LATM/LOAS configuration.
543*e5436536SAndroid Build Coastguard Worker                          */
544*e5436536SAndroid Build Coastguard Worker   }
545*e5436536SAndroid Build Coastguard Worker 
546*e5436536SAndroid Build Coastguard Worker   switch (hTp->transportFmt) {
547*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADIF:
548*e5436536SAndroid Build Coastguard Worker     case TT_MP4_RAW:
549*e5436536SAndroid Build Coastguard Worker       nbits = 0; /* Do not consider the ADIF header into the total bitrate */
550*e5436536SAndroid Build Coastguard Worker       break;
551*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
552*e5436536SAndroid Build Coastguard Worker       nbits = adtsWrite_GetHeaderBits(&hTp->writer.adts);
553*e5436536SAndroid Build Coastguard Worker       break;
554*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
555*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
556*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1:
557*e5436536SAndroid Build Coastguard Worker       nbits =
558*e5436536SAndroid Build Coastguard Worker           transportEnc_LatmCountTotalBitDemandHeader(&hTp->writer.latm, auBits);
559*e5436536SAndroid Build Coastguard Worker       break;
560*e5436536SAndroid Build Coastguard Worker     default:
561*e5436536SAndroid Build Coastguard Worker       nbits = 0;
562*e5436536SAndroid Build Coastguard Worker       break;
563*e5436536SAndroid Build Coastguard Worker   }
564*e5436536SAndroid Build Coastguard Worker 
565*e5436536SAndroid Build Coastguard Worker   /* PCE is written in the transport library therefore the bit consumption is
566*e5436536SAndroid Build Coastguard Worker    * part of the transport static bits. */
567*e5436536SAndroid Build Coastguard Worker   nbits += nPceBits;
568*e5436536SAndroid Build Coastguard Worker 
569*e5436536SAndroid Build Coastguard Worker   return nbits;
570*e5436536SAndroid Build Coastguard Worker }
571*e5436536SAndroid Build Coastguard Worker 
transportEnc_Close(HANDLE_TRANSPORTENC * phTp)572*e5436536SAndroid Build Coastguard Worker void transportEnc_Close(HANDLE_TRANSPORTENC *phTp) {
573*e5436536SAndroid Build Coastguard Worker   if (phTp != NULL) {
574*e5436536SAndroid Build Coastguard Worker     if (*phTp != NULL) {
575*e5436536SAndroid Build Coastguard Worker       FreeRam_TransportEncoder(phTp);
576*e5436536SAndroid Build Coastguard Worker     }
577*e5436536SAndroid Build Coastguard Worker   }
578*e5436536SAndroid Build Coastguard Worker }
579*e5436536SAndroid Build Coastguard Worker 
transportEnc_CrcStartReg(HANDLE_TRANSPORTENC hTpEnc,int mBits)580*e5436536SAndroid Build Coastguard Worker int transportEnc_CrcStartReg(HANDLE_TRANSPORTENC hTpEnc, int mBits) {
581*e5436536SAndroid Build Coastguard Worker   int crcReg = 0;
582*e5436536SAndroid Build Coastguard Worker 
583*e5436536SAndroid Build Coastguard Worker   switch (hTpEnc->transportFmt) {
584*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
585*e5436536SAndroid Build Coastguard Worker       crcReg = adtsWrite_CrcStartReg(&hTpEnc->writer.adts, &hTpEnc->bitStream,
586*e5436536SAndroid Build Coastguard Worker                                      mBits);
587*e5436536SAndroid Build Coastguard Worker       break;
588*e5436536SAndroid Build Coastguard Worker     default:
589*e5436536SAndroid Build Coastguard Worker       break;
590*e5436536SAndroid Build Coastguard Worker   }
591*e5436536SAndroid Build Coastguard Worker 
592*e5436536SAndroid Build Coastguard Worker   return crcReg;
593*e5436536SAndroid Build Coastguard Worker }
594*e5436536SAndroid Build Coastguard Worker 
transportEnc_CrcEndReg(HANDLE_TRANSPORTENC hTpEnc,int reg)595*e5436536SAndroid Build Coastguard Worker void transportEnc_CrcEndReg(HANDLE_TRANSPORTENC hTpEnc, int reg) {
596*e5436536SAndroid Build Coastguard Worker   switch (hTpEnc->transportFmt) {
597*e5436536SAndroid Build Coastguard Worker     case TT_MP4_ADTS:
598*e5436536SAndroid Build Coastguard Worker       adtsWrite_CrcEndReg(&hTpEnc->writer.adts, &hTpEnc->bitStream, reg);
599*e5436536SAndroid Build Coastguard Worker       break;
600*e5436536SAndroid Build Coastguard Worker     default:
601*e5436536SAndroid Build Coastguard Worker       break;
602*e5436536SAndroid Build Coastguard Worker   }
603*e5436536SAndroid Build Coastguard Worker }
604*e5436536SAndroid Build Coastguard Worker 
transportEnc_GetConf(HANDLE_TRANSPORTENC hTpEnc,CODER_CONFIG * cc,FDK_BITSTREAM * dataBuffer,UINT * confType)605*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_GetConf(HANDLE_TRANSPORTENC hTpEnc,
606*e5436536SAndroid Build Coastguard Worker                                         CODER_CONFIG *cc,
607*e5436536SAndroid Build Coastguard Worker                                         FDK_BITSTREAM *dataBuffer,
608*e5436536SAndroid Build Coastguard Worker                                         UINT *confType) {
609*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK;
610*e5436536SAndroid Build Coastguard Worker   HANDLE_LATM_STREAM hLatmConfig = &hTpEnc->writer.latm;
611*e5436536SAndroid Build Coastguard Worker 
612*e5436536SAndroid Build Coastguard Worker   *confType = 0; /* set confType variable to default */
613*e5436536SAndroid Build Coastguard Worker 
614*e5436536SAndroid Build Coastguard Worker   /* write StreamMuxConfig or AudioSpecificConfig depending on format used */
615*e5436536SAndroid Build Coastguard Worker   switch (hTpEnc->transportFmt) {
616*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
617*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1:
618*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
619*e5436536SAndroid Build Coastguard Worker       tpErr =
620*e5436536SAndroid Build Coastguard Worker           CreateStreamMuxConfig(hLatmConfig, dataBuffer, 0, &hTpEnc->callbacks);
621*e5436536SAndroid Build Coastguard Worker       *confType = 1; /* config is SMC */
622*e5436536SAndroid Build Coastguard Worker       break;
623*e5436536SAndroid Build Coastguard Worker     default:
624*e5436536SAndroid Build Coastguard Worker       if (transportEnc_writeASC(dataBuffer, cc, &hTpEnc->callbacks) != 0) {
625*e5436536SAndroid Build Coastguard Worker         tpErr = TRANSPORTENC_UNKOWN_ERROR;
626*e5436536SAndroid Build Coastguard Worker       }
627*e5436536SAndroid Build Coastguard Worker   }
628*e5436536SAndroid Build Coastguard Worker 
629*e5436536SAndroid Build Coastguard Worker   return tpErr;
630*e5436536SAndroid Build Coastguard Worker }
631*e5436536SAndroid Build Coastguard Worker 
transportEnc_GetLibInfo(LIB_INFO * info)632*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_GetLibInfo(LIB_INFO *info) {
633*e5436536SAndroid Build Coastguard Worker   int i;
634*e5436536SAndroid Build Coastguard Worker 
635*e5436536SAndroid Build Coastguard Worker   if (info == NULL) {
636*e5436536SAndroid Build Coastguard Worker     return TRANSPORTENC_INVALID_PARAMETER;
637*e5436536SAndroid Build Coastguard Worker   }
638*e5436536SAndroid Build Coastguard Worker   /* search for next free tab */
639*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < FDK_MODULE_LAST; i++) {
640*e5436536SAndroid Build Coastguard Worker     if (info[i].module_id == FDK_NONE) break;
641*e5436536SAndroid Build Coastguard Worker   }
642*e5436536SAndroid Build Coastguard Worker   if (i == FDK_MODULE_LAST) {
643*e5436536SAndroid Build Coastguard Worker     return TRANSPORTENC_UNKOWN_ERROR;
644*e5436536SAndroid Build Coastguard Worker   }
645*e5436536SAndroid Build Coastguard Worker   info += i;
646*e5436536SAndroid Build Coastguard Worker 
647*e5436536SAndroid Build Coastguard Worker   info->module_id = FDK_TPENC;
648*e5436536SAndroid Build Coastguard Worker   info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2);
649*e5436536SAndroid Build Coastguard Worker   LIB_VERSION_STRING(info);
650*e5436536SAndroid Build Coastguard Worker #ifdef SUPPRESS_BUILD_DATE_INFO
651*e5436536SAndroid Build Coastguard Worker   info->build_date = "";
652*e5436536SAndroid Build Coastguard Worker   info->build_time = "";
653*e5436536SAndroid Build Coastguard Worker #else
654*e5436536SAndroid Build Coastguard Worker   info->build_date = __DATE__;
655*e5436536SAndroid Build Coastguard Worker   info->build_time = __TIME__;
656*e5436536SAndroid Build Coastguard Worker #endif
657*e5436536SAndroid Build Coastguard Worker   info->title = TP_LIB_TITLE;
658*e5436536SAndroid Build Coastguard Worker 
659*e5436536SAndroid Build Coastguard Worker   /* Set flags */
660*e5436536SAndroid Build Coastguard Worker   info->flags =
661*e5436536SAndroid Build Coastguard Worker       0 | CAPF_ADIF | CAPF_ADTS | CAPF_LATM | CAPF_LOAS | CAPF_RAWPACKETS;
662*e5436536SAndroid Build Coastguard Worker 
663*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
664*e5436536SAndroid Build Coastguard Worker }
665