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