Home | History | Annotate | Download | only in src
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten
      5 Forschung e.V. All rights reserved.
      6 
      7  1.    INTRODUCTION
      8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
      9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
     10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
     11 a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
     14 general perceptual audio codecs. AAC-ELD is considered the best-performing
     15 full-bandwidth communications codec by independent studies and is widely
     16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
     17 specifications.
     18 
     19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
     20 those of Fraunhofer) may be obtained through Via Licensing
     21 (www.vialicensing.com) or through the respective patent owners individually for
     22 the purpose of encoding or decoding bit streams in products that are compliant
     23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
     24 Android devices already license these patent claims through Via Licensing or
     25 directly from the patent owners, and therefore FDK AAC Codec software may
     26 already be covered under those patent licenses when it is used for those
     27 licensed purposes only.
     28 
     29 Commercially-licensed AAC software libraries, including floating-point versions
     30 with enhanced sound quality, are also available from Fraunhofer. Users are
     31 encouraged to check the Fraunhofer website for additional applications
     32 information and documentation.
     33 
     34 2.    COPYRIGHT LICENSE
     35 
     36 Redistribution and use in source and binary forms, with or without modification,
     37 are permitted without payment of copyright license fees provided that you
     38 satisfy the following conditions:
     39 
     40 You must retain the complete text of this software license in redistributions of
     41 the FDK AAC Codec or your modifications thereto in source code form.
     42 
     43 You must retain the complete text of this software license in the documentation
     44 and/or other materials provided with redistributions of the FDK AAC Codec or
     45 your modifications thereto in binary form. You must make available free of
     46 charge copies of the complete source code of the FDK AAC Codec and your
     47 modifications thereto to recipients of copies in binary form.
     48 
     49 The name of Fraunhofer may not be used to endorse or promote products derived
     50 from this library without prior written permission.
     51 
     52 You may not charge copyright license fees for anyone to use, copy or distribute
     53 the FDK AAC Codec software or your modifications thereto.
     54 
     55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
     56 that you changed the software and the date of any change. For modified versions
     57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
     58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
     59 AAC Codec Library for Android."
     60 
     61 3.    NO PATENT LICENSE
     62 
     63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
     64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
     65 Fraunhofer provides no warranty of patent non-infringement with respect to this
     66 software.
     67 
     68 You may use this FDK AAC Codec software or modifications thereto only for
     69 purposes that are authorized by appropriate patent licenses.
     70 
     71 4.    DISCLAIMER
     72 
     73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
     74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
     75 including but not limited to the implied warranties of merchantability and
     76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
     78 or consequential damages, including but not limited to procurement of substitute
     79 goods or services; loss of use, data, or profits, or business interruption,
     80 however caused and on any theory of liability, whether in contract, strict
     81 liability, or tort (including negligence), arising in any way out of the use of
     82 this software, even if advised of the possibility of such damage.
     83 
     84 5.    CONTACT INFORMATION
     85 
     86 Fraunhofer Institute for Integrated Circuits IIS
     87 Attention: Audio and Multimedia Departments - FDK AAC LL
     88 Am Wolfsmantel 33
     89 91058 Erlangen, Germany
     90 
     91 www.iis.fraunhofer.de/amm
     92 amm-info (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /**************************** SBR encoder library ******************************
     96 
     97    Author(s):
     98 
     99    Description:
    100 
    101 *******************************************************************************/
    102 
    103 /*!
    104   \file
    105   \brief  SBR bit writing routines $Revision: 93300 $
    106 */
    107 
    108 #include "bit_sbr.h"
    109 
    110 #include "code_env.h"
    111 #include "cmondata.h"
    112 #include "sbr.h"
    113 
    114 #include "ps_main.h"
    115 
    116 typedef enum { SBR_ID_SCE = 1, SBR_ID_CPE } SBR_ELEMENT_TYPE;
    117 
    118 static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,
    119                          HANDLE_SBR_ENV_DATA sbrEnvDataRight,
    120                          HANDLE_PARAMETRIC_STEREO hParametricStereo,
    121                          HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem,
    122                          INT coupling, UINT sbrSyntaxFlags);
    123 
    124 static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData,
    125                            HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
    126                            HANDLE_COMMON_DATA cmonData);
    127 
    128 static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData,
    129                                HANDLE_FDK_BITSTREAM hBitStream);
    130 
    131 static INT encodeSbrSingleChannelElement(
    132     HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream,
    133     HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags);
    134 
    135 static INT encodeSbrChannelPairElement(
    136     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
    137     HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream,
    138     const INT coupling, const UINT sbrSyntaxFlags);
    139 
    140 static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
    141                          HANDLE_FDK_BITSTREAM hBitStream);
    142 
    143 static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
    144                                  HANDLE_FDK_BITSTREAM hBitStream,
    145                                  const int transmitFreqs,
    146                                  const UINT sbrSyntaxFlags);
    147 
    148 static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData,
    149                          HANDLE_FDK_BITSTREAM hBitStream);
    150 
    151 static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData,
    152                                HANDLE_FDK_BITSTREAM hBitStream, INT coupling);
    153 
    154 static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData,
    155                              HANDLE_FDK_BITSTREAM hBitStream, INT coupling);
    156 
    157 static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData,
    158                                     HANDLE_FDK_BITSTREAM hBitStream);
    159 
    160 static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo,
    161                               HANDLE_FDK_BITSTREAM hBitStream);
    162 
    163 static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo);
    164 
    165 /*****************************************************************************
    166 
    167     functionname: FDKsbrEnc_WriteEnvSingleChannelElement
    168     description:  writes pure SBR single channel data element
    169     returns:      number of bits written
    170     input:
    171     output:
    172 
    173 *****************************************************************************/
    174 INT FDKsbrEnc_WriteEnvSingleChannelElement(
    175     HANDLE_SBR_HEADER_DATA sbrHeaderData,
    176     HANDLE_PARAMETRIC_STEREO hParametricStereo,
    177     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_SBR_ENV_DATA sbrEnvData,
    178     HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags)
    179 
    180 {
    181   INT payloadBits = 0;
    182 
    183   cmonData->sbrHdrBits = 0;
    184   cmonData->sbrDataBits = 0;
    185 
    186   /* write pure sbr data */
    187   if (sbrEnvData != NULL) {
    188     /* write header */
    189     payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData);
    190 
    191     /* write data */
    192     payloadBits += encodeSbrData(sbrEnvData, NULL, hParametricStereo, cmonData,
    193                                  SBR_ID_SCE, 0, sbrSyntaxFlags);
    194   }
    195   return payloadBits;
    196 }
    197 
    198 /*****************************************************************************
    199 
    200     functionname: FDKsbrEnc_WriteEnvChannelPairElement
    201     description:  writes pure SBR channel pair data element
    202     returns:      number of bits written
    203     input:
    204     output:
    205 
    206 *****************************************************************************/
    207 INT FDKsbrEnc_WriteEnvChannelPairElement(
    208     HANDLE_SBR_HEADER_DATA sbrHeaderData,
    209     HANDLE_PARAMETRIC_STEREO hParametricStereo,
    210     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
    211     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
    212     HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags)
    213 
    214 {
    215   INT payloadBits = 0;
    216   cmonData->sbrHdrBits = 0;
    217   cmonData->sbrDataBits = 0;
    218 
    219   /* write pure sbr data */
    220   if ((sbrEnvDataLeft != NULL) && (sbrEnvDataRight != NULL)) {
    221     /* write header */
    222     payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData);
    223 
    224     /* write data */
    225     payloadBits += encodeSbrData(sbrEnvDataLeft, sbrEnvDataRight,
    226                                  hParametricStereo, cmonData, SBR_ID_CPE,
    227                                  sbrHeaderData->coupling, sbrSyntaxFlags);
    228   }
    229   return payloadBits;
    230 }
    231 
    232 INT FDKsbrEnc_CountSbrChannelPairElement(
    233     HANDLE_SBR_HEADER_DATA sbrHeaderData,
    234     HANDLE_PARAMETRIC_STEREO hParametricStereo,
    235     HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
    236     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
    237     HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) {
    238   INT payloadBits;
    239   INT bitPos = FDKgetValidBits(&cmonData->sbrBitbuf);
    240 
    241   payloadBits = FDKsbrEnc_WriteEnvChannelPairElement(
    242       sbrHeaderData, hParametricStereo, sbrBitstreamData, sbrEnvDataLeft,
    243       sbrEnvDataRight, cmonData, sbrSyntaxFlags);
    244 
    245   FDKpushBack(&cmonData->sbrBitbuf,
    246               (FDKgetValidBits(&cmonData->sbrBitbuf) - bitPos));
    247 
    248   return payloadBits;
    249 }
    250 
    251 void sbrEncoder_GetHeader(SBR_ENCODER *sbrEncoder, HANDLE_FDK_BITSTREAM hBs,
    252                           INT element_index, int fSendHeaders) {
    253   encodeSbrHeaderData(&sbrEncoder->sbrElement[element_index]->sbrHeaderData,
    254                       hBs);
    255 
    256   if (fSendHeaders == 0) {
    257     /* Prevent header being embedded into the SBR payload. */
    258     sbrEncoder->sbrElement[element_index]->sbrBitstreamData.NrSendHeaderData =
    259         -1;
    260     sbrEncoder->sbrElement[element_index]->sbrBitstreamData.HeaderActive = 0;
    261     sbrEncoder->sbrElement[element_index]
    262         ->sbrBitstreamData.CountSendHeaderData = -1;
    263   }
    264 }
    265 
    266 /*****************************************************************************
    267 
    268     functionname: encodeSbrHeader
    269     description:  encodes SBR Header information
    270     returns:      number of bits written
    271     input:
    272     output:
    273 
    274 *****************************************************************************/
    275 static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData,
    276                            HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
    277                            HANDLE_COMMON_DATA cmonData) {
    278   INT payloadBits = 0;
    279 
    280   if (sbrBitstreamData->HeaderActive) {
    281     payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 1, 1);
    282     payloadBits += encodeSbrHeaderData(sbrHeaderData, &cmonData->sbrBitbuf);
    283   } else {
    284     payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 0, 1);
    285   }
    286 
    287   cmonData->sbrHdrBits = payloadBits;
    288 
    289   return payloadBits;
    290 }
    291 
    292 /*****************************************************************************
    293 
    294     functionname: encodeSbrHeaderData
    295     description:  writes sbr_header()
    296                   bs_protocol_version through bs_header_extra_2
    297     returns:      number of bits written
    298     input:
    299     output:
    300 
    301 *****************************************************************************/
    302 static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData,
    303                                HANDLE_FDK_BITSTREAM hBitStream)
    304 
    305 {
    306   INT payloadBits = 0;
    307   if (sbrHeaderData != NULL) {
    308     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_amp_res,
    309                                 SI_SBR_AMP_RES_BITS);
    310     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_start_frequency,
    311                                 SI_SBR_START_FREQ_BITS);
    312     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_stop_frequency,
    313                                 SI_SBR_STOP_FREQ_BITS);
    314     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_xover_band,
    315                                 SI_SBR_XOVER_BAND_BITS);
    316 
    317     payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_RESERVED_BITS);
    318 
    319     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_1,
    320                                 SI_SBR_HEADER_EXTRA_1_BITS);
    321     payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_2,
    322                                 SI_SBR_HEADER_EXTRA_2_BITS);
    323 
    324     if (sbrHeaderData->header_extra_1) {
    325       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->freqScale,
    326                                   SI_SBR_FREQ_SCALE_BITS);
    327       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->alterScale,
    328                                   SI_SBR_ALTER_SCALE_BITS);
    329       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_noise_bands,
    330                                   SI_SBR_NOISE_BANDS_BITS);
    331     } /* sbrHeaderData->header_extra_1 */
    332 
    333     if (sbrHeaderData->header_extra_2) {
    334       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_bands,
    335                                   SI_SBR_LIMITER_BANDS_BITS);
    336       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_gains,
    337                                   SI_SBR_LIMITER_GAINS_BITS);
    338       payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_interpol_freq,
    339                                   SI_SBR_INTERPOL_FREQ_BITS);
    340       payloadBits +=
    341           FDKwriteBits(hBitStream, sbrHeaderData->sbr_smoothing_length,
    342                        SI_SBR_SMOOTHING_LENGTH_BITS);
    343 
    344     } /* sbrHeaderData->header_extra_2 */
    345   }   /* sbrHeaderData != NULL */
    346 
    347   return payloadBits;
    348 }
    349 
    350 /*****************************************************************************
    351 
    352     functionname: encodeSbrData
    353     description:  encodes sbr Data information
    354     returns:      number of bits written
    355     input:
    356     output:
    357 
    358 *****************************************************************************/
    359 static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,
    360                          HANDLE_SBR_ENV_DATA sbrEnvDataRight,
    361                          HANDLE_PARAMETRIC_STEREO hParametricStereo,
    362                          HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem,
    363                          INT coupling, UINT sbrSyntaxFlags) {
    364   INT payloadBits = 0;
    365 
    366   switch (sbrElem) {
    367     case SBR_ID_SCE:
    368       payloadBits +=
    369           encodeSbrSingleChannelElement(sbrEnvDataLeft, &cmonData->sbrBitbuf,
    370                                         hParametricStereo, sbrSyntaxFlags);
    371       break;
    372     case SBR_ID_CPE:
    373       payloadBits += encodeSbrChannelPairElement(
    374           sbrEnvDataLeft, sbrEnvDataRight, hParametricStereo,
    375           &cmonData->sbrBitbuf, coupling, sbrSyntaxFlags);
    376       break;
    377     default:
    378       /* we never should apply SBR to any other element type */
    379       FDK_ASSERT(0);
    380   }
    381 
    382   cmonData->sbrDataBits = payloadBits;
    383 
    384   return payloadBits;
    385 }
    386 
    387 #define MODE_FREQ_TANS 1
    388 #define MODE_NO_FREQ_TRAN 0
    389 #define LD_TRANSMISSION MODE_FREQ_TANS
    390 static int encodeFreqs(int mode) { return ((mode & MODE_FREQ_TANS) ? 1 : 0); }
    391 
    392 /*****************************************************************************
    393 
    394     functionname: encodeSbrSingleChannelElement
    395     description:  encodes sbr SCE information
    396     returns:      number of bits written
    397     input:
    398     output:
    399 
    400 *****************************************************************************/
    401 static INT encodeSbrSingleChannelElement(
    402     HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream,
    403     HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags) {
    404   INT i, payloadBits = 0;
    405 
    406   payloadBits += FDKwriteBits(hBitStream, 0,
    407                               SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */
    408 
    409   if (sbrEnvData->ldGrid) {
    410     if (sbrEnvData->hSbrBSGrid->frameClass != FIXFIXonly) {
    411       /* encode normal SbrGrid */
    412       payloadBits += encodeSbrGrid(sbrEnvData, hBitStream);
    413     } else {
    414       /* use FIXFIXonly frame Grid */
    415       payloadBits += encodeLowDelaySbrGrid(
    416           sbrEnvData, hBitStream, encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
    417     }
    418   } else {
    419     if (sbrSyntaxFlags & SBR_SYNTAX_SCALABLE) {
    420       payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_COUPLING_BITS);
    421     }
    422     payloadBits += encodeSbrGrid(sbrEnvData, hBitStream);
    423   }
    424 
    425   payloadBits += encodeSbrDtdf(sbrEnvData, hBitStream);
    426 
    427   for (i = 0; i < sbrEnvData->noOfnoisebands; i++) {
    428     payloadBits += FDKwriteBits(hBitStream, sbrEnvData->sbr_invf_mode_vec[i],
    429                                 SI_SBR_INVF_MODE_BITS);
    430   }
    431 
    432   payloadBits += writeEnvelopeData(sbrEnvData, hBitStream, 0);
    433   payloadBits += writeNoiseLevelData(sbrEnvData, hBitStream, 0);
    434 
    435   payloadBits += writeSyntheticCodingData(sbrEnvData, hBitStream);
    436 
    437   payloadBits += encodeExtendedData(hParametricStereo, hBitStream);
    438 
    439   return payloadBits;
    440 }
    441 
    442 /*****************************************************************************
    443 
    444     functionname: encodeSbrChannelPairElement
    445     description:  encodes sbr CPE information
    446     returns:
    447     input:
    448     output:
    449 
    450 *****************************************************************************/
    451 static INT encodeSbrChannelPairElement(
    452     HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
    453     HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream,
    454     const INT coupling, const UINT sbrSyntaxFlags) {
    455   INT payloadBits = 0;
    456   INT i = 0;
    457 
    458   payloadBits += FDKwriteBits(hBitStream, 0,
    459                               SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */
    460 
    461   payloadBits += FDKwriteBits(hBitStream, coupling, SI_SBR_COUPLING_BITS);
    462 
    463   if (coupling) {
    464     if (sbrEnvDataLeft->ldGrid) {
    465       if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) {
    466         /* normal SbrGrid */
    467         payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
    468 
    469       } else {
    470         /* FIXFIXonly frame Grid */
    471         payloadBits +=
    472             encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream,
    473                                   encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
    474       }
    475     } else
    476       payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
    477 
    478     payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream);
    479     payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream);
    480 
    481     for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) {
    482       payloadBits +=
    483           FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i],
    484                        SI_SBR_INVF_MODE_BITS);
    485     }
    486 
    487     payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 1);
    488     payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 1);
    489     payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 1);
    490     payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 1);
    491 
    492     payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream);
    493     payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream);
    494 
    495   } else { /* no coupling */
    496     FDK_ASSERT(sbrEnvDataLeft->ldGrid == sbrEnvDataRight->ldGrid);
    497 
    498     if (sbrEnvDataLeft->ldGrid || sbrEnvDataRight->ldGrid) {
    499       /* sbrEnvDataLeft (left channel) */
    500       if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) {
    501         /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */
    502         /* normal SbrGrid */
    503         payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
    504 
    505       } else {
    506         /* FIXFIXonly frame Grid */
    507         payloadBits +=
    508             encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream,
    509                                   encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
    510       }
    511 
    512       /* sbrEnvDataRight (right channel) */
    513       if (sbrEnvDataRight->hSbrBSGrid->frameClass != FIXFIXonly) {
    514         /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */
    515         /* normal SbrGrid */
    516         payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream);
    517 
    518       } else {
    519         /* FIXFIXonly frame Grid */
    520         payloadBits +=
    521             encodeLowDelaySbrGrid(sbrEnvDataRight, hBitStream,
    522                                   encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
    523       }
    524     } else {
    525       payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
    526       payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream);
    527     }
    528     payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream);
    529     payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream);
    530 
    531     for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) {
    532       payloadBits +=
    533           FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i],
    534                        SI_SBR_INVF_MODE_BITS);
    535     }
    536     for (i = 0; i < sbrEnvDataRight->noOfnoisebands; i++) {
    537       payloadBits +=
    538           FDKwriteBits(hBitStream, sbrEnvDataRight->sbr_invf_mode_vec[i],
    539                        SI_SBR_INVF_MODE_BITS);
    540     }
    541 
    542     payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 0);
    543     payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 0);
    544     payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 0);
    545     payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 0);
    546 
    547     payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream);
    548     payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream);
    549 
    550   } /* coupling */
    551 
    552   payloadBits += encodeExtendedData(hParametricStereo, hBitStream);
    553 
    554   return payloadBits;
    555 }
    556 
    557 static INT ceil_ln2(INT x) {
    558   INT tmp = -1;
    559   while ((1 << ++tmp) < x)
    560     ;
    561   return (tmp);
    562 }
    563 
    564 /*****************************************************************************
    565 
    566     functionname: encodeSbrGrid
    567     description:  if hBitStream != NULL writes bits that describes the
    568                   time/frequency grouping of a frame; else counts them only
    569     returns:      number of bits written or counted
    570     input:
    571     output:
    572 
    573 *****************************************************************************/
    574 static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
    575                          HANDLE_FDK_BITSTREAM hBitStream) {
    576   INT payloadBits = 0;
    577   INT i, temp;
    578   INT bufferFrameStart = sbrEnvData->hSbrBSGrid->bufferFrameStart;
    579   INT numberTimeSlots = sbrEnvData->hSbrBSGrid->numberTimeSlots;
    580 
    581   if (sbrEnvData->ldGrid)
    582     payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass,
    583                                 SBR_CLA_BITS_LD);
    584   else
    585     payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass,
    586                                 SBR_CLA_BITS);
    587 
    588   switch (sbrEnvData->hSbrBSGrid->frameClass) {
    589     case FIXFIXonly:
    590       FDK_ASSERT(0 /* Fatal error in encodeSbrGrid! */);
    591       break;
    592     case FIXFIX:
    593       temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_env);
    594       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ENV_BITS);
    595       if ((sbrEnvData->ldGrid) && (sbrEnvData->hSbrBSGrid->bs_num_env == 1))
    596         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->currentAmpResFF,
    597                                     SI_SBR_AMP_RES_BITS);
    598       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[0],
    599                                   SBR_RES_BITS);
    600 
    601       break;
    602 
    603     case FIXVAR:
    604     case VARFIX:
    605       if (sbrEnvData->hSbrBSGrid->frameClass == FIXVAR)
    606         temp = sbrEnvData->hSbrBSGrid->bs_abs_bord -
    607                (bufferFrameStart + numberTimeSlots);
    608       else
    609         temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - bufferFrameStart;
    610 
    611       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
    612       payloadBits +=
    613           FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->n, SBR_NUM_BITS);
    614 
    615       for (i = 0; i < sbrEnvData->hSbrBSGrid->n; i++) {
    616         temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord[i] - 2) >> 1;
    617         payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
    618       }
    619 
    620       temp = ceil_ln2(sbrEnvData->hSbrBSGrid->n + 2);
    621       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp);
    622 
    623       for (i = 0; i < sbrEnvData->hSbrBSGrid->n + 1; i++) {
    624         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i],
    625                                     SBR_RES_BITS);
    626       }
    627       break;
    628 
    629     case VARVAR:
    630       temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_0 - bufferFrameStart;
    631       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
    632       temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_1 -
    633              (bufferFrameStart + numberTimeSlots);
    634       payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
    635 
    636       payloadBits += FDKwriteBits(
    637           hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_0, SBR_NUM_BITS);
    638       payloadBits += FDKwriteBits(
    639           hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_1, SBR_NUM_BITS);
    640 
    641       for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_0; i++) {
    642         temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_0[i] - 2) >> 1;
    643         payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
    644       }
    645 
    646       for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_1; i++) {
    647         temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_1[i] - 2) >> 1;
    648         payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
    649       }
    650 
    651       temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_rel_0 +
    652                       sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 2);
    653       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp);
    654 
    655       temp = sbrEnvData->hSbrBSGrid->bs_num_rel_0 +
    656              sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 1;
    657 
    658       for (i = 0; i < temp; i++) {
    659         payloadBits += FDKwriteBits(
    660             hBitStream, sbrEnvData->hSbrBSGrid->v_fLR[i], SBR_RES_BITS);
    661       }
    662       break;
    663   }
    664 
    665   return payloadBits;
    666 }
    667 
    668 #define SBR_CLA_BITS_LD 1
    669 /*****************************************************************************
    670 
    671     functionname: encodeLowDelaySbrGrid
    672     description:  if hBitStream != NULL writes bits that describes the
    673                   time/frequency grouping of a frame;
    674                   else counts them only
    675                   (this function only write the FIXFIXonly Bitstream data)
    676     returns:      number of bits written or counted
    677     input:
    678     output:
    679 
    680 *****************************************************************************/
    681 static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
    682                                  HANDLE_FDK_BITSTREAM hBitStream,
    683                                  const int transmitFreqs,
    684                                  const UINT sbrSyntaxFlags) {
    685   int payloadBits = 0;
    686   int i;
    687 
    688   /* write FIXFIXonly Grid */
    689   /* write frameClass [1 bit] for FIXFIXonly Grid */
    690   payloadBits += FDKwriteBits(hBitStream, 1, SBR_CLA_BITS_LD);
    691 
    692   /* absolute Borders are fix: 0,X,X,X,nTimeSlots; so we dont have to transmit
    693    * them */
    694   /* only transmit the transient position! */
    695   /* with this info (b1) we can reconstruct the Frame on Decoder side : */
    696   /* border[0] = 0; border[1] = b1; border[2]=b1+2; border[3] = nrTimeSlots */
    697 
    698   /* use 3 or 4bits for transient border (border) */
    699   if (sbrEnvData->hSbrBSGrid->numberTimeSlots == 8)
    700     payloadBits +=
    701         FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 3);
    702   else
    703     payloadBits +=
    704         FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 4);
    705 
    706   if (transmitFreqs) {
    707     /* write FreqRes grid */
    708     for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_env; i++) {
    709       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i],
    710                                   SBR_RES_BITS);
    711     }
    712   }
    713 
    714   return payloadBits;
    715 }
    716 
    717 /*****************************************************************************
    718 
    719     functionname: encodeSbrDtdf
    720     description:  writes bits that describes the direction of the envelopes of a
    721 frame returns:      number of bits written input: output:
    722 
    723 *****************************************************************************/
    724 static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData,
    725                          HANDLE_FDK_BITSTREAM hBitStream) {
    726   INT i, payloadBits = 0, noOfNoiseEnvelopes;
    727 
    728   noOfNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1;
    729 
    730   for (i = 0; i < sbrEnvData->noOfEnvelopes; ++i) {
    731     payloadBits +=
    732         FDKwriteBits(hBitStream, sbrEnvData->domain_vec[i], SBR_DIR_BITS);
    733   }
    734   for (i = 0; i < noOfNoiseEnvelopes; ++i) {
    735     payloadBits +=
    736         FDKwriteBits(hBitStream, sbrEnvData->domain_vec_noise[i], SBR_DIR_BITS);
    737   }
    738 
    739   return payloadBits;
    740 }
    741 
    742 /*****************************************************************************
    743 
    744     functionname: writeNoiseLevelData
    745     description:  writes bits corresponding to the noise-floor-level
    746     returns:      number of bits written
    747     input:
    748     output:
    749 
    750 *****************************************************************************/
    751 static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData,
    752                                HANDLE_FDK_BITSTREAM hBitStream, INT coupling) {
    753   INT j, i, payloadBits = 0;
    754   INT nNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1;
    755 
    756   for (i = 0; i < nNoiseEnvelopes; i++) {
    757     switch (sbrEnvData->domain_vec_noise[i]) {
    758       case FREQ:
    759         if (coupling && sbrEnvData->balance) {
    760           payloadBits += FDKwriteBits(
    761               hBitStream,
    762               sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands],
    763               sbrEnvData->si_sbr_start_noise_bits_balance);
    764         } else {
    765           payloadBits += FDKwriteBits(
    766               hBitStream,
    767               sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands],
    768               sbrEnvData->si_sbr_start_noise_bits);
    769         }
    770 
    771         for (j = 1 + i * sbrEnvData->noOfnoisebands;
    772              j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) {
    773           if (coupling) {
    774             if (sbrEnvData->balance) {
    775               /* coupling && balance */
    776               payloadBits += FDKwriteBits(hBitStream,
    777                                           sbrEnvData->hufftableNoiseBalanceFreqC
    778                                               [sbrEnvData->sbr_noise_levels[j] +
    779                                                CODE_BOOK_SCF_LAV_BALANCE11],
    780                                           sbrEnvData->hufftableNoiseBalanceFreqL
    781                                               [sbrEnvData->sbr_noise_levels[j] +
    782                                                CODE_BOOK_SCF_LAV_BALANCE11]);
    783             } else {
    784               /* coupling && !balance */
    785               payloadBits += FDKwriteBits(
    786                   hBitStream,
    787                   sbrEnvData->hufftableNoiseLevelFreqC
    788                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11],
    789                   sbrEnvData->hufftableNoiseLevelFreqL
    790                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]);
    791             }
    792           } else {
    793             /* !coupling */
    794             payloadBits += FDKwriteBits(
    795                 hBitStream,
    796                 sbrEnvData
    797                     ->hufftableNoiseFreqC[sbrEnvData->sbr_noise_levels[j] +
    798                                           CODE_BOOK_SCF_LAV11],
    799                 sbrEnvData
    800                     ->hufftableNoiseFreqL[sbrEnvData->sbr_noise_levels[j] +
    801                                           CODE_BOOK_SCF_LAV11]);
    802           }
    803         }
    804         break;
    805 
    806       case TIME:
    807         for (j = i * sbrEnvData->noOfnoisebands;
    808              j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) {
    809           if (coupling) {
    810             if (sbrEnvData->balance) {
    811               /* coupling && balance */
    812               payloadBits += FDKwriteBits(hBitStream,
    813                                           sbrEnvData->hufftableNoiseBalanceTimeC
    814                                               [sbrEnvData->sbr_noise_levels[j] +
    815                                                CODE_BOOK_SCF_LAV_BALANCE11],
    816                                           sbrEnvData->hufftableNoiseBalanceTimeL
    817                                               [sbrEnvData->sbr_noise_levels[j] +
    818                                                CODE_BOOK_SCF_LAV_BALANCE11]);
    819             } else {
    820               /* coupling && !balance */
    821               payloadBits += FDKwriteBits(
    822                   hBitStream,
    823                   sbrEnvData->hufftableNoiseLevelTimeC
    824                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11],
    825                   sbrEnvData->hufftableNoiseLevelTimeL
    826                       [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]);
    827             }
    828           } else {
    829             /* !coupling */
    830             payloadBits += FDKwriteBits(
    831                 hBitStream,
    832                 sbrEnvData
    833                     ->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] +
    834                                                CODE_BOOK_SCF_LAV11],
    835                 sbrEnvData
    836                     ->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] +
    837                                                CODE_BOOK_SCF_LAV11]);
    838           }
    839         }
    840         break;
    841     }
    842   }
    843   return payloadBits;
    844 }
    845 
    846 /*****************************************************************************
    847 
    848     functionname: writeEnvelopeData
    849     description:  writes bits corresponding to the envelope
    850     returns:      number of bits written
    851     input:
    852     output:
    853 
    854 *****************************************************************************/
    855 static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData,
    856                              HANDLE_FDK_BITSTREAM hBitStream, INT coupling) {
    857   INT payloadBits = 0, j, i, delta;
    858 
    859   for (j = 0; j < sbrEnvData->noOfEnvelopes;
    860        j++) { /* loop over all envelopes */
    861     if (sbrEnvData->domain_vec[j] == FREQ) {
    862       if (coupling && sbrEnvData->balance) {
    863         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0],
    864                                     sbrEnvData->si_sbr_start_env_bits_balance);
    865       } else {
    866         payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0],
    867                                     sbrEnvData->si_sbr_start_env_bits);
    868       }
    869     }
    870 
    871     for (i = 1 - sbrEnvData->domain_vec[j]; i < sbrEnvData->noScfBands[j];
    872          i++) {
    873       delta = sbrEnvData->ienvelope[j][i];
    874       if (coupling && sbrEnvData->balance) {
    875         FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLavBalance);
    876       } else {
    877         FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLav);
    878       }
    879       if (coupling) {
    880         if (sbrEnvData->balance) {
    881           if (sbrEnvData->domain_vec[j]) {
    882             /* coupling && balance && TIME */
    883             payloadBits += FDKwriteBits(
    884                 hBitStream,
    885                 sbrEnvData
    886                     ->hufftableBalanceTimeC[delta +
    887                                             sbrEnvData->codeBookScfLavBalance],
    888                 sbrEnvData
    889                     ->hufftableBalanceTimeL[delta +
    890                                             sbrEnvData->codeBookScfLavBalance]);
    891           } else {
    892             /* coupling && balance && FREQ */
    893             payloadBits += FDKwriteBits(
    894                 hBitStream,
    895                 sbrEnvData
    896                     ->hufftableBalanceFreqC[delta +
    897                                             sbrEnvData->codeBookScfLavBalance],
    898                 sbrEnvData
    899                     ->hufftableBalanceFreqL[delta +
    900                                             sbrEnvData->codeBookScfLavBalance]);
    901           }
    902         } else {
    903           if (sbrEnvData->domain_vec[j]) {
    904             /* coupling && !balance && TIME */
    905             payloadBits += FDKwriteBits(
    906                 hBitStream,
    907                 sbrEnvData
    908                     ->hufftableLevelTimeC[delta + sbrEnvData->codeBookScfLav],
    909                 sbrEnvData
    910                     ->hufftableLevelTimeL[delta + sbrEnvData->codeBookScfLav]);
    911           } else {
    912             /* coupling && !balance && FREQ */
    913             payloadBits += FDKwriteBits(
    914                 hBitStream,
    915                 sbrEnvData
    916                     ->hufftableLevelFreqC[delta + sbrEnvData->codeBookScfLav],
    917                 sbrEnvData
    918                     ->hufftableLevelFreqL[delta + sbrEnvData->codeBookScfLav]);
    919           }
    920         }
    921       } else {
    922         if (sbrEnvData->domain_vec[j]) {
    923           /* !coupling && TIME */
    924           payloadBits += FDKwriteBits(
    925               hBitStream,
    926               sbrEnvData->hufftableTimeC[delta + sbrEnvData->codeBookScfLav],
    927               sbrEnvData->hufftableTimeL[delta + sbrEnvData->codeBookScfLav]);
    928         } else {
    929           /* !coupling && FREQ */
    930           payloadBits += FDKwriteBits(
    931               hBitStream,
    932               sbrEnvData->hufftableFreqC[delta + sbrEnvData->codeBookScfLav],
    933               sbrEnvData->hufftableFreqL[delta + sbrEnvData->codeBookScfLav]);
    934         }
    935       }
    936     }
    937   }
    938   return payloadBits;
    939 }
    940 
    941 /*****************************************************************************
    942 
    943     functionname: encodeExtendedData
    944     description:  writes bits corresponding to the extended data
    945     returns:      number of bits written
    946     input:
    947     output:
    948 
    949 *****************************************************************************/
    950 static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo,
    951                               HANDLE_FDK_BITSTREAM hBitStream) {
    952   INT extDataSize;
    953   INT payloadBits = 0;
    954 
    955   extDataSize = getSbrExtendedDataSize(hParametricStereo);
    956 
    957   if (extDataSize != 0) {
    958     INT maxExtSize = (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1;
    959     INT writtenNoBits = 0; /* needed to byte align the extended data */
    960 
    961     payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_EXTENDED_DATA_BITS);
    962     FDK_ASSERT(extDataSize <= SBR_EXTENDED_DATA_MAX_CNT);
    963 
    964     if (extDataSize < maxExtSize) {
    965       payloadBits +=
    966           FDKwriteBits(hBitStream, extDataSize, SI_SBR_EXTENSION_SIZE_BITS);
    967     } else {
    968       payloadBits +=
    969           FDKwriteBits(hBitStream, maxExtSize, SI_SBR_EXTENSION_SIZE_BITS);
    970       payloadBits += FDKwriteBits(hBitStream, extDataSize - maxExtSize,
    971                                   SI_SBR_EXTENSION_ESC_COUNT_BITS);
    972     }
    973 
    974     /* parametric coding signalled here? */
    975     if (hParametricStereo) {
    976       writtenNoBits += FDKwriteBits(hBitStream, EXTENSION_ID_PS_CODING,
    977                                     SI_SBR_EXTENSION_ID_BITS);
    978       writtenNoBits +=
    979           FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, hBitStream);
    980     }
    981 
    982     payloadBits += writtenNoBits;
    983 
    984     /* byte alignment */
    985     writtenNoBits = writtenNoBits % 8;
    986     if (writtenNoBits)
    987       payloadBits += FDKwriteBits(hBitStream, 0, (8 - writtenNoBits));
    988   } else {
    989     payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_EXTENDED_DATA_BITS);
    990   }
    991 
    992   return payloadBits;
    993 }
    994 
    995 /*****************************************************************************
    996 
    997     functionname: writeSyntheticCodingData
    998     description:  writes bits corresponding to the "synthetic-coding"-extension
    999     returns:      number of bits written
   1000     input:
   1001     output:
   1002 
   1003 *****************************************************************************/
   1004 static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData,
   1005                                     HANDLE_FDK_BITSTREAM hBitStream)
   1006 
   1007 {
   1008   INT i;
   1009   INT payloadBits = 0;
   1010 
   1011   payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonicFlag, 1);
   1012 
   1013   if (sbrEnvData->addHarmonicFlag) {
   1014     for (i = 0; i < sbrEnvData->noHarmonics; i++) {
   1015       payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonic[i], 1);
   1016     }
   1017   }
   1018 
   1019   return payloadBits;
   1020 }
   1021 
   1022 /*****************************************************************************
   1023 
   1024     functionname: getSbrExtendedDataSize
   1025     description:  counts the number of bits needed for encoding the
   1026                   extended data (including extension id)
   1027 
   1028     returns:      number of bits needed for the extended data
   1029     input:
   1030     output:
   1031 
   1032 *****************************************************************************/
   1033 static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo) {
   1034   INT extDataBits = 0;
   1035 
   1036   /* add your new extended data counting methods here */
   1037 
   1038   /*
   1039     no extended data
   1040   */
   1041 
   1042   if (hParametricStereo) {
   1043     /* PS extended data */
   1044     extDataBits += SI_SBR_EXTENSION_ID_BITS;
   1045     extDataBits += FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, NULL);
   1046   }
   1047 
   1048   return (extDataBits + 7) >> 3;
   1049 }
   1050