xref: /aosp_15_r20/external/aac/libMpegTPEnc/src/tpenc_latm.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):
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description:
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #include "tpenc_latm.h"
104*e5436536SAndroid Build Coastguard Worker 
105*e5436536SAndroid Build Coastguard Worker #include "genericStds.h"
106*e5436536SAndroid Build Coastguard Worker 
107*e5436536SAndroid Build Coastguard Worker static const short celpFrameLengthTable[64] = {
108*e5436536SAndroid Build Coastguard Worker     154, 170, 186, 147, 156, 165, 114, 120, 186, 126, 132, 138, 142,
109*e5436536SAndroid Build Coastguard Worker     146, 154, 166, 174, 182, 190, 198, 206, 210, 214, 110, 114, 118,
110*e5436536SAndroid Build Coastguard Worker     120, 122, 218, 230, 242, 254, 266, 278, 286, 294, 318, 342, 358,
111*e5436536SAndroid Build Coastguard Worker     374, 390, 406, 422, 136, 142, 148, 154, 160, 166, 170, 174, 186,
112*e5436536SAndroid Build Coastguard Worker     198, 206, 214, 222, 230, 238, 216, 160, 280, 338, 0,   0};
113*e5436536SAndroid Build Coastguard Worker 
114*e5436536SAndroid Build Coastguard Worker /*******
115*e5436536SAndroid Build Coastguard Worker  write value to transport stream
116*e5436536SAndroid Build Coastguard Worker  first two bits define the size of the value itself
117*e5436536SAndroid Build Coastguard Worker  then the value itself, with a size of 0-3 bytes
118*e5436536SAndroid Build Coastguard Worker *******/
transportEnc_LatmWriteValue(HANDLE_FDK_BITSTREAM hBs,int value)119*e5436536SAndroid Build Coastguard Worker static UINT transportEnc_LatmWriteValue(HANDLE_FDK_BITSTREAM hBs, int value) {
120*e5436536SAndroid Build Coastguard Worker   UCHAR valueBytes = 4;
121*e5436536SAndroid Build Coastguard Worker   unsigned int bitsWritten = 0;
122*e5436536SAndroid Build Coastguard Worker   int i;
123*e5436536SAndroid Build Coastguard Worker 
124*e5436536SAndroid Build Coastguard Worker   if (value < (1 << 8)) {
125*e5436536SAndroid Build Coastguard Worker     valueBytes = 1;
126*e5436536SAndroid Build Coastguard Worker   } else if (value < (1 << 16)) {
127*e5436536SAndroid Build Coastguard Worker     valueBytes = 2;
128*e5436536SAndroid Build Coastguard Worker   } else if (value < (1 << 24)) {
129*e5436536SAndroid Build Coastguard Worker     valueBytes = 3;
130*e5436536SAndroid Build Coastguard Worker   } else {
131*e5436536SAndroid Build Coastguard Worker     valueBytes = 4;
132*e5436536SAndroid Build Coastguard Worker   }
133*e5436536SAndroid Build Coastguard Worker 
134*e5436536SAndroid Build Coastguard Worker   FDKwriteBits(hBs, valueBytes - 1, 2); /* size of value in Bytes */
135*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < valueBytes; i++) {
136*e5436536SAndroid Build Coastguard Worker     /* write most significant Byte first */
137*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, (UCHAR)(value >> ((valueBytes - 1 - i) << 3)), 8);
138*e5436536SAndroid Build Coastguard Worker   }
139*e5436536SAndroid Build Coastguard Worker 
140*e5436536SAndroid Build Coastguard Worker   bitsWritten = (valueBytes << 3) + 2;
141*e5436536SAndroid Build Coastguard Worker 
142*e5436536SAndroid Build Coastguard Worker   return bitsWritten;
143*e5436536SAndroid Build Coastguard Worker }
144*e5436536SAndroid Build Coastguard Worker 
transportEnc_LatmCountFixBitDemandHeader(HANDLE_LATM_STREAM hAss)145*e5436536SAndroid Build Coastguard Worker static UINT transportEnc_LatmCountFixBitDemandHeader(HANDLE_LATM_STREAM hAss) {
146*e5436536SAndroid Build Coastguard Worker   int bitDemand = 0;
147*e5436536SAndroid Build Coastguard Worker   int insertSetupData = 0;
148*e5436536SAndroid Build Coastguard Worker 
149*e5436536SAndroid Build Coastguard Worker   /* only if start of new latm frame */
150*e5436536SAndroid Build Coastguard Worker   if (hAss->subFrameCnt == 0) {
151*e5436536SAndroid Build Coastguard Worker     /* AudioSyncStream */
152*e5436536SAndroid Build Coastguard Worker 
153*e5436536SAndroid Build Coastguard Worker     if (hAss->tt == TT_MP4_LOAS) {
154*e5436536SAndroid Build Coastguard Worker       bitDemand += 11; /* syncword */
155*e5436536SAndroid Build Coastguard Worker       bitDemand += 13; /* audioMuxLengthBytes */
156*e5436536SAndroid Build Coastguard Worker     }
157*e5436536SAndroid Build Coastguard Worker 
158*e5436536SAndroid Build Coastguard Worker     /* AudioMuxElement*/
159*e5436536SAndroid Build Coastguard Worker 
160*e5436536SAndroid Build Coastguard Worker     /* AudioMuxElement::Stream Mux Config */
161*e5436536SAndroid Build Coastguard Worker     if (hAss->muxConfigPeriod > 0) {
162*e5436536SAndroid Build Coastguard Worker       insertSetupData = (hAss->latmFrameCounter == 0);
163*e5436536SAndroid Build Coastguard Worker     } else {
164*e5436536SAndroid Build Coastguard Worker       insertSetupData = 0;
165*e5436536SAndroid Build Coastguard Worker     }
166*e5436536SAndroid Build Coastguard Worker 
167*e5436536SAndroid Build Coastguard Worker     if (hAss->tt != TT_MP4_LATM_MCP0) {
168*e5436536SAndroid Build Coastguard Worker       /* AudioMuxElement::useSameStreamMux Flag */
169*e5436536SAndroid Build Coastguard Worker       bitDemand += 1;
170*e5436536SAndroid Build Coastguard Worker 
171*e5436536SAndroid Build Coastguard Worker       if (insertSetupData) {
172*e5436536SAndroid Build Coastguard Worker         bitDemand += hAss->streamMuxConfigBits;
173*e5436536SAndroid Build Coastguard Worker       }
174*e5436536SAndroid Build Coastguard Worker     }
175*e5436536SAndroid Build Coastguard Worker 
176*e5436536SAndroid Build Coastguard Worker     /* AudioMuxElement::otherDataBits */
177*e5436536SAndroid Build Coastguard Worker     bitDemand += hAss->otherDataLenBits;
178*e5436536SAndroid Build Coastguard Worker 
179*e5436536SAndroid Build Coastguard Worker     /* AudioMuxElement::ByteAlign */
180*e5436536SAndroid Build Coastguard Worker     if (bitDemand % 8) {
181*e5436536SAndroid Build Coastguard Worker       hAss->fillBits = 8 - (bitDemand % 8);
182*e5436536SAndroid Build Coastguard Worker       bitDemand += hAss->fillBits;
183*e5436536SAndroid Build Coastguard Worker     } else {
184*e5436536SAndroid Build Coastguard Worker       hAss->fillBits = 0;
185*e5436536SAndroid Build Coastguard Worker     }
186*e5436536SAndroid Build Coastguard Worker   }
187*e5436536SAndroid Build Coastguard Worker 
188*e5436536SAndroid Build Coastguard Worker   return bitDemand;
189*e5436536SAndroid Build Coastguard Worker }
190*e5436536SAndroid Build Coastguard Worker 
transportEnc_LatmCountVarBitDemandHeader(HANDLE_LATM_STREAM hAss,unsigned int streamDataLength)191*e5436536SAndroid Build Coastguard Worker static UINT transportEnc_LatmCountVarBitDemandHeader(
192*e5436536SAndroid Build Coastguard Worker     HANDLE_LATM_STREAM hAss, unsigned int streamDataLength) {
193*e5436536SAndroid Build Coastguard Worker   int bitDemand = 0;
194*e5436536SAndroid Build Coastguard Worker   int prog, layer;
195*e5436536SAndroid Build Coastguard Worker 
196*e5436536SAndroid Build Coastguard Worker   /* Payload Length Info*/
197*e5436536SAndroid Build Coastguard Worker   if (hAss->allStreamsSameTimeFraming) {
198*e5436536SAndroid Build Coastguard Worker     for (prog = 0; prog < hAss->noProgram; prog++) {
199*e5436536SAndroid Build Coastguard Worker       for (layer = 0; layer < LATM_MAX_LAYERS; layer++) {
200*e5436536SAndroid Build Coastguard Worker         LATM_LAYER_INFO *p_linfo = &(hAss->m_linfo[prog][layer]);
201*e5436536SAndroid Build Coastguard Worker 
202*e5436536SAndroid Build Coastguard Worker         if (p_linfo->streamID >= 0) {
203*e5436536SAndroid Build Coastguard Worker           switch (p_linfo->frameLengthType) {
204*e5436536SAndroid Build Coastguard Worker             case 0:
205*e5436536SAndroid Build Coastguard Worker               if (streamDataLength > 0) {
206*e5436536SAndroid Build Coastguard Worker                 streamDataLength -= bitDemand;
207*e5436536SAndroid Build Coastguard Worker                 while (streamDataLength >= (255 << 3)) {
208*e5436536SAndroid Build Coastguard Worker                   bitDemand += 8;
209*e5436536SAndroid Build Coastguard Worker                   streamDataLength -= (255 << 3);
210*e5436536SAndroid Build Coastguard Worker                 }
211*e5436536SAndroid Build Coastguard Worker                 bitDemand += 8;
212*e5436536SAndroid Build Coastguard Worker               }
213*e5436536SAndroid Build Coastguard Worker               break;
214*e5436536SAndroid Build Coastguard Worker 
215*e5436536SAndroid Build Coastguard Worker             case 1:
216*e5436536SAndroid Build Coastguard Worker             case 4:
217*e5436536SAndroid Build Coastguard Worker             case 6:
218*e5436536SAndroid Build Coastguard Worker               bitDemand += 2;
219*e5436536SAndroid Build Coastguard Worker               break;
220*e5436536SAndroid Build Coastguard Worker 
221*e5436536SAndroid Build Coastguard Worker             default:
222*e5436536SAndroid Build Coastguard Worker               return 0;
223*e5436536SAndroid Build Coastguard Worker           }
224*e5436536SAndroid Build Coastguard Worker         }
225*e5436536SAndroid Build Coastguard Worker       }
226*e5436536SAndroid Build Coastguard Worker     }
227*e5436536SAndroid Build Coastguard Worker   } else {
228*e5436536SAndroid Build Coastguard Worker     /* there are many possibilities to use this mechanism.  */
229*e5436536SAndroid Build Coastguard Worker     switch (hAss->varMode) {
230*e5436536SAndroid Build Coastguard Worker       case LATMVAR_SIMPLE_SEQUENCE: {
231*e5436536SAndroid Build Coastguard Worker         /* Use the sequence generated by the encoder */
232*e5436536SAndroid Build Coastguard Worker         // int streamCntPosition = transportEnc_SetWritePointer(
233*e5436536SAndroid Build Coastguard Worker         // hAss->hAssemble, 0 );  int streamCntPosition = FDKgetValidBits(
234*e5436536SAndroid Build Coastguard Worker         // hAss->hAssemble );
235*e5436536SAndroid Build Coastguard Worker         bitDemand += 4;
236*e5436536SAndroid Build Coastguard Worker 
237*e5436536SAndroid Build Coastguard Worker         hAss->varStreamCnt = 0;
238*e5436536SAndroid Build Coastguard Worker         for (prog = 0; prog < hAss->noProgram; prog++) {
239*e5436536SAndroid Build Coastguard Worker           for (layer = 0; layer < LATM_MAX_LAYERS; layer++) {
240*e5436536SAndroid Build Coastguard Worker             LATM_LAYER_INFO *p_linfo = &(hAss->m_linfo[prog][layer]);
241*e5436536SAndroid Build Coastguard Worker 
242*e5436536SAndroid Build Coastguard Worker             if (p_linfo->streamID >= 0) {
243*e5436536SAndroid Build Coastguard Worker               bitDemand += 4; /* streamID */
244*e5436536SAndroid Build Coastguard Worker               switch (p_linfo->frameLengthType) {
245*e5436536SAndroid Build Coastguard Worker                 case 0:
246*e5436536SAndroid Build Coastguard Worker                   streamDataLength -= bitDemand;
247*e5436536SAndroid Build Coastguard Worker                   while (streamDataLength >= (255 << 3)) {
248*e5436536SAndroid Build Coastguard Worker                     bitDemand += 8;
249*e5436536SAndroid Build Coastguard Worker                     streamDataLength -= (255 << 3);
250*e5436536SAndroid Build Coastguard Worker                   }
251*e5436536SAndroid Build Coastguard Worker 
252*e5436536SAndroid Build Coastguard Worker                   bitDemand += 8;
253*e5436536SAndroid Build Coastguard Worker                   break;
254*e5436536SAndroid Build Coastguard Worker                   /*bitDemand += 1; endFlag
255*e5436536SAndroid Build Coastguard Worker                   break;*/
256*e5436536SAndroid Build Coastguard Worker 
257*e5436536SAndroid Build Coastguard Worker                 case 1:
258*e5436536SAndroid Build Coastguard Worker                 case 4:
259*e5436536SAndroid Build Coastguard Worker                 case 6:
260*e5436536SAndroid Build Coastguard Worker 
261*e5436536SAndroid Build Coastguard Worker                   break;
262*e5436536SAndroid Build Coastguard Worker 
263*e5436536SAndroid Build Coastguard Worker                 default:
264*e5436536SAndroid Build Coastguard Worker                   return 0;
265*e5436536SAndroid Build Coastguard Worker               }
266*e5436536SAndroid Build Coastguard Worker               hAss->varStreamCnt++;
267*e5436536SAndroid Build Coastguard Worker             }
268*e5436536SAndroid Build Coastguard Worker           }
269*e5436536SAndroid Build Coastguard Worker         }
270*e5436536SAndroid Build Coastguard Worker         bitDemand += 4;
271*e5436536SAndroid Build Coastguard Worker         // transportEnc_UpdateBitstreamField( hAss->hAssemble,
272*e5436536SAndroid Build Coastguard Worker         // streamCntPosition, hAss->varStreamCnt-1, 4 );  UINT pos =
273*e5436536SAndroid Build Coastguard Worker         // streamCntPosition-FDKgetValidBits(hAss->hAssemble);  FDKpushBack(
274*e5436536SAndroid Build Coastguard Worker         // hAss->hAssemble,  pos);  FDKwriteBits( hAss->hAssemble,
275*e5436536SAndroid Build Coastguard Worker         // hAss->varStreamCnt-1, 4);  FDKpushFor( hAss->hAssemble, pos-4);
276*e5436536SAndroid Build Coastguard Worker       } break;
277*e5436536SAndroid Build Coastguard Worker 
278*e5436536SAndroid Build Coastguard Worker       default:
279*e5436536SAndroid Build Coastguard Worker         return 0;
280*e5436536SAndroid Build Coastguard Worker     }
281*e5436536SAndroid Build Coastguard Worker   }
282*e5436536SAndroid Build Coastguard Worker 
283*e5436536SAndroid Build Coastguard Worker   return bitDemand;
284*e5436536SAndroid Build Coastguard Worker }
285*e5436536SAndroid Build Coastguard Worker 
286*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR
CreateStreamMuxConfig(HANDLE_LATM_STREAM hAss,HANDLE_FDK_BITSTREAM hBs,int bufferFullness,CSTpCallBacks * cb)287*e5436536SAndroid Build Coastguard Worker CreateStreamMuxConfig(HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs,
288*e5436536SAndroid Build Coastguard Worker                       int bufferFullness, CSTpCallBacks *cb) {
289*e5436536SAndroid Build Coastguard Worker   INT streamIDcnt, tmp;
290*e5436536SAndroid Build Coastguard Worker   int layer, prog;
291*e5436536SAndroid Build Coastguard Worker 
292*e5436536SAndroid Build Coastguard Worker   USHORT coreFrameOffset = 0;
293*e5436536SAndroid Build Coastguard Worker 
294*e5436536SAndroid Build Coastguard Worker   hAss->taraBufferFullness = 0xFF;
295*e5436536SAndroid Build Coastguard Worker   hAss->audioMuxVersionA = 0; /* for future extensions */
296*e5436536SAndroid Build Coastguard Worker   hAss->streamMuxConfigBits = 0;
297*e5436536SAndroid Build Coastguard Worker 
298*e5436536SAndroid Build Coastguard Worker   FDKwriteBits(hBs, hAss->audioMuxVersion, 1); /* audioMuxVersion */
299*e5436536SAndroid Build Coastguard Worker   hAss->streamMuxConfigBits += 1;
300*e5436536SAndroid Build Coastguard Worker 
301*e5436536SAndroid Build Coastguard Worker   if (hAss->audioMuxVersion == 1) {
302*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, hAss->audioMuxVersionA, 1); /* audioMuxVersionA */
303*e5436536SAndroid Build Coastguard Worker     hAss->streamMuxConfigBits += 1;
304*e5436536SAndroid Build Coastguard Worker   }
305*e5436536SAndroid Build Coastguard Worker 
306*e5436536SAndroid Build Coastguard Worker   if (hAss->audioMuxVersionA == 0) {
307*e5436536SAndroid Build Coastguard Worker     if (hAss->audioMuxVersion == 1) {
308*e5436536SAndroid Build Coastguard Worker       hAss->streamMuxConfigBits += transportEnc_LatmWriteValue(
309*e5436536SAndroid Build Coastguard Worker           hBs, hAss->taraBufferFullness); /* taraBufferFullness */
310*e5436536SAndroid Build Coastguard Worker     }
311*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, hAss->allStreamsSameTimeFraming ? 1 : 0,
312*e5436536SAndroid Build Coastguard Worker                  1);                             /* allStreamsSameTimeFraming */
313*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, hAss->noSubframes - 1, 6); /* Number of Subframes */
314*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, hAss->noProgram - 1, 4);   /* Number of Programs */
315*e5436536SAndroid Build Coastguard Worker 
316*e5436536SAndroid Build Coastguard Worker     hAss->streamMuxConfigBits += 11;
317*e5436536SAndroid Build Coastguard Worker 
318*e5436536SAndroid Build Coastguard Worker     streamIDcnt = 0;
319*e5436536SAndroid Build Coastguard Worker     for (prog = 0; prog < hAss->noProgram; prog++) {
320*e5436536SAndroid Build Coastguard Worker       int transLayer = 0;
321*e5436536SAndroid Build Coastguard Worker 
322*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(hBs, hAss->noLayer[prog] - 1, 3);
323*e5436536SAndroid Build Coastguard Worker       hAss->streamMuxConfigBits += 3;
324*e5436536SAndroid Build Coastguard Worker 
325*e5436536SAndroid Build Coastguard Worker       for (layer = 0; layer < LATM_MAX_LAYERS; layer++) {
326*e5436536SAndroid Build Coastguard Worker         LATM_LAYER_INFO *p_linfo = &(hAss->m_linfo[prog][layer]);
327*e5436536SAndroid Build Coastguard Worker         CODER_CONFIG *p_lci = hAss->config[prog][layer];
328*e5436536SAndroid Build Coastguard Worker 
329*e5436536SAndroid Build Coastguard Worker         p_linfo->streamID = -1;
330*e5436536SAndroid Build Coastguard Worker 
331*e5436536SAndroid Build Coastguard Worker         if (hAss->config[prog][layer] != NULL) {
332*e5436536SAndroid Build Coastguard Worker           int useSameConfig = 0;
333*e5436536SAndroid Build Coastguard Worker 
334*e5436536SAndroid Build Coastguard Worker           if (transLayer > 0) {
335*e5436536SAndroid Build Coastguard Worker             FDKwriteBits(hBs, useSameConfig ? 1 : 0, 1);
336*e5436536SAndroid Build Coastguard Worker             hAss->streamMuxConfigBits += 1;
337*e5436536SAndroid Build Coastguard Worker           }
338*e5436536SAndroid Build Coastguard Worker           if ((useSameConfig == 0) || (transLayer == 0)) {
339*e5436536SAndroid Build Coastguard Worker             const UINT alignAnchor = FDKgetValidBits(hBs);
340*e5436536SAndroid Build Coastguard Worker 
341*e5436536SAndroid Build Coastguard Worker             if (0 !=
342*e5436536SAndroid Build Coastguard Worker                 (transportEnc_writeASC(hBs, hAss->config[prog][layer], cb))) {
343*e5436536SAndroid Build Coastguard Worker               return TRANSPORTENC_UNKOWN_ERROR;
344*e5436536SAndroid Build Coastguard Worker             }
345*e5436536SAndroid Build Coastguard Worker 
346*e5436536SAndroid Build Coastguard Worker             if (hAss->audioMuxVersion == 1) {
347*e5436536SAndroid Build Coastguard Worker               UINT ascLen = transportEnc_LatmWriteValue(hBs, 0);
348*e5436536SAndroid Build Coastguard Worker               FDKbyteAlign(hBs, alignAnchor);
349*e5436536SAndroid Build Coastguard Worker               ascLen = FDKgetValidBits(hBs) - alignAnchor - ascLen;
350*e5436536SAndroid Build Coastguard Worker               FDKpushBack(hBs, FDKgetValidBits(hBs) - alignAnchor);
351*e5436536SAndroid Build Coastguard Worker 
352*e5436536SAndroid Build Coastguard Worker               transportEnc_LatmWriteValue(hBs, ascLen);
353*e5436536SAndroid Build Coastguard Worker 
354*e5436536SAndroid Build Coastguard Worker               if (0 !=
355*e5436536SAndroid Build Coastguard Worker                   (transportEnc_writeASC(hBs, hAss->config[prog][layer], cb))) {
356*e5436536SAndroid Build Coastguard Worker                 return TRANSPORTENC_UNKOWN_ERROR;
357*e5436536SAndroid Build Coastguard Worker               }
358*e5436536SAndroid Build Coastguard Worker 
359*e5436536SAndroid Build Coastguard Worker               FDKbyteAlign(hBs, alignAnchor); /* asc length fillbits */
360*e5436536SAndroid Build Coastguard Worker             }
361*e5436536SAndroid Build Coastguard Worker 
362*e5436536SAndroid Build Coastguard Worker             hAss->streamMuxConfigBits +=
363*e5436536SAndroid Build Coastguard Worker                 FDKgetValidBits(hBs) -
364*e5436536SAndroid Build Coastguard Worker                 alignAnchor; /* add asc length to smc summary */
365*e5436536SAndroid Build Coastguard Worker           }
366*e5436536SAndroid Build Coastguard Worker           transLayer++;
367*e5436536SAndroid Build Coastguard Worker 
368*e5436536SAndroid Build Coastguard Worker           if (!hAss->allStreamsSameTimeFraming) {
369*e5436536SAndroid Build Coastguard Worker             if (streamIDcnt >= LATM_MAX_STREAM_ID)
370*e5436536SAndroid Build Coastguard Worker               return TRANSPORTENC_INVALID_CONFIG;
371*e5436536SAndroid Build Coastguard Worker           }
372*e5436536SAndroid Build Coastguard Worker           p_linfo->streamID = streamIDcnt++;
373*e5436536SAndroid Build Coastguard Worker 
374*e5436536SAndroid Build Coastguard Worker           switch (p_lci->aot) {
375*e5436536SAndroid Build Coastguard Worker             case AOT_AAC_MAIN:
376*e5436536SAndroid Build Coastguard Worker             case AOT_AAC_LC:
377*e5436536SAndroid Build Coastguard Worker             case AOT_AAC_SSR:
378*e5436536SAndroid Build Coastguard Worker             case AOT_AAC_LTP:
379*e5436536SAndroid Build Coastguard Worker             case AOT_AAC_SCAL:
380*e5436536SAndroid Build Coastguard Worker             case AOT_ER_AAC_LD:
381*e5436536SAndroid Build Coastguard Worker             case AOT_ER_AAC_ELD:
382*e5436536SAndroid Build Coastguard Worker             case AOT_USAC:
383*e5436536SAndroid Build Coastguard Worker               p_linfo->frameLengthType = 0;
384*e5436536SAndroid Build Coastguard Worker 
385*e5436536SAndroid Build Coastguard Worker               FDKwriteBits(hBs, p_linfo->frameLengthType,
386*e5436536SAndroid Build Coastguard Worker                            3);                      /* frameLengthType */
387*e5436536SAndroid Build Coastguard Worker               FDKwriteBits(hBs, bufferFullness, 8); /* bufferFullness */
388*e5436536SAndroid Build Coastguard Worker               hAss->streamMuxConfigBits += 11;
389*e5436536SAndroid Build Coastguard Worker 
390*e5436536SAndroid Build Coastguard Worker               if (!hAss->allStreamsSameTimeFraming) {
391*e5436536SAndroid Build Coastguard Worker                 CODER_CONFIG *p_lci_prev = hAss->config[prog][layer - 1];
392*e5436536SAndroid Build Coastguard Worker                 if (((p_lci->aot == AOT_AAC_SCAL) ||
393*e5436536SAndroid Build Coastguard Worker                      (p_lci->aot == AOT_ER_AAC_SCAL)) &&
394*e5436536SAndroid Build Coastguard Worker                     ((p_lci_prev->aot == AOT_CELP) ||
395*e5436536SAndroid Build Coastguard Worker                      (p_lci_prev->aot == AOT_ER_CELP))) {
396*e5436536SAndroid Build Coastguard Worker                   FDKwriteBits(hBs, coreFrameOffset, 6); /* coreFrameOffset */
397*e5436536SAndroid Build Coastguard Worker                   hAss->streamMuxConfigBits += 6;
398*e5436536SAndroid Build Coastguard Worker                 }
399*e5436536SAndroid Build Coastguard Worker               }
400*e5436536SAndroid Build Coastguard Worker               break;
401*e5436536SAndroid Build Coastguard Worker 
402*e5436536SAndroid Build Coastguard Worker             case AOT_TWIN_VQ:
403*e5436536SAndroid Build Coastguard Worker               p_linfo->frameLengthType = 1;
404*e5436536SAndroid Build Coastguard Worker               tmp = ((p_lci->bitsFrame + 7) >> 3) -
405*e5436536SAndroid Build Coastguard Worker                     20; /* transmission frame length in bytes */
406*e5436536SAndroid Build Coastguard Worker               if ((tmp < 0)) {
407*e5436536SAndroid Build Coastguard Worker                 return TRANSPORTENC_INVALID_TRANSMISSION_FRAME_LENGTH;
408*e5436536SAndroid Build Coastguard Worker               }
409*e5436536SAndroid Build Coastguard Worker               FDKwriteBits(hBs, p_linfo->frameLengthType,
410*e5436536SAndroid Build Coastguard Worker                            3); /* frameLengthType */
411*e5436536SAndroid Build Coastguard Worker               FDKwriteBits(hBs, tmp, 9);
412*e5436536SAndroid Build Coastguard Worker               hAss->streamMuxConfigBits += 12;
413*e5436536SAndroid Build Coastguard Worker 
414*e5436536SAndroid Build Coastguard Worker               p_linfo->frameLengthBits = (tmp + 20) << 3;
415*e5436536SAndroid Build Coastguard Worker               break;
416*e5436536SAndroid Build Coastguard Worker 
417*e5436536SAndroid Build Coastguard Worker             case AOT_CELP:
418*e5436536SAndroid Build Coastguard Worker               p_linfo->frameLengthType = 4;
419*e5436536SAndroid Build Coastguard Worker               FDKwriteBits(hBs, p_linfo->frameLengthType,
420*e5436536SAndroid Build Coastguard Worker                            3); /* frameLengthType */
421*e5436536SAndroid Build Coastguard Worker               hAss->streamMuxConfigBits += 3;
422*e5436536SAndroid Build Coastguard Worker               {
423*e5436536SAndroid Build Coastguard Worker                 int i;
424*e5436536SAndroid Build Coastguard Worker                 for (i = 0; i < 62; i++) {
425*e5436536SAndroid Build Coastguard Worker                   if (celpFrameLengthTable[i] == p_lci->bitsFrame) break;
426*e5436536SAndroid Build Coastguard Worker                 }
427*e5436536SAndroid Build Coastguard Worker                 if (i >= 62) {
428*e5436536SAndroid Build Coastguard Worker                   return TRANSPORTENC_INVALID_CELP_FRAME_LENGTH;
429*e5436536SAndroid Build Coastguard Worker                 }
430*e5436536SAndroid Build Coastguard Worker 
431*e5436536SAndroid Build Coastguard Worker                 FDKwriteBits(hBs, i, 6); /* CELPframeLengthTabelIndex */
432*e5436536SAndroid Build Coastguard Worker                 hAss->streamMuxConfigBits += 6;
433*e5436536SAndroid Build Coastguard Worker               }
434*e5436536SAndroid Build Coastguard Worker               p_linfo->frameLengthBits = p_lci->bitsFrame;
435*e5436536SAndroid Build Coastguard Worker               break;
436*e5436536SAndroid Build Coastguard Worker 
437*e5436536SAndroid Build Coastguard Worker             case AOT_HVXC:
438*e5436536SAndroid Build Coastguard Worker               p_linfo->frameLengthType = 6;
439*e5436536SAndroid Build Coastguard Worker               FDKwriteBits(hBs, p_linfo->frameLengthType,
440*e5436536SAndroid Build Coastguard Worker                            3); /* frameLengthType */
441*e5436536SAndroid Build Coastguard Worker               hAss->streamMuxConfigBits += 3;
442*e5436536SAndroid Build Coastguard Worker               {
443*e5436536SAndroid Build Coastguard Worker                 int i;
444*e5436536SAndroid Build Coastguard Worker 
445*e5436536SAndroid Build Coastguard Worker                 if (p_lci->bitsFrame == 40) {
446*e5436536SAndroid Build Coastguard Worker                   i = 0;
447*e5436536SAndroid Build Coastguard Worker                 } else if (p_lci->bitsFrame == 80) {
448*e5436536SAndroid Build Coastguard Worker                   i = 1;
449*e5436536SAndroid Build Coastguard Worker                 } else {
450*e5436536SAndroid Build Coastguard Worker                   return TRANSPORTENC_INVALID_FRAME_BITS;
451*e5436536SAndroid Build Coastguard Worker                 }
452*e5436536SAndroid Build Coastguard Worker                 FDKwriteBits(hBs, i, 1); /* HVXCframeLengthTableIndex */
453*e5436536SAndroid Build Coastguard Worker                 hAss->streamMuxConfigBits += 1;
454*e5436536SAndroid Build Coastguard Worker               }
455*e5436536SAndroid Build Coastguard Worker               p_linfo->frameLengthBits = p_lci->bitsFrame;
456*e5436536SAndroid Build Coastguard Worker               break;
457*e5436536SAndroid Build Coastguard Worker 
458*e5436536SAndroid Build Coastguard Worker             case AOT_NULL_OBJECT:
459*e5436536SAndroid Build Coastguard Worker             default:
460*e5436536SAndroid Build Coastguard Worker               return TRANSPORTENC_INVALID_AOT;
461*e5436536SAndroid Build Coastguard Worker           }
462*e5436536SAndroid Build Coastguard Worker         }
463*e5436536SAndroid Build Coastguard Worker       }
464*e5436536SAndroid Build Coastguard Worker     }
465*e5436536SAndroid Build Coastguard Worker 
466*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, (hAss->otherDataLenBits > 0) ? 1 : 0,
467*e5436536SAndroid Build Coastguard Worker                  1); /* otherDataPresent */
468*e5436536SAndroid Build Coastguard Worker     hAss->streamMuxConfigBits += 1;
469*e5436536SAndroid Build Coastguard Worker 
470*e5436536SAndroid Build Coastguard Worker     if (hAss->otherDataLenBits > 0) {
471*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(hBs, 0, 1);
472*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(hBs, hAss->otherDataLenBits, 8);
473*e5436536SAndroid Build Coastguard Worker       hAss->streamMuxConfigBits += 9;
474*e5436536SAndroid Build Coastguard Worker     }
475*e5436536SAndroid Build Coastguard Worker 
476*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, 0, 1); /* crcCheckPresent=0 */
477*e5436536SAndroid Build Coastguard Worker     hAss->streamMuxConfigBits += 1;
478*e5436536SAndroid Build Coastguard Worker 
479*e5436536SAndroid Build Coastguard Worker   } else { /* if ( audioMuxVersionA == 0 ) */
480*e5436536SAndroid Build Coastguard Worker 
481*e5436536SAndroid Build Coastguard Worker     /* for future extensions */
482*e5436536SAndroid Build Coastguard Worker   }
483*e5436536SAndroid Build Coastguard Worker 
484*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
485*e5436536SAndroid Build Coastguard Worker }
486*e5436536SAndroid Build Coastguard Worker 
WriteAuPayloadLengthInfo(HANDLE_FDK_BITSTREAM hBitStream,int AuLengthBits)487*e5436536SAndroid Build Coastguard Worker static TRANSPORTENC_ERROR WriteAuPayloadLengthInfo(
488*e5436536SAndroid Build Coastguard Worker     HANDLE_FDK_BITSTREAM hBitStream, int AuLengthBits) {
489*e5436536SAndroid Build Coastguard Worker   int restBytes;
490*e5436536SAndroid Build Coastguard Worker 
491*e5436536SAndroid Build Coastguard Worker   if (AuLengthBits % 8) return TRANSPORTENC_INVALID_AU_LENGTH;
492*e5436536SAndroid Build Coastguard Worker 
493*e5436536SAndroid Build Coastguard Worker   while (AuLengthBits >= 255 * 8) {
494*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBitStream, 255, 8); /* 255 shows incomplete AU */
495*e5436536SAndroid Build Coastguard Worker     AuLengthBits -= (255 * 8);
496*e5436536SAndroid Build Coastguard Worker   }
497*e5436536SAndroid Build Coastguard Worker 
498*e5436536SAndroid Build Coastguard Worker   restBytes = (AuLengthBits) >> 3;
499*e5436536SAndroid Build Coastguard Worker   FDKwriteBits(hBitStream, restBytes, 8);
500*e5436536SAndroid Build Coastguard Worker 
501*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
502*e5436536SAndroid Build Coastguard Worker }
503*e5436536SAndroid Build Coastguard Worker 
transportEnc_LatmSetNrOfSubframes(HANDLE_LATM_STREAM hAss,INT noSubframes_next)504*e5436536SAndroid Build Coastguard Worker static TRANSPORTENC_ERROR transportEnc_LatmSetNrOfSubframes(
505*e5436536SAndroid Build Coastguard Worker     HANDLE_LATM_STREAM hAss, INT noSubframes_next) /* nr of access units /
506*e5436536SAndroid Build Coastguard Worker                                                       payloads within a latm
507*e5436536SAndroid Build Coastguard Worker                                                       frame */
508*e5436536SAndroid Build Coastguard Worker {
509*e5436536SAndroid Build Coastguard Worker   /* sanity chk */
510*e5436536SAndroid Build Coastguard Worker   if (noSubframes_next < 1 || noSubframes_next > MAX_NR_OF_SUBFRAMES) {
511*e5436536SAndroid Build Coastguard Worker     return TRANSPORTENC_LATM_INVALID_NR_OF_SUBFRAMES;
512*e5436536SAndroid Build Coastguard Worker   }
513*e5436536SAndroid Build Coastguard Worker 
514*e5436536SAndroid Build Coastguard Worker   hAss->noSubframes_next = noSubframes_next;
515*e5436536SAndroid Build Coastguard Worker 
516*e5436536SAndroid Build Coastguard Worker   /* if at start then we can take over the value immediately, otherwise we have
517*e5436536SAndroid Build Coastguard Worker    * to wait for the next SMC */
518*e5436536SAndroid Build Coastguard Worker   if ((hAss->subFrameCnt == 0) && (hAss->latmFrameCounter == 0)) {
519*e5436536SAndroid Build Coastguard Worker     hAss->noSubframes = noSubframes_next;
520*e5436536SAndroid Build Coastguard Worker   }
521*e5436536SAndroid Build Coastguard Worker 
522*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
523*e5436536SAndroid Build Coastguard Worker }
524*e5436536SAndroid Build Coastguard Worker 
allStreamsSameTimeFraming(HANDLE_LATM_STREAM hAss,UCHAR noProgram,UCHAR noLayer[])525*e5436536SAndroid Build Coastguard Worker static int allStreamsSameTimeFraming(HANDLE_LATM_STREAM hAss, UCHAR noProgram,
526*e5436536SAndroid Build Coastguard Worker                                      UCHAR noLayer[] /* return */) {
527*e5436536SAndroid Build Coastguard Worker   int prog, layer;
528*e5436536SAndroid Build Coastguard Worker 
529*e5436536SAndroid Build Coastguard Worker   signed int lastNoSamples = -1;
530*e5436536SAndroid Build Coastguard Worker   signed int minFrameSamples = FDK_INT_MAX;
531*e5436536SAndroid Build Coastguard Worker   signed int maxFrameSamples = 0;
532*e5436536SAndroid Build Coastguard Worker 
533*e5436536SAndroid Build Coastguard Worker   signed int highestSamplingRate = -1;
534*e5436536SAndroid Build Coastguard Worker 
535*e5436536SAndroid Build Coastguard Worker   for (prog = 0; prog < noProgram; prog++) {
536*e5436536SAndroid Build Coastguard Worker     noLayer[prog] = 0;
537*e5436536SAndroid Build Coastguard Worker 
538*e5436536SAndroid Build Coastguard Worker     for (layer = 0; layer < LATM_MAX_LAYERS; layer++) {
539*e5436536SAndroid Build Coastguard Worker       if (hAss->config[prog][layer] != NULL) {
540*e5436536SAndroid Build Coastguard Worker         INT hsfSamplesFrame;
541*e5436536SAndroid Build Coastguard Worker 
542*e5436536SAndroid Build Coastguard Worker         noLayer[prog]++;
543*e5436536SAndroid Build Coastguard Worker 
544*e5436536SAndroid Build Coastguard Worker         if (highestSamplingRate < 0)
545*e5436536SAndroid Build Coastguard Worker           highestSamplingRate = hAss->config[prog][layer]->samplingRate;
546*e5436536SAndroid Build Coastguard Worker 
547*e5436536SAndroid Build Coastguard Worker         hsfSamplesFrame = hAss->config[prog][layer]->samplesPerFrame *
548*e5436536SAndroid Build Coastguard Worker                           highestSamplingRate /
549*e5436536SAndroid Build Coastguard Worker                           hAss->config[prog][layer]->samplingRate;
550*e5436536SAndroid Build Coastguard Worker 
551*e5436536SAndroid Build Coastguard Worker         if (hsfSamplesFrame <= minFrameSamples)
552*e5436536SAndroid Build Coastguard Worker           minFrameSamples = hsfSamplesFrame;
553*e5436536SAndroid Build Coastguard Worker         if (hsfSamplesFrame >= maxFrameSamples)
554*e5436536SAndroid Build Coastguard Worker           maxFrameSamples = hsfSamplesFrame;
555*e5436536SAndroid Build Coastguard Worker 
556*e5436536SAndroid Build Coastguard Worker         if (lastNoSamples == -1) {
557*e5436536SAndroid Build Coastguard Worker           lastNoSamples = hsfSamplesFrame;
558*e5436536SAndroid Build Coastguard Worker         } else {
559*e5436536SAndroid Build Coastguard Worker           if (hsfSamplesFrame != lastNoSamples) {
560*e5436536SAndroid Build Coastguard Worker             return 0;
561*e5436536SAndroid Build Coastguard Worker           }
562*e5436536SAndroid Build Coastguard Worker         }
563*e5436536SAndroid Build Coastguard Worker       }
564*e5436536SAndroid Build Coastguard Worker     }
565*e5436536SAndroid Build Coastguard Worker   }
566*e5436536SAndroid Build Coastguard Worker 
567*e5436536SAndroid Build Coastguard Worker   return 1;
568*e5436536SAndroid Build Coastguard Worker }
569*e5436536SAndroid Build Coastguard Worker 
570*e5436536SAndroid Build Coastguard Worker /**
571*e5436536SAndroid Build Coastguard Worker  * Initialize LATM/LOAS Stream and add layer 0 at program 0.
572*e5436536SAndroid Build Coastguard Worker  */
transportEnc_InitLatmStream(HANDLE_LATM_STREAM hAss,int fractDelayPresent,signed int muxConfigPeriod,UINT audioMuxVersion,TRANSPORT_TYPE tt)573*e5436536SAndroid Build Coastguard Worker static TRANSPORTENC_ERROR transportEnc_InitLatmStream(
574*e5436536SAndroid Build Coastguard Worker     HANDLE_LATM_STREAM hAss, int fractDelayPresent,
575*e5436536SAndroid Build Coastguard Worker     signed int
576*e5436536SAndroid Build Coastguard Worker         muxConfigPeriod, /* insert setup data every muxConfigPeriod frames */
577*e5436536SAndroid Build Coastguard Worker     UINT audioMuxVersion, TRANSPORT_TYPE tt) {
578*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK;
579*e5436536SAndroid Build Coastguard Worker 
580*e5436536SAndroid Build Coastguard Worker   if (hAss == NULL) return TRANSPORTENC_INVALID_PARAMETER;
581*e5436536SAndroid Build Coastguard Worker 
582*e5436536SAndroid Build Coastguard Worker   hAss->tt = tt;
583*e5436536SAndroid Build Coastguard Worker 
584*e5436536SAndroid Build Coastguard Worker   hAss->noProgram = 1;
585*e5436536SAndroid Build Coastguard Worker 
586*e5436536SAndroid Build Coastguard Worker   hAss->audioMuxVersion = audioMuxVersion;
587*e5436536SAndroid Build Coastguard Worker 
588*e5436536SAndroid Build Coastguard Worker   /* Fill noLayer array using hAss->config */
589*e5436536SAndroid Build Coastguard Worker   hAss->allStreamsSameTimeFraming =
590*e5436536SAndroid Build Coastguard Worker       allStreamsSameTimeFraming(hAss, hAss->noProgram, hAss->noLayer);
591*e5436536SAndroid Build Coastguard Worker   /* Only allStreamsSameTimeFraming==1 is supported */
592*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT(hAss->allStreamsSameTimeFraming);
593*e5436536SAndroid Build Coastguard Worker 
594*e5436536SAndroid Build Coastguard Worker   hAss->fractDelayPresent = fractDelayPresent;
595*e5436536SAndroid Build Coastguard Worker   hAss->otherDataLenBits = 0;
596*e5436536SAndroid Build Coastguard Worker 
597*e5436536SAndroid Build Coastguard Worker   hAss->varMode = LATMVAR_SIMPLE_SEQUENCE;
598*e5436536SAndroid Build Coastguard Worker 
599*e5436536SAndroid Build Coastguard Worker   /* initialize counters */
600*e5436536SAndroid Build Coastguard Worker   hAss->subFrameCnt = 0;
601*e5436536SAndroid Build Coastguard Worker   hAss->noSubframes = DEFAULT_LATM_NR_OF_SUBFRAMES;
602*e5436536SAndroid Build Coastguard Worker   hAss->noSubframes_next = DEFAULT_LATM_NR_OF_SUBFRAMES;
603*e5436536SAndroid Build Coastguard Worker 
604*e5436536SAndroid Build Coastguard Worker   /* sync layer related */
605*e5436536SAndroid Build Coastguard Worker   hAss->audioMuxLengthBytes = 0;
606*e5436536SAndroid Build Coastguard Worker 
607*e5436536SAndroid Build Coastguard Worker   hAss->latmFrameCounter = 0;
608*e5436536SAndroid Build Coastguard Worker   hAss->muxConfigPeriod = muxConfigPeriod;
609*e5436536SAndroid Build Coastguard Worker 
610*e5436536SAndroid Build Coastguard Worker   return ErrorStatus;
611*e5436536SAndroid Build Coastguard Worker }
612*e5436536SAndroid Build Coastguard Worker 
613*e5436536SAndroid Build Coastguard Worker /**
614*e5436536SAndroid Build Coastguard Worker  *
615*e5436536SAndroid Build Coastguard Worker  */
transportEnc_LatmCountTotalBitDemandHeader(HANDLE_LATM_STREAM hAss,unsigned int streamDataLength)616*e5436536SAndroid Build Coastguard Worker UINT transportEnc_LatmCountTotalBitDemandHeader(HANDLE_LATM_STREAM hAss,
617*e5436536SAndroid Build Coastguard Worker                                                 unsigned int streamDataLength) {
618*e5436536SAndroid Build Coastguard Worker   UINT bitDemand = 0;
619*e5436536SAndroid Build Coastguard Worker 
620*e5436536SAndroid Build Coastguard Worker   switch (hAss->tt) {
621*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LOAS:
622*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP0:
623*e5436536SAndroid Build Coastguard Worker     case TT_MP4_LATM_MCP1:
624*e5436536SAndroid Build Coastguard Worker       if (hAss->subFrameCnt == 0) {
625*e5436536SAndroid Build Coastguard Worker         bitDemand = transportEnc_LatmCountFixBitDemandHeader(hAss);
626*e5436536SAndroid Build Coastguard Worker       }
627*e5436536SAndroid Build Coastguard Worker       bitDemand += transportEnc_LatmCountVarBitDemandHeader(
628*e5436536SAndroid Build Coastguard Worker           hAss, streamDataLength /*- bitDemand*/);
629*e5436536SAndroid Build Coastguard Worker       break;
630*e5436536SAndroid Build Coastguard Worker     default:
631*e5436536SAndroid Build Coastguard Worker       break;
632*e5436536SAndroid Build Coastguard Worker   }
633*e5436536SAndroid Build Coastguard Worker 
634*e5436536SAndroid Build Coastguard Worker   return bitDemand;
635*e5436536SAndroid Build Coastguard Worker }
636*e5436536SAndroid Build Coastguard Worker 
AdvanceAudioMuxElement(HANDLE_LATM_STREAM hAss,HANDLE_FDK_BITSTREAM hBs,int auBits,int bufferFullness,CSTpCallBacks * cb)637*e5436536SAndroid Build Coastguard Worker static TRANSPORTENC_ERROR AdvanceAudioMuxElement(HANDLE_LATM_STREAM hAss,
638*e5436536SAndroid Build Coastguard Worker                                                  HANDLE_FDK_BITSTREAM hBs,
639*e5436536SAndroid Build Coastguard Worker                                                  int auBits, int bufferFullness,
640*e5436536SAndroid Build Coastguard Worker                                                  CSTpCallBacks *cb) {
641*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK;
642*e5436536SAndroid Build Coastguard Worker   int insertMuxSetup;
643*e5436536SAndroid Build Coastguard Worker 
644*e5436536SAndroid Build Coastguard Worker   /* Insert setup data to assemble Buffer */
645*e5436536SAndroid Build Coastguard Worker   if (hAss->subFrameCnt == 0) {
646*e5436536SAndroid Build Coastguard Worker     if (hAss->muxConfigPeriod > 0) {
647*e5436536SAndroid Build Coastguard Worker       insertMuxSetup = (hAss->latmFrameCounter == 0);
648*e5436536SAndroid Build Coastguard Worker     } else {
649*e5436536SAndroid Build Coastguard Worker       insertMuxSetup = 0;
650*e5436536SAndroid Build Coastguard Worker     }
651*e5436536SAndroid Build Coastguard Worker 
652*e5436536SAndroid Build Coastguard Worker     if (hAss->tt != TT_MP4_LATM_MCP0) {
653*e5436536SAndroid Build Coastguard Worker       if (insertMuxSetup) {
654*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBs, 0, 1); /* useSameStreamMux useNewStreamMux */
655*e5436536SAndroid Build Coastguard Worker         if (TRANSPORTENC_OK != (ErrorStatus = CreateStreamMuxConfig(
656*e5436536SAndroid Build Coastguard Worker                                     hAss, hBs, bufferFullness, cb))) {
657*e5436536SAndroid Build Coastguard Worker           return ErrorStatus;
658*e5436536SAndroid Build Coastguard Worker         }
659*e5436536SAndroid Build Coastguard Worker       } else {
660*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBs, 1, 1); /* useSameStreamMux */
661*e5436536SAndroid Build Coastguard Worker       }
662*e5436536SAndroid Build Coastguard Worker     }
663*e5436536SAndroid Build Coastguard Worker   }
664*e5436536SAndroid Build Coastguard Worker 
665*e5436536SAndroid Build Coastguard Worker   /* PayloadLengthInfo */
666*e5436536SAndroid Build Coastguard Worker   {
667*e5436536SAndroid Build Coastguard Worker     int prog, layer;
668*e5436536SAndroid Build Coastguard Worker 
669*e5436536SAndroid Build Coastguard Worker     for (prog = 0; prog < hAss->noProgram; prog++) {
670*e5436536SAndroid Build Coastguard Worker       for (layer = 0; layer < hAss->noLayer[prog]; layer++) {
671*e5436536SAndroid Build Coastguard Worker         ErrorStatus = WriteAuPayloadLengthInfo(hBs, auBits);
672*e5436536SAndroid Build Coastguard Worker         if (ErrorStatus != TRANSPORTENC_OK) return ErrorStatus;
673*e5436536SAndroid Build Coastguard Worker       }
674*e5436536SAndroid Build Coastguard Worker     }
675*e5436536SAndroid Build Coastguard Worker   }
676*e5436536SAndroid Build Coastguard Worker   /* At this point comes the access unit. */
677*e5436536SAndroid Build Coastguard Worker 
678*e5436536SAndroid Build Coastguard Worker   return TRANSPORTENC_OK;
679*e5436536SAndroid Build Coastguard Worker }
680*e5436536SAndroid Build Coastguard Worker 
681*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR
transportEnc_LatmWrite(HANDLE_LATM_STREAM hAss,HANDLE_FDK_BITSTREAM hBs,int auBits,int bufferFullness,CSTpCallBacks * cb)682*e5436536SAndroid Build Coastguard Worker transportEnc_LatmWrite(HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs,
683*e5436536SAndroid Build Coastguard Worker                        int auBits, int bufferFullness, CSTpCallBacks *cb) {
684*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR ErrorStatus;
685*e5436536SAndroid Build Coastguard Worker 
686*e5436536SAndroid Build Coastguard Worker   if (hAss->subFrameCnt == 0) {
687*e5436536SAndroid Build Coastguard Worker     /* Start new frame */
688*e5436536SAndroid Build Coastguard Worker     FDKresetBitbuffer(hBs, BS_WRITER);
689*e5436536SAndroid Build Coastguard Worker   }
690*e5436536SAndroid Build Coastguard Worker 
691*e5436536SAndroid Build Coastguard Worker   hAss->latmSubframeStart = FDKgetValidBits(hBs);
692*e5436536SAndroid Build Coastguard Worker 
693*e5436536SAndroid Build Coastguard Worker   /* Insert syncword and syncword distance
694*e5436536SAndroid Build Coastguard Worker      - only if loas
695*e5436536SAndroid Build Coastguard Worker      - we must update the syncword distance (=audiomuxlengthbytes) later
696*e5436536SAndroid Build Coastguard Worker    */
697*e5436536SAndroid Build Coastguard Worker   if (hAss->tt == TT_MP4_LOAS && hAss->subFrameCnt == 0) {
698*e5436536SAndroid Build Coastguard Worker     /* Start new LOAS frame */
699*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, 0x2B7, 11);
700*e5436536SAndroid Build Coastguard Worker     hAss->audioMuxLengthBytes = 0;
701*e5436536SAndroid Build Coastguard Worker     hAss->audioMuxLengthBytesPos =
702*e5436536SAndroid Build Coastguard Worker         FDKgetValidBits(hBs); /* store read pointer position */
703*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, hAss->audioMuxLengthBytes, 13);
704*e5436536SAndroid Build Coastguard Worker   }
705*e5436536SAndroid Build Coastguard Worker 
706*e5436536SAndroid Build Coastguard Worker   ErrorStatus = AdvanceAudioMuxElement(hAss, hBs, auBits, bufferFullness, cb);
707*e5436536SAndroid Build Coastguard Worker 
708*e5436536SAndroid Build Coastguard Worker   if (ErrorStatus != TRANSPORTENC_OK) return ErrorStatus;
709*e5436536SAndroid Build Coastguard Worker 
710*e5436536SAndroid Build Coastguard Worker   return ErrorStatus;
711*e5436536SAndroid Build Coastguard Worker }
712*e5436536SAndroid Build Coastguard Worker 
transportEnc_LatmAdjustSubframeBits(HANDLE_LATM_STREAM hAss,int * bits)713*e5436536SAndroid Build Coastguard Worker void transportEnc_LatmAdjustSubframeBits(HANDLE_LATM_STREAM hAss, int *bits) {
714*e5436536SAndroid Build Coastguard Worker   /* Substract bits from possible previous subframe */
715*e5436536SAndroid Build Coastguard Worker   *bits -= hAss->latmSubframeStart;
716*e5436536SAndroid Build Coastguard Worker   /* Add fill bits */
717*e5436536SAndroid Build Coastguard Worker   if (hAss->subFrameCnt == 0) {
718*e5436536SAndroid Build Coastguard Worker     *bits += hAss->otherDataLenBits;
719*e5436536SAndroid Build Coastguard Worker     *bits += hAss->fillBits;
720*e5436536SAndroid Build Coastguard Worker   }
721*e5436536SAndroid Build Coastguard Worker }
722*e5436536SAndroid Build Coastguard Worker 
transportEnc_LatmGetFrame(HANDLE_LATM_STREAM hAss,HANDLE_FDK_BITSTREAM hBs,int * pBytes)723*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_LatmGetFrame(HANDLE_LATM_STREAM hAss,
724*e5436536SAndroid Build Coastguard Worker                                              HANDLE_FDK_BITSTREAM hBs,
725*e5436536SAndroid Build Coastguard Worker                                              int *pBytes) {
726*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK;
727*e5436536SAndroid Build Coastguard Worker 
728*e5436536SAndroid Build Coastguard Worker   hAss->subFrameCnt++;
729*e5436536SAndroid Build Coastguard Worker   if (hAss->subFrameCnt >= hAss->noSubframes) {
730*e5436536SAndroid Build Coastguard Worker     /* Add LOAS frame length if required. */
731*e5436536SAndroid Build Coastguard Worker     if (hAss->tt == TT_MP4_LOAS) {
732*e5436536SAndroid Build Coastguard Worker       FDK_BITSTREAM tmpBuf;
733*e5436536SAndroid Build Coastguard Worker 
734*e5436536SAndroid Build Coastguard Worker       /* Determine frame length info */
735*e5436536SAndroid Build Coastguard Worker       hAss->audioMuxLengthBytes =
736*e5436536SAndroid Build Coastguard Worker           ((FDKgetValidBits(hBs) + hAss->otherDataLenBits + 7) >> 3) -
737*e5436536SAndroid Build Coastguard Worker           3; /* 3=Syncword + length */
738*e5436536SAndroid Build Coastguard Worker 
739*e5436536SAndroid Build Coastguard Worker       /* Check frame length info */
740*e5436536SAndroid Build Coastguard Worker       if (hAss->audioMuxLengthBytes >= (1 << 13)) {
741*e5436536SAndroid Build Coastguard Worker         ErrorStatus = TRANSPORTENC_INVALID_AU_LENGTH;
742*e5436536SAndroid Build Coastguard Worker         goto bail;
743*e5436536SAndroid Build Coastguard Worker       }
744*e5436536SAndroid Build Coastguard Worker 
745*e5436536SAndroid Build Coastguard Worker       /* Write length info into assembler buffer */
746*e5436536SAndroid Build Coastguard Worker       FDKinitBitStream(&tmpBuf, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0,
747*e5436536SAndroid Build Coastguard Worker                        BS_WRITER);
748*e5436536SAndroid Build Coastguard Worker       FDKpushFor(&tmpBuf, hAss->audioMuxLengthBytesPos);
749*e5436536SAndroid Build Coastguard Worker       FDKwriteBits(&tmpBuf, hAss->audioMuxLengthBytes, 13);
750*e5436536SAndroid Build Coastguard Worker       FDKsyncCache(&tmpBuf);
751*e5436536SAndroid Build Coastguard Worker     }
752*e5436536SAndroid Build Coastguard Worker 
753*e5436536SAndroid Build Coastguard Worker     /* Write AudioMuxElement other data bits */
754*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, 0, hAss->otherDataLenBits);
755*e5436536SAndroid Build Coastguard Worker 
756*e5436536SAndroid Build Coastguard Worker     /* Write AudioMuxElement byte alignment fill bits */
757*e5436536SAndroid Build Coastguard Worker     FDKwriteBits(hBs, 0, hAss->fillBits);
758*e5436536SAndroid Build Coastguard Worker 
759*e5436536SAndroid Build Coastguard Worker     FDK_ASSERT((FDKgetValidBits(hBs) % 8) == 0);
760*e5436536SAndroid Build Coastguard Worker 
761*e5436536SAndroid Build Coastguard Worker     hAss->subFrameCnt = 0;
762*e5436536SAndroid Build Coastguard Worker 
763*e5436536SAndroid Build Coastguard Worker     FDKsyncCache(hBs);
764*e5436536SAndroid Build Coastguard Worker     *pBytes = (FDKgetValidBits(hBs) + 7) >> 3;
765*e5436536SAndroid Build Coastguard Worker 
766*e5436536SAndroid Build Coastguard Worker     if (hAss->muxConfigPeriod > 0) {
767*e5436536SAndroid Build Coastguard Worker       hAss->latmFrameCounter++;
768*e5436536SAndroid Build Coastguard Worker 
769*e5436536SAndroid Build Coastguard Worker       if (hAss->latmFrameCounter >= hAss->muxConfigPeriod) {
770*e5436536SAndroid Build Coastguard Worker         hAss->latmFrameCounter = 0;
771*e5436536SAndroid Build Coastguard Worker         hAss->noSubframes = hAss->noSubframes_next;
772*e5436536SAndroid Build Coastguard Worker       }
773*e5436536SAndroid Build Coastguard Worker     }
774*e5436536SAndroid Build Coastguard Worker   } else {
775*e5436536SAndroid Build Coastguard Worker     /* No data this time */
776*e5436536SAndroid Build Coastguard Worker     *pBytes = 0;
777*e5436536SAndroid Build Coastguard Worker   }
778*e5436536SAndroid Build Coastguard Worker 
779*e5436536SAndroid Build Coastguard Worker bail:
780*e5436536SAndroid Build Coastguard Worker   return ErrorStatus;
781*e5436536SAndroid Build Coastguard Worker }
782*e5436536SAndroid Build Coastguard Worker 
783*e5436536SAndroid Build Coastguard Worker /**
784*e5436536SAndroid Build Coastguard Worker  * Init LATM/LOAS
785*e5436536SAndroid Build Coastguard Worker  */
transportEnc_Latm_Init(HANDLE_LATM_STREAM hAss,HANDLE_FDK_BITSTREAM hBs,CODER_CONFIG * layerConfig,UINT audioMuxVersion,TRANSPORT_TYPE tt,CSTpCallBacks * cb)786*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_Latm_Init(HANDLE_LATM_STREAM hAss,
787*e5436536SAndroid Build Coastguard Worker                                           HANDLE_FDK_BITSTREAM hBs,
788*e5436536SAndroid Build Coastguard Worker                                           CODER_CONFIG *layerConfig,
789*e5436536SAndroid Build Coastguard Worker                                           UINT audioMuxVersion,
790*e5436536SAndroid Build Coastguard Worker                                           TRANSPORT_TYPE tt,
791*e5436536SAndroid Build Coastguard Worker                                           CSTpCallBacks *cb) {
792*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR ErrorStatus;
793*e5436536SAndroid Build Coastguard Worker   int fractDelayPresent = 0;
794*e5436536SAndroid Build Coastguard Worker   int prog, layer;
795*e5436536SAndroid Build Coastguard Worker 
796*e5436536SAndroid Build Coastguard Worker   int setupDataDistanceFrames = layerConfig->headerPeriod;
797*e5436536SAndroid Build Coastguard Worker 
798*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT(setupDataDistanceFrames >= 0);
799*e5436536SAndroid Build Coastguard Worker 
800*e5436536SAndroid Build Coastguard Worker   for (prog = 0; prog < LATM_MAX_PROGRAMS; prog++) {
801*e5436536SAndroid Build Coastguard Worker     for (layer = 0; layer < LATM_MAX_LAYERS; layer++) {
802*e5436536SAndroid Build Coastguard Worker       hAss->config[prog][layer] = NULL;
803*e5436536SAndroid Build Coastguard Worker       hAss->m_linfo[prog][layer].streamID = -1;
804*e5436536SAndroid Build Coastguard Worker     }
805*e5436536SAndroid Build Coastguard Worker   }
806*e5436536SAndroid Build Coastguard Worker 
807*e5436536SAndroid Build Coastguard Worker   hAss->config[0][0] = layerConfig;
808*e5436536SAndroid Build Coastguard Worker   hAss->m_linfo[0][0].streamID = 0;
809*e5436536SAndroid Build Coastguard Worker 
810*e5436536SAndroid Build Coastguard Worker   ErrorStatus = transportEnc_InitLatmStream(hAss, fractDelayPresent,
811*e5436536SAndroid Build Coastguard Worker                                             setupDataDistanceFrames,
812*e5436536SAndroid Build Coastguard Worker                                             (audioMuxVersion) ? 1 : 0, tt);
813*e5436536SAndroid Build Coastguard Worker   if (ErrorStatus != TRANSPORTENC_OK) goto bail;
814*e5436536SAndroid Build Coastguard Worker 
815*e5436536SAndroid Build Coastguard Worker   ErrorStatus =
816*e5436536SAndroid Build Coastguard Worker       transportEnc_LatmSetNrOfSubframes(hAss, layerConfig->nSubFrames);
817*e5436536SAndroid Build Coastguard Worker   if (ErrorStatus != TRANSPORTENC_OK) goto bail;
818*e5436536SAndroid Build Coastguard Worker 
819*e5436536SAndroid Build Coastguard Worker   /* Get the size of the StreamMuxConfig somehow */
820*e5436536SAndroid Build Coastguard Worker   if (TRANSPORTENC_OK !=
821*e5436536SAndroid Build Coastguard Worker       (ErrorStatus = AdvanceAudioMuxElement(hAss, hBs, 0, 0, cb))) {
822*e5436536SAndroid Build Coastguard Worker     goto bail;
823*e5436536SAndroid Build Coastguard Worker   }
824*e5436536SAndroid Build Coastguard Worker 
825*e5436536SAndroid Build Coastguard Worker   // CreateStreamMuxConfig(hAss, hBs, 0);
826*e5436536SAndroid Build Coastguard Worker 
827*e5436536SAndroid Build Coastguard Worker bail:
828*e5436536SAndroid Build Coastguard Worker   return ErrorStatus;
829*e5436536SAndroid Build Coastguard Worker }
830*e5436536SAndroid Build Coastguard Worker 
transportEnc_LatmAddOtherDataBits(HANDLE_LATM_STREAM hAss,const int otherDataBits)831*e5436536SAndroid Build Coastguard Worker TRANSPORTENC_ERROR transportEnc_LatmAddOtherDataBits(HANDLE_LATM_STREAM hAss,
832*e5436536SAndroid Build Coastguard Worker                                                      const int otherDataBits) {
833*e5436536SAndroid Build Coastguard Worker   TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK;
834*e5436536SAndroid Build Coastguard Worker 
835*e5436536SAndroid Build Coastguard Worker   if ((hAss->otherDataLenBits != 0) || (otherDataBits % 8 != 0)) {
836*e5436536SAndroid Build Coastguard Worker     /* This implementation allows to add other data bits only once.
837*e5436536SAndroid Build Coastguard Worker        To keep existing alignment only whole bytes are allowed. */
838*e5436536SAndroid Build Coastguard Worker     ErrorStatus = TRANSPORTENC_UNKOWN_ERROR;
839*e5436536SAndroid Build Coastguard Worker   } else {
840*e5436536SAndroid Build Coastguard Worker     /* Ensure correct addional bits in payload. */
841*e5436536SAndroid Build Coastguard Worker     if (hAss->tt == TT_MP4_LATM_MCP0) {
842*e5436536SAndroid Build Coastguard Worker       hAss->otherDataLenBits = otherDataBits;
843*e5436536SAndroid Build Coastguard Worker     } else {
844*e5436536SAndroid Build Coastguard Worker       hAss->otherDataLenBits = otherDataBits - 9;
845*e5436536SAndroid Build Coastguard Worker       hAss->streamMuxConfigBits += 9;
846*e5436536SAndroid Build Coastguard Worker     }
847*e5436536SAndroid Build Coastguard Worker   }
848*e5436536SAndroid Build Coastguard Worker 
849*e5436536SAndroid Build Coastguard Worker   return ErrorStatus;
850*e5436536SAndroid Build Coastguard Worker }
851