xref: /aosp_15_r20/external/aac/libSBRenc/src/bit_sbr.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 /**************************** SBR 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 /*!
104*e5436536SAndroid Build Coastguard Worker   \file
105*e5436536SAndroid Build Coastguard Worker   \brief  SBR bit writing routines $Revision: 93300 $
106*e5436536SAndroid Build Coastguard Worker */
107*e5436536SAndroid Build Coastguard Worker 
108*e5436536SAndroid Build Coastguard Worker #include "bit_sbr.h"
109*e5436536SAndroid Build Coastguard Worker 
110*e5436536SAndroid Build Coastguard Worker #include "code_env.h"
111*e5436536SAndroid Build Coastguard Worker #include "cmondata.h"
112*e5436536SAndroid Build Coastguard Worker #include "sbr.h"
113*e5436536SAndroid Build Coastguard Worker 
114*e5436536SAndroid Build Coastguard Worker #include "ps_main.h"
115*e5436536SAndroid Build Coastguard Worker 
116*e5436536SAndroid Build Coastguard Worker typedef enum { SBR_ID_SCE = 1, SBR_ID_CPE } SBR_ELEMENT_TYPE;
117*e5436536SAndroid Build Coastguard Worker 
118*e5436536SAndroid Build Coastguard Worker static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,
119*e5436536SAndroid Build Coastguard Worker                          HANDLE_SBR_ENV_DATA sbrEnvDataRight,
120*e5436536SAndroid Build Coastguard Worker                          HANDLE_PARAMETRIC_STEREO hParametricStereo,
121*e5436536SAndroid Build Coastguard Worker                          HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem,
122*e5436536SAndroid Build Coastguard Worker                          INT coupling, UINT sbrSyntaxFlags);
123*e5436536SAndroid Build Coastguard Worker 
124*e5436536SAndroid Build Coastguard Worker static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData,
125*e5436536SAndroid Build Coastguard Worker                            HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
126*e5436536SAndroid Build Coastguard Worker                            HANDLE_COMMON_DATA cmonData);
127*e5436536SAndroid Build Coastguard Worker 
128*e5436536SAndroid Build Coastguard Worker static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData,
129*e5436536SAndroid Build Coastguard Worker                                HANDLE_FDK_BITSTREAM hBitStream);
130*e5436536SAndroid Build Coastguard Worker 
131*e5436536SAndroid Build Coastguard Worker static INT encodeSbrSingleChannelElement(
132*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream,
133*e5436536SAndroid Build Coastguard Worker     HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags);
134*e5436536SAndroid Build Coastguard Worker 
135*e5436536SAndroid Build Coastguard Worker static INT encodeSbrChannelPairElement(
136*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
137*e5436536SAndroid Build Coastguard Worker     HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream,
138*e5436536SAndroid Build Coastguard Worker     const INT coupling, const UINT sbrSyntaxFlags);
139*e5436536SAndroid Build Coastguard Worker 
140*e5436536SAndroid Build Coastguard Worker static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
141*e5436536SAndroid Build Coastguard Worker                          HANDLE_FDK_BITSTREAM hBitStream);
142*e5436536SAndroid Build Coastguard Worker 
143*e5436536SAndroid Build Coastguard Worker static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
144*e5436536SAndroid Build Coastguard Worker                                  HANDLE_FDK_BITSTREAM hBitStream,
145*e5436536SAndroid Build Coastguard Worker                                  const int transmitFreqs,
146*e5436536SAndroid Build Coastguard Worker                                  const UINT sbrSyntaxFlags);
147*e5436536SAndroid Build Coastguard Worker 
148*e5436536SAndroid Build Coastguard Worker static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData,
149*e5436536SAndroid Build Coastguard Worker                          HANDLE_FDK_BITSTREAM hBitStream);
150*e5436536SAndroid Build Coastguard Worker 
151*e5436536SAndroid Build Coastguard Worker static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData,
152*e5436536SAndroid Build Coastguard Worker                                HANDLE_FDK_BITSTREAM hBitStream, INT coupling);
153*e5436536SAndroid Build Coastguard Worker 
154*e5436536SAndroid Build Coastguard Worker static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData,
155*e5436536SAndroid Build Coastguard Worker                              HANDLE_FDK_BITSTREAM hBitStream, INT coupling);
156*e5436536SAndroid Build Coastguard Worker 
157*e5436536SAndroid Build Coastguard Worker static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData,
158*e5436536SAndroid Build Coastguard Worker                                     HANDLE_FDK_BITSTREAM hBitStream);
159*e5436536SAndroid Build Coastguard Worker 
160*e5436536SAndroid Build Coastguard Worker static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo,
161*e5436536SAndroid Build Coastguard Worker                               HANDLE_FDK_BITSTREAM hBitStream);
162*e5436536SAndroid Build Coastguard Worker 
163*e5436536SAndroid Build Coastguard Worker static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo);
164*e5436536SAndroid Build Coastguard Worker 
165*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
166*e5436536SAndroid Build Coastguard Worker 
167*e5436536SAndroid Build Coastguard Worker     functionname: FDKsbrEnc_WriteEnvSingleChannelElement
168*e5436536SAndroid Build Coastguard Worker     description:  writes pure SBR single channel data element
169*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
170*e5436536SAndroid Build Coastguard Worker     input:
171*e5436536SAndroid Build Coastguard Worker     output:
172*e5436536SAndroid Build Coastguard Worker 
173*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
FDKsbrEnc_WriteEnvSingleChannelElement(HANDLE_SBR_HEADER_DATA sbrHeaderData,HANDLE_PARAMETRIC_STEREO hParametricStereo,HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_COMMON_DATA cmonData,UINT sbrSyntaxFlags)174*e5436536SAndroid Build Coastguard Worker INT FDKsbrEnc_WriteEnvSingleChannelElement(
175*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_HEADER_DATA sbrHeaderData,
176*e5436536SAndroid Build Coastguard Worker     HANDLE_PARAMETRIC_STEREO hParametricStereo,
177*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_SBR_ENV_DATA sbrEnvData,
178*e5436536SAndroid Build Coastguard Worker     HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags)
179*e5436536SAndroid Build Coastguard Worker 
180*e5436536SAndroid Build Coastguard Worker {
181*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
182*e5436536SAndroid Build Coastguard Worker 
183*e5436536SAndroid Build Coastguard Worker   cmonData->sbrHdrBits = 0;
184*e5436536SAndroid Build Coastguard Worker   cmonData->sbrDataBits = 0;
185*e5436536SAndroid Build Coastguard Worker 
186*e5436536SAndroid Build Coastguard Worker   /* write pure sbr data */
187*e5436536SAndroid Build Coastguard Worker   if (sbrEnvData != NULL) {
188*e5436536SAndroid Build Coastguard Worker     /* write header */
189*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData);
190*e5436536SAndroid Build Coastguard Worker 
191*e5436536SAndroid Build Coastguard Worker     /* write data */
192*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrData(sbrEnvData, NULL, hParametricStereo, cmonData,
193*e5436536SAndroid Build Coastguard Worker                                  SBR_ID_SCE, 0, sbrSyntaxFlags);
194*e5436536SAndroid Build Coastguard Worker   }
195*e5436536SAndroid Build Coastguard Worker   return payloadBits;
196*e5436536SAndroid Build Coastguard Worker }
197*e5436536SAndroid Build Coastguard Worker 
198*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
199*e5436536SAndroid Build Coastguard Worker 
200*e5436536SAndroid Build Coastguard Worker     functionname: FDKsbrEnc_WriteEnvChannelPairElement
201*e5436536SAndroid Build Coastguard Worker     description:  writes pure SBR channel pair data element
202*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
203*e5436536SAndroid Build Coastguard Worker     input:
204*e5436536SAndroid Build Coastguard Worker     output:
205*e5436536SAndroid Build Coastguard Worker 
206*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
FDKsbrEnc_WriteEnvChannelPairElement(HANDLE_SBR_HEADER_DATA sbrHeaderData,HANDLE_PARAMETRIC_STEREO hParametricStereo,HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,HANDLE_SBR_ENV_DATA sbrEnvDataLeft,HANDLE_SBR_ENV_DATA sbrEnvDataRight,HANDLE_COMMON_DATA cmonData,UINT sbrSyntaxFlags)207*e5436536SAndroid Build Coastguard Worker INT FDKsbrEnc_WriteEnvChannelPairElement(
208*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_HEADER_DATA sbrHeaderData,
209*e5436536SAndroid Build Coastguard Worker     HANDLE_PARAMETRIC_STEREO hParametricStereo,
210*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
211*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
212*e5436536SAndroid Build Coastguard Worker     HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags)
213*e5436536SAndroid Build Coastguard Worker 
214*e5436536SAndroid Build Coastguard Worker {
215*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
216*e5436536SAndroid Build Coastguard Worker   cmonData->sbrHdrBits = 0;
217*e5436536SAndroid Build Coastguard Worker   cmonData->sbrDataBits = 0;
218*e5436536SAndroid Build Coastguard Worker 
219*e5436536SAndroid Build Coastguard Worker   /* write pure sbr data */
220*e5436536SAndroid Build Coastguard Worker   if ((sbrEnvDataLeft != NULL) && (sbrEnvDataRight != NULL)) {
221*e5436536SAndroid Build Coastguard Worker     /* write header */
222*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData);
223*e5436536SAndroid Build Coastguard Worker 
224*e5436536SAndroid Build Coastguard Worker     /* write data */
225*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrData(sbrEnvDataLeft, sbrEnvDataRight,
226*e5436536SAndroid Build Coastguard Worker                                  hParametricStereo, cmonData, SBR_ID_CPE,
227*e5436536SAndroid Build Coastguard Worker                                  sbrHeaderData->coupling, sbrSyntaxFlags);
228*e5436536SAndroid Build Coastguard Worker   }
229*e5436536SAndroid Build Coastguard Worker   return payloadBits;
230*e5436536SAndroid Build Coastguard Worker }
231*e5436536SAndroid Build Coastguard Worker 
FDKsbrEnc_CountSbrChannelPairElement(HANDLE_SBR_HEADER_DATA sbrHeaderData,HANDLE_PARAMETRIC_STEREO hParametricStereo,HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,HANDLE_SBR_ENV_DATA sbrEnvDataLeft,HANDLE_SBR_ENV_DATA sbrEnvDataRight,HANDLE_COMMON_DATA cmonData,UINT sbrSyntaxFlags)232*e5436536SAndroid Build Coastguard Worker INT FDKsbrEnc_CountSbrChannelPairElement(
233*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_HEADER_DATA sbrHeaderData,
234*e5436536SAndroid Build Coastguard Worker     HANDLE_PARAMETRIC_STEREO hParametricStereo,
235*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
236*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
237*e5436536SAndroid Build Coastguard Worker     HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) {
238*e5436536SAndroid Build Coastguard Worker   INT payloadBits;
239*e5436536SAndroid Build Coastguard Worker   INT bitPos = FDKgetValidBits(&cmonData->sbrBitbuf);
240*e5436536SAndroid Build Coastguard Worker 
241*e5436536SAndroid Build Coastguard Worker   payloadBits = FDKsbrEnc_WriteEnvChannelPairElement(
242*e5436536SAndroid Build Coastguard Worker       sbrHeaderData, hParametricStereo, sbrBitstreamData, sbrEnvDataLeft,
243*e5436536SAndroid Build Coastguard Worker       sbrEnvDataRight, cmonData, sbrSyntaxFlags);
244*e5436536SAndroid Build Coastguard Worker 
245*e5436536SAndroid Build Coastguard Worker   FDKpushBack(&cmonData->sbrBitbuf,
246*e5436536SAndroid Build Coastguard Worker               (FDKgetValidBits(&cmonData->sbrBitbuf) - bitPos));
247*e5436536SAndroid Build Coastguard Worker 
248*e5436536SAndroid Build Coastguard Worker   return payloadBits;
249*e5436536SAndroid Build Coastguard Worker }
250*e5436536SAndroid Build Coastguard Worker 
sbrEncoder_GetHeader(SBR_ENCODER * sbrEncoder,HANDLE_FDK_BITSTREAM hBs,INT element_index,int fSendHeaders)251*e5436536SAndroid Build Coastguard Worker void sbrEncoder_GetHeader(SBR_ENCODER *sbrEncoder, HANDLE_FDK_BITSTREAM hBs,
252*e5436536SAndroid Build Coastguard Worker                           INT element_index, int fSendHeaders) {
253*e5436536SAndroid Build Coastguard Worker   encodeSbrHeaderData(&sbrEncoder->sbrElement[element_index]->sbrHeaderData,
254*e5436536SAndroid Build Coastguard Worker                       hBs);
255*e5436536SAndroid Build Coastguard Worker 
256*e5436536SAndroid Build Coastguard Worker   if (fSendHeaders == 0) {
257*e5436536SAndroid Build Coastguard Worker     /* Prevent header being embedded into the SBR payload. */
258*e5436536SAndroid Build Coastguard Worker     sbrEncoder->sbrElement[element_index]->sbrBitstreamData.NrSendHeaderData =
259*e5436536SAndroid Build Coastguard Worker         -1;
260*e5436536SAndroid Build Coastguard Worker     sbrEncoder->sbrElement[element_index]->sbrBitstreamData.HeaderActive = 0;
261*e5436536SAndroid Build Coastguard Worker     sbrEncoder->sbrElement[element_index]
262*e5436536SAndroid Build Coastguard Worker         ->sbrBitstreamData.CountSendHeaderData = -1;
263*e5436536SAndroid Build Coastguard Worker   }
264*e5436536SAndroid Build Coastguard Worker }
265*e5436536SAndroid Build Coastguard Worker 
266*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
267*e5436536SAndroid Build Coastguard Worker 
268*e5436536SAndroid Build Coastguard Worker     functionname: encodeSbrHeader
269*e5436536SAndroid Build Coastguard Worker     description:  encodes SBR Header information
270*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
271*e5436536SAndroid Build Coastguard Worker     input:
272*e5436536SAndroid Build Coastguard Worker     output:
273*e5436536SAndroid Build Coastguard Worker 
274*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData,HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,HANDLE_COMMON_DATA cmonData)275*e5436536SAndroid Build Coastguard Worker static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData,
276*e5436536SAndroid Build Coastguard Worker                            HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
277*e5436536SAndroid Build Coastguard Worker                            HANDLE_COMMON_DATA cmonData) {
278*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
279*e5436536SAndroid Build Coastguard Worker 
280*e5436536SAndroid Build Coastguard Worker   if (sbrBitstreamData->HeaderActive) {
281*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 1, 1);
282*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrHeaderData(sbrHeaderData, &cmonData->sbrBitbuf);
283*e5436536SAndroid Build Coastguard Worker   } else {
284*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 0, 1);
285*e5436536SAndroid Build Coastguard Worker   }
286*e5436536SAndroid Build Coastguard Worker 
287*e5436536SAndroid Build Coastguard Worker   cmonData->sbrHdrBits = payloadBits;
288*e5436536SAndroid Build Coastguard Worker 
289*e5436536SAndroid Build Coastguard Worker   return payloadBits;
290*e5436536SAndroid Build Coastguard Worker }
291*e5436536SAndroid Build Coastguard Worker 
292*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
293*e5436536SAndroid Build Coastguard Worker 
294*e5436536SAndroid Build Coastguard Worker     functionname: encodeSbrHeaderData
295*e5436536SAndroid Build Coastguard Worker     description:  writes sbr_header()
296*e5436536SAndroid Build Coastguard Worker                   bs_protocol_version through bs_header_extra_2
297*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
298*e5436536SAndroid Build Coastguard Worker     input:
299*e5436536SAndroid Build Coastguard Worker     output:
300*e5436536SAndroid Build Coastguard Worker 
301*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData,HANDLE_FDK_BITSTREAM hBitStream)302*e5436536SAndroid Build Coastguard Worker static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData,
303*e5436536SAndroid Build Coastguard Worker                                HANDLE_FDK_BITSTREAM hBitStream)
304*e5436536SAndroid Build Coastguard Worker 
305*e5436536SAndroid Build Coastguard Worker {
306*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
307*e5436536SAndroid Build Coastguard Worker   if (sbrHeaderData != NULL) {
308*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_amp_res,
309*e5436536SAndroid Build Coastguard Worker                                 SI_SBR_AMP_RES_BITS);
310*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_start_frequency,
311*e5436536SAndroid Build Coastguard Worker                                 SI_SBR_START_FREQ_BITS);
312*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_stop_frequency,
313*e5436536SAndroid Build Coastguard Worker                                 SI_SBR_STOP_FREQ_BITS);
314*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_xover_band,
315*e5436536SAndroid Build Coastguard Worker                                 SI_SBR_XOVER_BAND_BITS);
316*e5436536SAndroid Build Coastguard Worker 
317*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_RESERVED_BITS);
318*e5436536SAndroid Build Coastguard Worker 
319*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_1,
320*e5436536SAndroid Build Coastguard Worker                                 SI_SBR_HEADER_EXTRA_1_BITS);
321*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_2,
322*e5436536SAndroid Build Coastguard Worker                                 SI_SBR_HEADER_EXTRA_2_BITS);
323*e5436536SAndroid Build Coastguard Worker 
324*e5436536SAndroid Build Coastguard Worker     if (sbrHeaderData->header_extra_1) {
325*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->freqScale,
326*e5436536SAndroid Build Coastguard Worker                                   SI_SBR_FREQ_SCALE_BITS);
327*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->alterScale,
328*e5436536SAndroid Build Coastguard Worker                                   SI_SBR_ALTER_SCALE_BITS);
329*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_noise_bands,
330*e5436536SAndroid Build Coastguard Worker                                   SI_SBR_NOISE_BANDS_BITS);
331*e5436536SAndroid Build Coastguard Worker     } /* sbrHeaderData->header_extra_1 */
332*e5436536SAndroid Build Coastguard Worker 
333*e5436536SAndroid Build Coastguard Worker     if (sbrHeaderData->header_extra_2) {
334*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_bands,
335*e5436536SAndroid Build Coastguard Worker                                   SI_SBR_LIMITER_BANDS_BITS);
336*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_gains,
337*e5436536SAndroid Build Coastguard Worker                                   SI_SBR_LIMITER_GAINS_BITS);
338*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_interpol_freq,
339*e5436536SAndroid Build Coastguard Worker                                   SI_SBR_INTERPOL_FREQ_BITS);
340*e5436536SAndroid Build Coastguard Worker       payloadBits +=
341*e5436536SAndroid Build Coastguard Worker           FDKwriteBits(hBitStream, sbrHeaderData->sbr_smoothing_length,
342*e5436536SAndroid Build Coastguard Worker                        SI_SBR_SMOOTHING_LENGTH_BITS);
343*e5436536SAndroid Build Coastguard Worker 
344*e5436536SAndroid Build Coastguard Worker     } /* sbrHeaderData->header_extra_2 */
345*e5436536SAndroid Build Coastguard Worker   }   /* sbrHeaderData != NULL */
346*e5436536SAndroid Build Coastguard Worker 
347*e5436536SAndroid Build Coastguard Worker   return payloadBits;
348*e5436536SAndroid Build Coastguard Worker }
349*e5436536SAndroid Build Coastguard Worker 
350*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
351*e5436536SAndroid Build Coastguard Worker 
352*e5436536SAndroid Build Coastguard Worker     functionname: encodeSbrData
353*e5436536SAndroid Build Coastguard Worker     description:  encodes sbr Data information
354*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
355*e5436536SAndroid Build Coastguard Worker     input:
356*e5436536SAndroid Build Coastguard Worker     output:
357*e5436536SAndroid Build Coastguard Worker 
358*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,HANDLE_SBR_ENV_DATA sbrEnvDataRight,HANDLE_PARAMETRIC_STEREO hParametricStereo,HANDLE_COMMON_DATA cmonData,SBR_ELEMENT_TYPE sbrElem,INT coupling,UINT sbrSyntaxFlags)359*e5436536SAndroid Build Coastguard Worker static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,
360*e5436536SAndroid Build Coastguard Worker                          HANDLE_SBR_ENV_DATA sbrEnvDataRight,
361*e5436536SAndroid Build Coastguard Worker                          HANDLE_PARAMETRIC_STEREO hParametricStereo,
362*e5436536SAndroid Build Coastguard Worker                          HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem,
363*e5436536SAndroid Build Coastguard Worker                          INT coupling, UINT sbrSyntaxFlags) {
364*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
365*e5436536SAndroid Build Coastguard Worker 
366*e5436536SAndroid Build Coastguard Worker   switch (sbrElem) {
367*e5436536SAndroid Build Coastguard Worker     case SBR_ID_SCE:
368*e5436536SAndroid Build Coastguard Worker       payloadBits +=
369*e5436536SAndroid Build Coastguard Worker           encodeSbrSingleChannelElement(sbrEnvDataLeft, &cmonData->sbrBitbuf,
370*e5436536SAndroid Build Coastguard Worker                                         hParametricStereo, sbrSyntaxFlags);
371*e5436536SAndroid Build Coastguard Worker       break;
372*e5436536SAndroid Build Coastguard Worker     case SBR_ID_CPE:
373*e5436536SAndroid Build Coastguard Worker       payloadBits += encodeSbrChannelPairElement(
374*e5436536SAndroid Build Coastguard Worker           sbrEnvDataLeft, sbrEnvDataRight, hParametricStereo,
375*e5436536SAndroid Build Coastguard Worker           &cmonData->sbrBitbuf, coupling, sbrSyntaxFlags);
376*e5436536SAndroid Build Coastguard Worker       break;
377*e5436536SAndroid Build Coastguard Worker     default:
378*e5436536SAndroid Build Coastguard Worker       /* we never should apply SBR to any other element type */
379*e5436536SAndroid Build Coastguard Worker       FDK_ASSERT(0);
380*e5436536SAndroid Build Coastguard Worker   }
381*e5436536SAndroid Build Coastguard Worker 
382*e5436536SAndroid Build Coastguard Worker   cmonData->sbrDataBits = payloadBits;
383*e5436536SAndroid Build Coastguard Worker 
384*e5436536SAndroid Build Coastguard Worker   return payloadBits;
385*e5436536SAndroid Build Coastguard Worker }
386*e5436536SAndroid Build Coastguard Worker 
387*e5436536SAndroid Build Coastguard Worker #define MODE_FREQ_TANS 1
388*e5436536SAndroid Build Coastguard Worker #define MODE_NO_FREQ_TRAN 0
389*e5436536SAndroid Build Coastguard Worker #define LD_TRANSMISSION MODE_FREQ_TANS
encodeFreqs(int mode)390*e5436536SAndroid Build Coastguard Worker static int encodeFreqs(int mode) { return ((mode & MODE_FREQ_TANS) ? 1 : 0); }
391*e5436536SAndroid Build Coastguard Worker 
392*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
393*e5436536SAndroid Build Coastguard Worker 
394*e5436536SAndroid Build Coastguard Worker     functionname: encodeSbrSingleChannelElement
395*e5436536SAndroid Build Coastguard Worker     description:  encodes sbr SCE information
396*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
397*e5436536SAndroid Build Coastguard Worker     input:
398*e5436536SAndroid Build Coastguard Worker     output:
399*e5436536SAndroid Build Coastguard Worker 
400*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeSbrSingleChannelElement(HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_FDK_BITSTREAM hBitStream,HANDLE_PARAMETRIC_STEREO hParametricStereo,const UINT sbrSyntaxFlags)401*e5436536SAndroid Build Coastguard Worker static INT encodeSbrSingleChannelElement(
402*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream,
403*e5436536SAndroid Build Coastguard Worker     HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags) {
404*e5436536SAndroid Build Coastguard Worker   INT i, payloadBits = 0;
405*e5436536SAndroid Build Coastguard Worker 
406*e5436536SAndroid Build Coastguard Worker   payloadBits += FDKwriteBits(hBitStream, 0,
407*e5436536SAndroid Build Coastguard Worker                               SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */
408*e5436536SAndroid Build Coastguard Worker 
409*e5436536SAndroid Build Coastguard Worker   if (sbrEnvData->ldGrid) {
410*e5436536SAndroid Build Coastguard Worker     if (sbrEnvData->hSbrBSGrid->frameClass != FIXFIXonly) {
411*e5436536SAndroid Build Coastguard Worker       /* encode normal SbrGrid */
412*e5436536SAndroid Build Coastguard Worker       payloadBits += encodeSbrGrid(sbrEnvData, hBitStream);
413*e5436536SAndroid Build Coastguard Worker     } else {
414*e5436536SAndroid Build Coastguard Worker       /* use FIXFIXonly frame Grid */
415*e5436536SAndroid Build Coastguard Worker       payloadBits += encodeLowDelaySbrGrid(
416*e5436536SAndroid Build Coastguard Worker           sbrEnvData, hBitStream, encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
417*e5436536SAndroid Build Coastguard Worker     }
418*e5436536SAndroid Build Coastguard Worker   } else {
419*e5436536SAndroid Build Coastguard Worker     if (sbrSyntaxFlags & SBR_SYNTAX_SCALABLE) {
420*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_COUPLING_BITS);
421*e5436536SAndroid Build Coastguard Worker     }
422*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrGrid(sbrEnvData, hBitStream);
423*e5436536SAndroid Build Coastguard Worker   }
424*e5436536SAndroid Build Coastguard Worker 
425*e5436536SAndroid Build Coastguard Worker   payloadBits += encodeSbrDtdf(sbrEnvData, hBitStream);
426*e5436536SAndroid Build Coastguard Worker 
427*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < sbrEnvData->noOfnoisebands; i++) {
428*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrEnvData->sbr_invf_mode_vec[i],
429*e5436536SAndroid Build Coastguard Worker                                 SI_SBR_INVF_MODE_BITS);
430*e5436536SAndroid Build Coastguard Worker   }
431*e5436536SAndroid Build Coastguard Worker 
432*e5436536SAndroid Build Coastguard Worker   payloadBits += writeEnvelopeData(sbrEnvData, hBitStream, 0);
433*e5436536SAndroid Build Coastguard Worker   payloadBits += writeNoiseLevelData(sbrEnvData, hBitStream, 0);
434*e5436536SAndroid Build Coastguard Worker 
435*e5436536SAndroid Build Coastguard Worker   payloadBits += writeSyntheticCodingData(sbrEnvData, hBitStream);
436*e5436536SAndroid Build Coastguard Worker 
437*e5436536SAndroid Build Coastguard Worker   payloadBits += encodeExtendedData(hParametricStereo, hBitStream);
438*e5436536SAndroid Build Coastguard Worker 
439*e5436536SAndroid Build Coastguard Worker   return payloadBits;
440*e5436536SAndroid Build Coastguard Worker }
441*e5436536SAndroid Build Coastguard Worker 
442*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
443*e5436536SAndroid Build Coastguard Worker 
444*e5436536SAndroid Build Coastguard Worker     functionname: encodeSbrChannelPairElement
445*e5436536SAndroid Build Coastguard Worker     description:  encodes sbr CPE information
446*e5436536SAndroid Build Coastguard Worker     returns:
447*e5436536SAndroid Build Coastguard Worker     input:
448*e5436536SAndroid Build Coastguard Worker     output:
449*e5436536SAndroid Build Coastguard Worker 
450*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeSbrChannelPairElement(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,HANDLE_SBR_ENV_DATA sbrEnvDataRight,HANDLE_PARAMETRIC_STEREO hParametricStereo,HANDLE_FDK_BITSTREAM hBitStream,const INT coupling,const UINT sbrSyntaxFlags)451*e5436536SAndroid Build Coastguard Worker static INT encodeSbrChannelPairElement(
452*e5436536SAndroid Build Coastguard Worker     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
453*e5436536SAndroid Build Coastguard Worker     HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream,
454*e5436536SAndroid Build Coastguard Worker     const INT coupling, const UINT sbrSyntaxFlags) {
455*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
456*e5436536SAndroid Build Coastguard Worker   INT i = 0;
457*e5436536SAndroid Build Coastguard Worker 
458*e5436536SAndroid Build Coastguard Worker   payloadBits += FDKwriteBits(hBitStream, 0,
459*e5436536SAndroid Build Coastguard Worker                               SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */
460*e5436536SAndroid Build Coastguard Worker 
461*e5436536SAndroid Build Coastguard Worker   payloadBits += FDKwriteBits(hBitStream, coupling, SI_SBR_COUPLING_BITS);
462*e5436536SAndroid Build Coastguard Worker 
463*e5436536SAndroid Build Coastguard Worker   if (coupling) {
464*e5436536SAndroid Build Coastguard Worker     if (sbrEnvDataLeft->ldGrid) {
465*e5436536SAndroid Build Coastguard Worker       if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) {
466*e5436536SAndroid Build Coastguard Worker         /* normal SbrGrid */
467*e5436536SAndroid Build Coastguard Worker         payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
468*e5436536SAndroid Build Coastguard Worker 
469*e5436536SAndroid Build Coastguard Worker       } else {
470*e5436536SAndroid Build Coastguard Worker         /* FIXFIXonly frame Grid */
471*e5436536SAndroid Build Coastguard Worker         payloadBits +=
472*e5436536SAndroid Build Coastguard Worker             encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream,
473*e5436536SAndroid Build Coastguard Worker                                   encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
474*e5436536SAndroid Build Coastguard Worker       }
475*e5436536SAndroid Build Coastguard Worker     } else
476*e5436536SAndroid Build Coastguard Worker       payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
477*e5436536SAndroid Build Coastguard Worker 
478*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream);
479*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream);
480*e5436536SAndroid Build Coastguard Worker 
481*e5436536SAndroid Build Coastguard Worker     for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) {
482*e5436536SAndroid Build Coastguard Worker       payloadBits +=
483*e5436536SAndroid Build Coastguard Worker           FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i],
484*e5436536SAndroid Build Coastguard Worker                        SI_SBR_INVF_MODE_BITS);
485*e5436536SAndroid Build Coastguard Worker     }
486*e5436536SAndroid Build Coastguard Worker 
487*e5436536SAndroid Build Coastguard Worker     payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 1);
488*e5436536SAndroid Build Coastguard Worker     payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 1);
489*e5436536SAndroid Build Coastguard Worker     payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 1);
490*e5436536SAndroid Build Coastguard Worker     payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 1);
491*e5436536SAndroid Build Coastguard Worker 
492*e5436536SAndroid Build Coastguard Worker     payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream);
493*e5436536SAndroid Build Coastguard Worker     payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream);
494*e5436536SAndroid Build Coastguard Worker 
495*e5436536SAndroid Build Coastguard Worker   } else { /* no coupling */
496*e5436536SAndroid Build Coastguard Worker     FDK_ASSERT(sbrEnvDataLeft->ldGrid == sbrEnvDataRight->ldGrid);
497*e5436536SAndroid Build Coastguard Worker 
498*e5436536SAndroid Build Coastguard Worker     if (sbrEnvDataLeft->ldGrid || sbrEnvDataRight->ldGrid) {
499*e5436536SAndroid Build Coastguard Worker       /* sbrEnvDataLeft (left channel) */
500*e5436536SAndroid Build Coastguard Worker       if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) {
501*e5436536SAndroid Build Coastguard Worker         /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */
502*e5436536SAndroid Build Coastguard Worker         /* normal SbrGrid */
503*e5436536SAndroid Build Coastguard Worker         payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
504*e5436536SAndroid Build Coastguard Worker 
505*e5436536SAndroid Build Coastguard Worker       } else {
506*e5436536SAndroid Build Coastguard Worker         /* FIXFIXonly frame Grid */
507*e5436536SAndroid Build Coastguard Worker         payloadBits +=
508*e5436536SAndroid Build Coastguard Worker             encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream,
509*e5436536SAndroid Build Coastguard Worker                                   encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
510*e5436536SAndroid Build Coastguard Worker       }
511*e5436536SAndroid Build Coastguard Worker 
512*e5436536SAndroid Build Coastguard Worker       /* sbrEnvDataRight (right channel) */
513*e5436536SAndroid Build Coastguard Worker       if (sbrEnvDataRight->hSbrBSGrid->frameClass != FIXFIXonly) {
514*e5436536SAndroid Build Coastguard Worker         /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */
515*e5436536SAndroid Build Coastguard Worker         /* normal SbrGrid */
516*e5436536SAndroid Build Coastguard Worker         payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream);
517*e5436536SAndroid Build Coastguard Worker 
518*e5436536SAndroid Build Coastguard Worker       } else {
519*e5436536SAndroid Build Coastguard Worker         /* FIXFIXonly frame Grid */
520*e5436536SAndroid Build Coastguard Worker         payloadBits +=
521*e5436536SAndroid Build Coastguard Worker             encodeLowDelaySbrGrid(sbrEnvDataRight, hBitStream,
522*e5436536SAndroid Build Coastguard Worker                                   encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
523*e5436536SAndroid Build Coastguard Worker       }
524*e5436536SAndroid Build Coastguard Worker     } else {
525*e5436536SAndroid Build Coastguard Worker       payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
526*e5436536SAndroid Build Coastguard Worker       payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream);
527*e5436536SAndroid Build Coastguard Worker     }
528*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream);
529*e5436536SAndroid Build Coastguard Worker     payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream);
530*e5436536SAndroid Build Coastguard Worker 
531*e5436536SAndroid Build Coastguard Worker     for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) {
532*e5436536SAndroid Build Coastguard Worker       payloadBits +=
533*e5436536SAndroid Build Coastguard Worker           FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i],
534*e5436536SAndroid Build Coastguard Worker                        SI_SBR_INVF_MODE_BITS);
535*e5436536SAndroid Build Coastguard Worker     }
536*e5436536SAndroid Build Coastguard Worker     for (i = 0; i < sbrEnvDataRight->noOfnoisebands; i++) {
537*e5436536SAndroid Build Coastguard Worker       payloadBits +=
538*e5436536SAndroid Build Coastguard Worker           FDKwriteBits(hBitStream, sbrEnvDataRight->sbr_invf_mode_vec[i],
539*e5436536SAndroid Build Coastguard Worker                        SI_SBR_INVF_MODE_BITS);
540*e5436536SAndroid Build Coastguard Worker     }
541*e5436536SAndroid Build Coastguard Worker 
542*e5436536SAndroid Build Coastguard Worker     payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 0);
543*e5436536SAndroid Build Coastguard Worker     payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 0);
544*e5436536SAndroid Build Coastguard Worker     payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 0);
545*e5436536SAndroid Build Coastguard Worker     payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 0);
546*e5436536SAndroid Build Coastguard Worker 
547*e5436536SAndroid Build Coastguard Worker     payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream);
548*e5436536SAndroid Build Coastguard Worker     payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream);
549*e5436536SAndroid Build Coastguard Worker 
550*e5436536SAndroid Build Coastguard Worker   } /* coupling */
551*e5436536SAndroid Build Coastguard Worker 
552*e5436536SAndroid Build Coastguard Worker   payloadBits += encodeExtendedData(hParametricStereo, hBitStream);
553*e5436536SAndroid Build Coastguard Worker 
554*e5436536SAndroid Build Coastguard Worker   return payloadBits;
555*e5436536SAndroid Build Coastguard Worker }
556*e5436536SAndroid Build Coastguard Worker 
ceil_ln2(INT x)557*e5436536SAndroid Build Coastguard Worker static INT ceil_ln2(INT x) {
558*e5436536SAndroid Build Coastguard Worker   INT tmp = -1;
559*e5436536SAndroid Build Coastguard Worker   while ((1 << ++tmp) < x)
560*e5436536SAndroid Build Coastguard Worker     ;
561*e5436536SAndroid Build Coastguard Worker   return (tmp);
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     functionname: encodeSbrGrid
567*e5436536SAndroid Build Coastguard Worker     description:  if hBitStream != NULL writes bits that describes the
568*e5436536SAndroid Build Coastguard Worker                   time/frequency grouping of a frame; else counts them only
569*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written or counted
570*e5436536SAndroid Build Coastguard Worker     input:
571*e5436536SAndroid Build Coastguard Worker     output:
572*e5436536SAndroid Build Coastguard Worker 
573*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_FDK_BITSTREAM hBitStream)574*e5436536SAndroid Build Coastguard Worker static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
575*e5436536SAndroid Build Coastguard Worker                          HANDLE_FDK_BITSTREAM hBitStream) {
576*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
577*e5436536SAndroid Build Coastguard Worker   INT i, temp;
578*e5436536SAndroid Build Coastguard Worker   INT bufferFrameStart = sbrEnvData->hSbrBSGrid->bufferFrameStart;
579*e5436536SAndroid Build Coastguard Worker   INT numberTimeSlots = sbrEnvData->hSbrBSGrid->numberTimeSlots;
580*e5436536SAndroid Build Coastguard Worker 
581*e5436536SAndroid Build Coastguard Worker   if (sbrEnvData->ldGrid)
582*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass,
583*e5436536SAndroid Build Coastguard Worker                                 SBR_CLA_BITS_LD);
584*e5436536SAndroid Build Coastguard Worker   else
585*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass,
586*e5436536SAndroid Build Coastguard Worker                                 SBR_CLA_BITS);
587*e5436536SAndroid Build Coastguard Worker 
588*e5436536SAndroid Build Coastguard Worker   switch (sbrEnvData->hSbrBSGrid->frameClass) {
589*e5436536SAndroid Build Coastguard Worker     case FIXFIXonly:
590*e5436536SAndroid Build Coastguard Worker       FDK_ASSERT(0 /* Fatal error in encodeSbrGrid! */);
591*e5436536SAndroid Build Coastguard Worker       break;
592*e5436536SAndroid Build Coastguard Worker     case FIXFIX:
593*e5436536SAndroid Build Coastguard Worker       temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_env);
594*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ENV_BITS);
595*e5436536SAndroid Build Coastguard Worker       if ((sbrEnvData->ldGrid) && (sbrEnvData->hSbrBSGrid->bs_num_env == 1))
596*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->currentAmpResFF,
597*e5436536SAndroid Build Coastguard Worker                                     SI_SBR_AMP_RES_BITS);
598*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[0],
599*e5436536SAndroid Build Coastguard Worker                                   SBR_RES_BITS);
600*e5436536SAndroid Build Coastguard Worker 
601*e5436536SAndroid Build Coastguard Worker       break;
602*e5436536SAndroid Build Coastguard Worker 
603*e5436536SAndroid Build Coastguard Worker     case FIXVAR:
604*e5436536SAndroid Build Coastguard Worker     case VARFIX:
605*e5436536SAndroid Build Coastguard Worker       if (sbrEnvData->hSbrBSGrid->frameClass == FIXVAR)
606*e5436536SAndroid Build Coastguard Worker         temp = sbrEnvData->hSbrBSGrid->bs_abs_bord -
607*e5436536SAndroid Build Coastguard Worker                (bufferFrameStart + numberTimeSlots);
608*e5436536SAndroid Build Coastguard Worker       else
609*e5436536SAndroid Build Coastguard Worker         temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - bufferFrameStart;
610*e5436536SAndroid Build Coastguard Worker 
611*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
612*e5436536SAndroid Build Coastguard Worker       payloadBits +=
613*e5436536SAndroid Build Coastguard Worker           FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->n, SBR_NUM_BITS);
614*e5436536SAndroid Build Coastguard Worker 
615*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < sbrEnvData->hSbrBSGrid->n; i++) {
616*e5436536SAndroid Build Coastguard Worker         temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord[i] - 2) >> 1;
617*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
618*e5436536SAndroid Build Coastguard Worker       }
619*e5436536SAndroid Build Coastguard Worker 
620*e5436536SAndroid Build Coastguard Worker       temp = ceil_ln2(sbrEnvData->hSbrBSGrid->n + 2);
621*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp);
622*e5436536SAndroid Build Coastguard Worker 
623*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < sbrEnvData->hSbrBSGrid->n + 1; i++) {
624*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i],
625*e5436536SAndroid Build Coastguard Worker                                     SBR_RES_BITS);
626*e5436536SAndroid Build Coastguard Worker       }
627*e5436536SAndroid Build Coastguard Worker       break;
628*e5436536SAndroid Build Coastguard Worker 
629*e5436536SAndroid Build Coastguard Worker     case VARVAR:
630*e5436536SAndroid Build Coastguard Worker       temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_0 - bufferFrameStart;
631*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
632*e5436536SAndroid Build Coastguard Worker       temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_1 -
633*e5436536SAndroid Build Coastguard Worker              (bufferFrameStart + numberTimeSlots);
634*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
635*e5436536SAndroid Build Coastguard Worker 
636*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(
637*e5436536SAndroid Build Coastguard Worker           hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_0, SBR_NUM_BITS);
638*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(
639*e5436536SAndroid Build Coastguard Worker           hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_1, SBR_NUM_BITS);
640*e5436536SAndroid Build Coastguard Worker 
641*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_0; i++) {
642*e5436536SAndroid Build Coastguard Worker         temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_0[i] - 2) >> 1;
643*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
644*e5436536SAndroid Build Coastguard Worker       }
645*e5436536SAndroid Build Coastguard Worker 
646*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_1; i++) {
647*e5436536SAndroid Build Coastguard Worker         temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_1[i] - 2) >> 1;
648*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
649*e5436536SAndroid Build Coastguard Worker       }
650*e5436536SAndroid Build Coastguard Worker 
651*e5436536SAndroid Build Coastguard Worker       temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_rel_0 +
652*e5436536SAndroid Build Coastguard Worker                       sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 2);
653*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp);
654*e5436536SAndroid Build Coastguard Worker 
655*e5436536SAndroid Build Coastguard Worker       temp = sbrEnvData->hSbrBSGrid->bs_num_rel_0 +
656*e5436536SAndroid Build Coastguard Worker              sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 1;
657*e5436536SAndroid Build Coastguard Worker 
658*e5436536SAndroid Build Coastguard Worker       for (i = 0; i < temp; i++) {
659*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(
660*e5436536SAndroid Build Coastguard Worker             hBitStream, sbrEnvData->hSbrBSGrid->v_fLR[i], SBR_RES_BITS);
661*e5436536SAndroid Build Coastguard Worker       }
662*e5436536SAndroid Build Coastguard Worker       break;
663*e5436536SAndroid Build Coastguard Worker   }
664*e5436536SAndroid Build Coastguard Worker 
665*e5436536SAndroid Build Coastguard Worker   return payloadBits;
666*e5436536SAndroid Build Coastguard Worker }
667*e5436536SAndroid Build Coastguard Worker 
668*e5436536SAndroid Build Coastguard Worker #define SBR_CLA_BITS_LD 1
669*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
670*e5436536SAndroid Build Coastguard Worker 
671*e5436536SAndroid Build Coastguard Worker     functionname: encodeLowDelaySbrGrid
672*e5436536SAndroid Build Coastguard Worker     description:  if hBitStream != NULL writes bits that describes the
673*e5436536SAndroid Build Coastguard Worker                   time/frequency grouping of a frame;
674*e5436536SAndroid Build Coastguard Worker                   else counts them only
675*e5436536SAndroid Build Coastguard Worker                   (this function only write the FIXFIXonly Bitstream data)
676*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written or counted
677*e5436536SAndroid Build Coastguard Worker     input:
678*e5436536SAndroid Build Coastguard Worker     output:
679*e5436536SAndroid Build Coastguard Worker 
680*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_FDK_BITSTREAM hBitStream,const int transmitFreqs,const UINT sbrSyntaxFlags)681*e5436536SAndroid Build Coastguard Worker static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
682*e5436536SAndroid Build Coastguard Worker                                  HANDLE_FDK_BITSTREAM hBitStream,
683*e5436536SAndroid Build Coastguard Worker                                  const int transmitFreqs,
684*e5436536SAndroid Build Coastguard Worker                                  const UINT sbrSyntaxFlags) {
685*e5436536SAndroid Build Coastguard Worker   int payloadBits = 0;
686*e5436536SAndroid Build Coastguard Worker   int i;
687*e5436536SAndroid Build Coastguard Worker 
688*e5436536SAndroid Build Coastguard Worker   /* write FIXFIXonly Grid */
689*e5436536SAndroid Build Coastguard Worker   /* write frameClass [1 bit] for FIXFIXonly Grid */
690*e5436536SAndroid Build Coastguard Worker   payloadBits += FDKwriteBits(hBitStream, 1, SBR_CLA_BITS_LD);
691*e5436536SAndroid Build Coastguard Worker 
692*e5436536SAndroid Build Coastguard Worker   /* absolute Borders are fix: 0,X,X,X,nTimeSlots; so we dont have to transmit
693*e5436536SAndroid Build Coastguard Worker    * them */
694*e5436536SAndroid Build Coastguard Worker   /* only transmit the transient position! */
695*e5436536SAndroid Build Coastguard Worker   /* with this info (b1) we can reconstruct the Frame on Decoder side : */
696*e5436536SAndroid Build Coastguard Worker   /* border[0] = 0; border[1] = b1; border[2]=b1+2; border[3] = nrTimeSlots */
697*e5436536SAndroid Build Coastguard Worker 
698*e5436536SAndroid Build Coastguard Worker   /* use 3 or 4bits for transient border (border) */
699*e5436536SAndroid Build Coastguard Worker   if (sbrEnvData->hSbrBSGrid->numberTimeSlots == 8)
700*e5436536SAndroid Build Coastguard Worker     payloadBits +=
701*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 3);
702*e5436536SAndroid Build Coastguard Worker   else
703*e5436536SAndroid Build Coastguard Worker     payloadBits +=
704*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 4);
705*e5436536SAndroid Build Coastguard Worker 
706*e5436536SAndroid Build Coastguard Worker   if (transmitFreqs) {
707*e5436536SAndroid Build Coastguard Worker     /* write FreqRes grid */
708*e5436536SAndroid Build Coastguard Worker     for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_env; i++) {
709*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i],
710*e5436536SAndroid Build Coastguard Worker                                   SBR_RES_BITS);
711*e5436536SAndroid Build Coastguard Worker     }
712*e5436536SAndroid Build Coastguard Worker   }
713*e5436536SAndroid Build Coastguard Worker 
714*e5436536SAndroid Build Coastguard Worker   return payloadBits;
715*e5436536SAndroid Build Coastguard Worker }
716*e5436536SAndroid Build Coastguard Worker 
717*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
718*e5436536SAndroid Build Coastguard Worker 
719*e5436536SAndroid Build Coastguard Worker     functionname: encodeSbrDtdf
720*e5436536SAndroid Build Coastguard Worker     description:  writes bits that describes the direction of the envelopes of a
721*e5436536SAndroid Build Coastguard Worker frame returns:      number of bits written input: output:
722*e5436536SAndroid Build Coastguard Worker 
723*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_FDK_BITSTREAM hBitStream)724*e5436536SAndroid Build Coastguard Worker static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData,
725*e5436536SAndroid Build Coastguard Worker                          HANDLE_FDK_BITSTREAM hBitStream) {
726*e5436536SAndroid Build Coastguard Worker   INT i, payloadBits = 0, noOfNoiseEnvelopes;
727*e5436536SAndroid Build Coastguard Worker 
728*e5436536SAndroid Build Coastguard Worker   noOfNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1;
729*e5436536SAndroid Build Coastguard Worker 
730*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < sbrEnvData->noOfEnvelopes; ++i) {
731*e5436536SAndroid Build Coastguard Worker     payloadBits +=
732*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitStream, sbrEnvData->domain_vec[i], SBR_DIR_BITS);
733*e5436536SAndroid Build Coastguard Worker   }
734*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < noOfNoiseEnvelopes; ++i) {
735*e5436536SAndroid Build Coastguard Worker     payloadBits +=
736*e5436536SAndroid Build Coastguard Worker         FDKwriteBits(hBitStream, sbrEnvData->domain_vec_noise[i], SBR_DIR_BITS);
737*e5436536SAndroid Build Coastguard Worker   }
738*e5436536SAndroid Build Coastguard Worker 
739*e5436536SAndroid Build Coastguard Worker   return payloadBits;
740*e5436536SAndroid Build Coastguard Worker }
741*e5436536SAndroid Build Coastguard Worker 
742*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
743*e5436536SAndroid Build Coastguard Worker 
744*e5436536SAndroid Build Coastguard Worker     functionname: writeNoiseLevelData
745*e5436536SAndroid Build Coastguard Worker     description:  writes bits corresponding to the noise-floor-level
746*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
747*e5436536SAndroid Build Coastguard Worker     input:
748*e5436536SAndroid Build Coastguard Worker     output:
749*e5436536SAndroid Build Coastguard Worker 
750*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_FDK_BITSTREAM hBitStream,INT coupling)751*e5436536SAndroid Build Coastguard Worker static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData,
752*e5436536SAndroid Build Coastguard Worker                                HANDLE_FDK_BITSTREAM hBitStream, INT coupling) {
753*e5436536SAndroid Build Coastguard Worker   INT j, i, payloadBits = 0;
754*e5436536SAndroid Build Coastguard Worker   INT nNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1;
755*e5436536SAndroid Build Coastguard Worker 
756*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < nNoiseEnvelopes; i++) {
757*e5436536SAndroid Build Coastguard Worker     switch (sbrEnvData->domain_vec_noise[i]) {
758*e5436536SAndroid Build Coastguard Worker       case FREQ:
759*e5436536SAndroid Build Coastguard Worker         if (coupling && sbrEnvData->balance) {
760*e5436536SAndroid Build Coastguard Worker           payloadBits += FDKwriteBits(
761*e5436536SAndroid Build Coastguard Worker               hBitStream,
762*e5436536SAndroid Build Coastguard Worker               sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands],
763*e5436536SAndroid Build Coastguard Worker               sbrEnvData->si_sbr_start_noise_bits_balance);
764*e5436536SAndroid Build Coastguard Worker         } else {
765*e5436536SAndroid Build Coastguard Worker           payloadBits += FDKwriteBits(
766*e5436536SAndroid Build Coastguard Worker               hBitStream,
767*e5436536SAndroid Build Coastguard Worker               sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands],
768*e5436536SAndroid Build Coastguard Worker               sbrEnvData->si_sbr_start_noise_bits);
769*e5436536SAndroid Build Coastguard Worker         }
770*e5436536SAndroid Build Coastguard Worker 
771*e5436536SAndroid Build Coastguard Worker         for (j = 1 + i * sbrEnvData->noOfnoisebands;
772*e5436536SAndroid Build Coastguard Worker              j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) {
773*e5436536SAndroid Build Coastguard Worker           if (coupling) {
774*e5436536SAndroid Build Coastguard Worker             if (sbrEnvData->balance) {
775*e5436536SAndroid Build Coastguard Worker               /* coupling && balance */
776*e5436536SAndroid Build Coastguard Worker               payloadBits += FDKwriteBits(hBitStream,
777*e5436536SAndroid Build Coastguard Worker                                           sbrEnvData->hufftableNoiseBalanceFreqC
778*e5436536SAndroid Build Coastguard Worker                                               [sbrEnvData->sbr_noise_levels[j] +
779*e5436536SAndroid Build Coastguard Worker                                                CODE_BOOK_SCF_LAV_BALANCE11],
780*e5436536SAndroid Build Coastguard Worker                                           sbrEnvData->hufftableNoiseBalanceFreqL
781*e5436536SAndroid Build Coastguard Worker                                               [sbrEnvData->sbr_noise_levels[j] +
782*e5436536SAndroid Build Coastguard Worker                                                CODE_BOOK_SCF_LAV_BALANCE11]);
783*e5436536SAndroid Build Coastguard Worker             } else {
784*e5436536SAndroid Build Coastguard Worker               /* coupling && !balance */
785*e5436536SAndroid Build Coastguard Worker               payloadBits += FDKwriteBits(
786*e5436536SAndroid Build Coastguard Worker                   hBitStream,
787*e5436536SAndroid Build Coastguard Worker                   sbrEnvData->hufftableNoiseLevelFreqC
788*e5436536SAndroid Build Coastguard Worker                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11],
789*e5436536SAndroid Build Coastguard Worker                   sbrEnvData->hufftableNoiseLevelFreqL
790*e5436536SAndroid Build Coastguard Worker                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]);
791*e5436536SAndroid Build Coastguard Worker             }
792*e5436536SAndroid Build Coastguard Worker           } else {
793*e5436536SAndroid Build Coastguard Worker             /* !coupling */
794*e5436536SAndroid Build Coastguard Worker             payloadBits += FDKwriteBits(
795*e5436536SAndroid Build Coastguard Worker                 hBitStream,
796*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
797*e5436536SAndroid Build Coastguard Worker                     ->hufftableNoiseFreqC[sbrEnvData->sbr_noise_levels[j] +
798*e5436536SAndroid Build Coastguard Worker                                           CODE_BOOK_SCF_LAV11],
799*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
800*e5436536SAndroid Build Coastguard Worker                     ->hufftableNoiseFreqL[sbrEnvData->sbr_noise_levels[j] +
801*e5436536SAndroid Build Coastguard Worker                                           CODE_BOOK_SCF_LAV11]);
802*e5436536SAndroid Build Coastguard Worker           }
803*e5436536SAndroid Build Coastguard Worker         }
804*e5436536SAndroid Build Coastguard Worker         break;
805*e5436536SAndroid Build Coastguard Worker 
806*e5436536SAndroid Build Coastguard Worker       case TIME:
807*e5436536SAndroid Build Coastguard Worker         for (j = i * sbrEnvData->noOfnoisebands;
808*e5436536SAndroid Build Coastguard Worker              j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) {
809*e5436536SAndroid Build Coastguard Worker           if (coupling) {
810*e5436536SAndroid Build Coastguard Worker             if (sbrEnvData->balance) {
811*e5436536SAndroid Build Coastguard Worker               /* coupling && balance */
812*e5436536SAndroid Build Coastguard Worker               payloadBits += FDKwriteBits(hBitStream,
813*e5436536SAndroid Build Coastguard Worker                                           sbrEnvData->hufftableNoiseBalanceTimeC
814*e5436536SAndroid Build Coastguard Worker                                               [sbrEnvData->sbr_noise_levels[j] +
815*e5436536SAndroid Build Coastguard Worker                                                CODE_BOOK_SCF_LAV_BALANCE11],
816*e5436536SAndroid Build Coastguard Worker                                           sbrEnvData->hufftableNoiseBalanceTimeL
817*e5436536SAndroid Build Coastguard Worker                                               [sbrEnvData->sbr_noise_levels[j] +
818*e5436536SAndroid Build Coastguard Worker                                                CODE_BOOK_SCF_LAV_BALANCE11]);
819*e5436536SAndroid Build Coastguard Worker             } else {
820*e5436536SAndroid Build Coastguard Worker               /* coupling && !balance */
821*e5436536SAndroid Build Coastguard Worker               payloadBits += FDKwriteBits(
822*e5436536SAndroid Build Coastguard Worker                   hBitStream,
823*e5436536SAndroid Build Coastguard Worker                   sbrEnvData->hufftableNoiseLevelTimeC
824*e5436536SAndroid Build Coastguard Worker                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11],
825*e5436536SAndroid Build Coastguard Worker                   sbrEnvData->hufftableNoiseLevelTimeL
826*e5436536SAndroid Build Coastguard Worker                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]);
827*e5436536SAndroid Build Coastguard Worker             }
828*e5436536SAndroid Build Coastguard Worker           } else {
829*e5436536SAndroid Build Coastguard Worker             /* !coupling */
830*e5436536SAndroid Build Coastguard Worker             payloadBits += FDKwriteBits(
831*e5436536SAndroid Build Coastguard Worker                 hBitStream,
832*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
833*e5436536SAndroid Build Coastguard Worker                     ->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] +
834*e5436536SAndroid Build Coastguard Worker                                                CODE_BOOK_SCF_LAV11],
835*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
836*e5436536SAndroid Build Coastguard Worker                     ->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] +
837*e5436536SAndroid Build Coastguard Worker                                                CODE_BOOK_SCF_LAV11]);
838*e5436536SAndroid Build Coastguard Worker           }
839*e5436536SAndroid Build Coastguard Worker         }
840*e5436536SAndroid Build Coastguard Worker         break;
841*e5436536SAndroid Build Coastguard Worker     }
842*e5436536SAndroid Build Coastguard Worker   }
843*e5436536SAndroid Build Coastguard Worker   return payloadBits;
844*e5436536SAndroid Build Coastguard Worker }
845*e5436536SAndroid Build Coastguard Worker 
846*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
847*e5436536SAndroid Build Coastguard Worker 
848*e5436536SAndroid Build Coastguard Worker     functionname: writeEnvelopeData
849*e5436536SAndroid Build Coastguard Worker     description:  writes bits corresponding to the envelope
850*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
851*e5436536SAndroid Build Coastguard Worker     input:
852*e5436536SAndroid Build Coastguard Worker     output:
853*e5436536SAndroid Build Coastguard Worker 
854*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_FDK_BITSTREAM hBitStream,INT coupling)855*e5436536SAndroid Build Coastguard Worker static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData,
856*e5436536SAndroid Build Coastguard Worker                              HANDLE_FDK_BITSTREAM hBitStream, INT coupling) {
857*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0, j, i, delta;
858*e5436536SAndroid Build Coastguard Worker 
859*e5436536SAndroid Build Coastguard Worker   for (j = 0; j < sbrEnvData->noOfEnvelopes;
860*e5436536SAndroid Build Coastguard Worker        j++) { /* loop over all envelopes */
861*e5436536SAndroid Build Coastguard Worker     if (sbrEnvData->domain_vec[j] == FREQ) {
862*e5436536SAndroid Build Coastguard Worker       if (coupling && sbrEnvData->balance) {
863*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0],
864*e5436536SAndroid Build Coastguard Worker                                     sbrEnvData->si_sbr_start_env_bits_balance);
865*e5436536SAndroid Build Coastguard Worker       } else {
866*e5436536SAndroid Build Coastguard Worker         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0],
867*e5436536SAndroid Build Coastguard Worker                                     sbrEnvData->si_sbr_start_env_bits);
868*e5436536SAndroid Build Coastguard Worker       }
869*e5436536SAndroid Build Coastguard Worker     }
870*e5436536SAndroid Build Coastguard Worker 
871*e5436536SAndroid Build Coastguard Worker     for (i = 1 - sbrEnvData->domain_vec[j]; i < sbrEnvData->noScfBands[j];
872*e5436536SAndroid Build Coastguard Worker          i++) {
873*e5436536SAndroid Build Coastguard Worker       delta = sbrEnvData->ienvelope[j][i];
874*e5436536SAndroid Build Coastguard Worker       if (coupling && sbrEnvData->balance) {
875*e5436536SAndroid Build Coastguard Worker         FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLavBalance);
876*e5436536SAndroid Build Coastguard Worker       } else {
877*e5436536SAndroid Build Coastguard Worker         FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLav);
878*e5436536SAndroid Build Coastguard Worker       }
879*e5436536SAndroid Build Coastguard Worker       if (coupling) {
880*e5436536SAndroid Build Coastguard Worker         if (sbrEnvData->balance) {
881*e5436536SAndroid Build Coastguard Worker           if (sbrEnvData->domain_vec[j]) {
882*e5436536SAndroid Build Coastguard Worker             /* coupling && balance && TIME */
883*e5436536SAndroid Build Coastguard Worker             payloadBits += FDKwriteBits(
884*e5436536SAndroid Build Coastguard Worker                 hBitStream,
885*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
886*e5436536SAndroid Build Coastguard Worker                     ->hufftableBalanceTimeC[delta +
887*e5436536SAndroid Build Coastguard Worker                                             sbrEnvData->codeBookScfLavBalance],
888*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
889*e5436536SAndroid Build Coastguard Worker                     ->hufftableBalanceTimeL[delta +
890*e5436536SAndroid Build Coastguard Worker                                             sbrEnvData->codeBookScfLavBalance]);
891*e5436536SAndroid Build Coastguard Worker           } else {
892*e5436536SAndroid Build Coastguard Worker             /* coupling && balance && FREQ */
893*e5436536SAndroid Build Coastguard Worker             payloadBits += FDKwriteBits(
894*e5436536SAndroid Build Coastguard Worker                 hBitStream,
895*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
896*e5436536SAndroid Build Coastguard Worker                     ->hufftableBalanceFreqC[delta +
897*e5436536SAndroid Build Coastguard Worker                                             sbrEnvData->codeBookScfLavBalance],
898*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
899*e5436536SAndroid Build Coastguard Worker                     ->hufftableBalanceFreqL[delta +
900*e5436536SAndroid Build Coastguard Worker                                             sbrEnvData->codeBookScfLavBalance]);
901*e5436536SAndroid Build Coastguard Worker           }
902*e5436536SAndroid Build Coastguard Worker         } else {
903*e5436536SAndroid Build Coastguard Worker           if (sbrEnvData->domain_vec[j]) {
904*e5436536SAndroid Build Coastguard Worker             /* coupling && !balance && TIME */
905*e5436536SAndroid Build Coastguard Worker             payloadBits += FDKwriteBits(
906*e5436536SAndroid Build Coastguard Worker                 hBitStream,
907*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
908*e5436536SAndroid Build Coastguard Worker                     ->hufftableLevelTimeC[delta + sbrEnvData->codeBookScfLav],
909*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
910*e5436536SAndroid Build Coastguard Worker                     ->hufftableLevelTimeL[delta + sbrEnvData->codeBookScfLav]);
911*e5436536SAndroid Build Coastguard Worker           } else {
912*e5436536SAndroid Build Coastguard Worker             /* coupling && !balance && FREQ */
913*e5436536SAndroid Build Coastguard Worker             payloadBits += FDKwriteBits(
914*e5436536SAndroid Build Coastguard Worker                 hBitStream,
915*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
916*e5436536SAndroid Build Coastguard Worker                     ->hufftableLevelFreqC[delta + sbrEnvData->codeBookScfLav],
917*e5436536SAndroid Build Coastguard Worker                 sbrEnvData
918*e5436536SAndroid Build Coastguard Worker                     ->hufftableLevelFreqL[delta + sbrEnvData->codeBookScfLav]);
919*e5436536SAndroid Build Coastguard Worker           }
920*e5436536SAndroid Build Coastguard Worker         }
921*e5436536SAndroid Build Coastguard Worker       } else {
922*e5436536SAndroid Build Coastguard Worker         if (sbrEnvData->domain_vec[j]) {
923*e5436536SAndroid Build Coastguard Worker           /* !coupling && TIME */
924*e5436536SAndroid Build Coastguard Worker           payloadBits += FDKwriteBits(
925*e5436536SAndroid Build Coastguard Worker               hBitStream,
926*e5436536SAndroid Build Coastguard Worker               sbrEnvData->hufftableTimeC[delta + sbrEnvData->codeBookScfLav],
927*e5436536SAndroid Build Coastguard Worker               sbrEnvData->hufftableTimeL[delta + sbrEnvData->codeBookScfLav]);
928*e5436536SAndroid Build Coastguard Worker         } else {
929*e5436536SAndroid Build Coastguard Worker           /* !coupling && FREQ */
930*e5436536SAndroid Build Coastguard Worker           payloadBits += FDKwriteBits(
931*e5436536SAndroid Build Coastguard Worker               hBitStream,
932*e5436536SAndroid Build Coastguard Worker               sbrEnvData->hufftableFreqC[delta + sbrEnvData->codeBookScfLav],
933*e5436536SAndroid Build Coastguard Worker               sbrEnvData->hufftableFreqL[delta + sbrEnvData->codeBookScfLav]);
934*e5436536SAndroid Build Coastguard Worker         }
935*e5436536SAndroid Build Coastguard Worker       }
936*e5436536SAndroid Build Coastguard Worker     }
937*e5436536SAndroid Build Coastguard Worker   }
938*e5436536SAndroid Build Coastguard Worker   return payloadBits;
939*e5436536SAndroid Build Coastguard Worker }
940*e5436536SAndroid Build Coastguard Worker 
941*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
942*e5436536SAndroid Build Coastguard Worker 
943*e5436536SAndroid Build Coastguard Worker     functionname: encodeExtendedData
944*e5436536SAndroid Build Coastguard Worker     description:  writes bits corresponding to the extended data
945*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
946*e5436536SAndroid Build Coastguard Worker     input:
947*e5436536SAndroid Build Coastguard Worker     output:
948*e5436536SAndroid Build Coastguard Worker 
949*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo,HANDLE_FDK_BITSTREAM hBitStream)950*e5436536SAndroid Build Coastguard Worker static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo,
951*e5436536SAndroid Build Coastguard Worker                               HANDLE_FDK_BITSTREAM hBitStream) {
952*e5436536SAndroid Build Coastguard Worker   INT extDataSize;
953*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
954*e5436536SAndroid Build Coastguard Worker 
955*e5436536SAndroid Build Coastguard Worker   extDataSize = getSbrExtendedDataSize(hParametricStereo);
956*e5436536SAndroid Build Coastguard Worker 
957*e5436536SAndroid Build Coastguard Worker   if (extDataSize != 0) {
958*e5436536SAndroid Build Coastguard Worker     INT maxExtSize = (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1;
959*e5436536SAndroid Build Coastguard Worker     INT writtenNoBits = 0; /* needed to byte align the extended data */
960*e5436536SAndroid Build Coastguard Worker 
961*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_EXTENDED_DATA_BITS);
962*e5436536SAndroid Build Coastguard Worker     FDK_ASSERT(extDataSize <= SBR_EXTENDED_DATA_MAX_CNT);
963*e5436536SAndroid Build Coastguard Worker 
964*e5436536SAndroid Build Coastguard Worker     if (extDataSize < maxExtSize) {
965*e5436536SAndroid Build Coastguard Worker       payloadBits +=
966*e5436536SAndroid Build Coastguard Worker           FDKwriteBits(hBitStream, extDataSize, SI_SBR_EXTENSION_SIZE_BITS);
967*e5436536SAndroid Build Coastguard Worker     } else {
968*e5436536SAndroid Build Coastguard Worker       payloadBits +=
969*e5436536SAndroid Build Coastguard Worker           FDKwriteBits(hBitStream, maxExtSize, SI_SBR_EXTENSION_SIZE_BITS);
970*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, extDataSize - maxExtSize,
971*e5436536SAndroid Build Coastguard Worker                                   SI_SBR_EXTENSION_ESC_COUNT_BITS);
972*e5436536SAndroid Build Coastguard Worker     }
973*e5436536SAndroid Build Coastguard Worker 
974*e5436536SAndroid Build Coastguard Worker     /* parametric coding signalled here? */
975*e5436536SAndroid Build Coastguard Worker     if (hParametricStereo) {
976*e5436536SAndroid Build Coastguard Worker       writtenNoBits += FDKwriteBits(hBitStream, EXTENSION_ID_PS_CODING,
977*e5436536SAndroid Build Coastguard Worker                                     SI_SBR_EXTENSION_ID_BITS);
978*e5436536SAndroid Build Coastguard Worker       writtenNoBits +=
979*e5436536SAndroid Build Coastguard Worker           FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, hBitStream);
980*e5436536SAndroid Build Coastguard Worker     }
981*e5436536SAndroid Build Coastguard Worker 
982*e5436536SAndroid Build Coastguard Worker     payloadBits += writtenNoBits;
983*e5436536SAndroid Build Coastguard Worker 
984*e5436536SAndroid Build Coastguard Worker     /* byte alignment */
985*e5436536SAndroid Build Coastguard Worker     writtenNoBits = writtenNoBits % 8;
986*e5436536SAndroid Build Coastguard Worker     if (writtenNoBits)
987*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, 0, (8 - writtenNoBits));
988*e5436536SAndroid Build Coastguard Worker   } else {
989*e5436536SAndroid Build Coastguard Worker     payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_EXTENDED_DATA_BITS);
990*e5436536SAndroid Build Coastguard Worker   }
991*e5436536SAndroid Build Coastguard Worker 
992*e5436536SAndroid Build Coastguard Worker   return payloadBits;
993*e5436536SAndroid Build Coastguard Worker }
994*e5436536SAndroid Build Coastguard Worker 
995*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
996*e5436536SAndroid Build Coastguard Worker 
997*e5436536SAndroid Build Coastguard Worker     functionname: writeSyntheticCodingData
998*e5436536SAndroid Build Coastguard Worker     description:  writes bits corresponding to the "synthetic-coding"-extension
999*e5436536SAndroid Build Coastguard Worker     returns:      number of bits written
1000*e5436536SAndroid Build Coastguard Worker     input:
1001*e5436536SAndroid Build Coastguard Worker     output:
1002*e5436536SAndroid Build Coastguard Worker 
1003*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData,HANDLE_FDK_BITSTREAM hBitStream)1004*e5436536SAndroid Build Coastguard Worker static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData,
1005*e5436536SAndroid Build Coastguard Worker                                     HANDLE_FDK_BITSTREAM hBitStream)
1006*e5436536SAndroid Build Coastguard Worker 
1007*e5436536SAndroid Build Coastguard Worker {
1008*e5436536SAndroid Build Coastguard Worker   INT i;
1009*e5436536SAndroid Build Coastguard Worker   INT payloadBits = 0;
1010*e5436536SAndroid Build Coastguard Worker 
1011*e5436536SAndroid Build Coastguard Worker   payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonicFlag, 1);
1012*e5436536SAndroid Build Coastguard Worker 
1013*e5436536SAndroid Build Coastguard Worker   if (sbrEnvData->addHarmonicFlag) {
1014*e5436536SAndroid Build Coastguard Worker     for (i = 0; i < sbrEnvData->noHarmonics; i++) {
1015*e5436536SAndroid Build Coastguard Worker       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonic[i], 1);
1016*e5436536SAndroid Build Coastguard Worker     }
1017*e5436536SAndroid Build Coastguard Worker   }
1018*e5436536SAndroid Build Coastguard Worker 
1019*e5436536SAndroid Build Coastguard Worker   return payloadBits;
1020*e5436536SAndroid Build Coastguard Worker }
1021*e5436536SAndroid Build Coastguard Worker 
1022*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
1023*e5436536SAndroid Build Coastguard Worker 
1024*e5436536SAndroid Build Coastguard Worker     functionname: getSbrExtendedDataSize
1025*e5436536SAndroid Build Coastguard Worker     description:  counts the number of bits needed for encoding the
1026*e5436536SAndroid Build Coastguard Worker                   extended data (including extension id)
1027*e5436536SAndroid Build Coastguard Worker 
1028*e5436536SAndroid Build Coastguard Worker     returns:      number of bits needed for the extended data
1029*e5436536SAndroid Build Coastguard Worker     input:
1030*e5436536SAndroid Build Coastguard Worker     output:
1031*e5436536SAndroid Build Coastguard Worker 
1032*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo)1033*e5436536SAndroid Build Coastguard Worker static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo) {
1034*e5436536SAndroid Build Coastguard Worker   INT extDataBits = 0;
1035*e5436536SAndroid Build Coastguard Worker 
1036*e5436536SAndroid Build Coastguard Worker   /* add your new extended data counting methods here */
1037*e5436536SAndroid Build Coastguard Worker 
1038*e5436536SAndroid Build Coastguard Worker   /*
1039*e5436536SAndroid Build Coastguard Worker     no extended data
1040*e5436536SAndroid Build Coastguard Worker   */
1041*e5436536SAndroid Build Coastguard Worker 
1042*e5436536SAndroid Build Coastguard Worker   if (hParametricStereo) {
1043*e5436536SAndroid Build Coastguard Worker     /* PS extended data */
1044*e5436536SAndroid Build Coastguard Worker     extDataBits += SI_SBR_EXTENSION_ID_BITS;
1045*e5436536SAndroid Build Coastguard Worker     extDataBits += FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, NULL);
1046*e5436536SAndroid Build Coastguard Worker   }
1047*e5436536SAndroid Build Coastguard Worker 
1048*e5436536SAndroid Build Coastguard Worker   return (extDataBits + 7) >> 3;
1049*e5436536SAndroid Build Coastguard Worker }
1050