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