Home | History | Annotate | Download | only in src
      1 
      2 /* -----------------------------------------------------------------------------------------------------------
      3 Software License for The Fraunhofer FDK AAC Codec Library for Android
      4 
      5  Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V.
      6   All rights reserved.
      7 
      8  1.    INTRODUCTION
      9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
     10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
     11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
     14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
     15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
     16 of the MPEG specifications.
     17 
     18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
     19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
     20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
     21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
     22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
     23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
     24 
     25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
     26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
     27 applications information and documentation.
     28 
     29 2.    COPYRIGHT LICENSE
     30 
     31 Redistribution and use in source and binary forms, with or without modification, are permitted without
     32 payment of copyright license fees provided that you satisfy the following conditions:
     33 
     34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
     35 your modifications thereto in source code form.
     36 
     37 You must retain the complete text of this software license in the documentation and/or other materials
     38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
     39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
     40 modifications thereto to recipients of copies in binary form.
     41 
     42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
     43 prior written permission.
     44 
     45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
     46 software or your modifications thereto.
     47 
     48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
     49 and the date of any change. For modified versions of the FDK AAC Codec, the term
     50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
     51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
     52 
     53 3.    NO PATENT LICENSE
     54 
     55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
     56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
     57 respect to this software.
     58 
     59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
     60 by appropriate patent licenses.
     61 
     62 4.    DISCLAIMER
     63 
     64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
     65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
     66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
     68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
     69 or business interruption, however caused and on any theory of liability, whether in contract, strict
     70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
     71 advised of the possibility of such damage.
     72 
     73 5.    CONTACT INFORMATION
     74 
     75 Fraunhofer Institute for Integrated Circuits IIS
     76 Attention: Audio and Multimedia Departments - FDK AAC LL
     77 Am Wolfsmantel 33
     78 91058 Erlangen, Germany
     79 
     80 www.iis.fraunhofer.de/amm
     81 amm-info (at) iis.fraunhofer.de
     82 ----------------------------------------------------------------------------------------------------------- */
     83 
     84 /*!
     85   \file
     86   \brief  SBR decoder frontend
     87   This module provides a frontend to the SBR decoder. The function openSBR() is called for
     88   initialization. The function sbrDecoder_Apply() is called for each frame. sbr_Apply() will call the
     89   required functions to decode the raw SBR data (provided by env_extr.cpp), to decode the envelope data and noise floor levels [decodeSbrData()],
     90   and to finally apply SBR to the current frame [sbr_dec()].
     91 
     92   \sa sbrDecoder_Apply(), \ref documentationOverview
     93 */
     94 
     95 /*!
     96   \page documentationOverview Overview of important information resources and source code documentation
     97 
     98   The primary source code documentation is based on generated and cross-referenced HTML files using
     99   <a HREF="http://www.doxygen.org">doxygen</a>. As part of this documentation
    100   you can find more extensive descriptions about key concepts and algorithms at the following locations:
    101 
    102   <h2>Programming</h2>
    103 
    104   \li Buffer management: sbrDecoder_Apply() and sbr_dec()
    105   \li Internal scale factors to maximize SNR on fixed point processors: #QMF_SCALE_FACTOR
    106   \li Special mantissa-exponent format: Created in requantizeEnvelopeData() and used in calculateSbrEnvelope()
    107 
    108   <h2>Algorithmic details</h2>
    109   \li About the SBR data format: \ref SBR_HEADER_ELEMENT and \ref SBR_STANDARD_ELEMENT
    110   \li Details about the bitstream decoder: env_extr.cpp
    111   \li Details about the QMF filterbank and the provided polyphase implementation: qmf_dec.cpp
    112   \li Details about the transposer: lpp_tran.cpp
    113   \li Details about the envelope adjuster: env_calc.cpp
    114 
    115 */
    116 
    117 #include "sbrdecoder.h"
    118 
    119 #include "FDK_bitstream.h"
    120 
    121 #include "sbrdec_freq_sca.h"
    122 #include "env_extr.h"
    123 #include "sbr_dec.h"
    124 #include "env_dec.h"
    125 #include "sbr_crc.h"
    126 #include "sbr_ram.h"
    127 #include "sbr_rom.h"
    128 #include "lpp_tran.h"
    129 #include "transcendent.h"
    130 
    131 
    132 #include "sbrdec_drc.h"
    133 
    134 #include "psbitdec.h"
    135 
    136 
    137 /* Decoder library info */
    138 #define SBRDECODER_LIB_VL0 2
    139 #define SBRDECODER_LIB_VL1 1
    140 #define SBRDECODER_LIB_VL2 3
    141 #define SBRDECODER_LIB_TITLE "SBR Decoder"
    142 #define SBRDECODER_LIB_BUILD_DATE __DATE__
    143 #define SBRDECODER_LIB_BUILD_TIME __TIME__
    144 
    145 
    146 
    147 
    148 static UCHAR getHeaderSlot( UCHAR currentSlot, UCHAR hdrSlotUsage[(1)+1] )
    149 {
    150   UINT  occupied = 0;
    151   int   s;
    152   UCHAR slot = hdrSlotUsage[currentSlot];
    153 
    154   FDK_ASSERT((1)+1 < 32);
    155 
    156   for (s = 0; s < (1)+1; s++) {
    157     if ( (hdrSlotUsage[s] == slot)
    158       && (s != slot) ) {
    159       occupied = 1;
    160       break;
    161     }
    162   }
    163 
    164   if (occupied) {
    165     occupied = 0;
    166 
    167     for (s = 0; s < (1)+1; s++) {
    168       occupied |= 1 << hdrSlotUsage[s];
    169     }
    170     for (s = 0; s < (1)+1; s++) {
    171       if ( !(occupied & 0x1) ) {
    172         slot = s;
    173         break;
    174       }
    175       occupied >>= 1;
    176     }
    177   }
    178 
    179   return slot;
    180 }
    181 
    182 static void copySbrHeader( HANDLE_SBR_HEADER_DATA hDst, const HANDLE_SBR_HEADER_DATA hSrc )
    183 {
    184   /* copy the whole header memory (including pointers) */
    185   FDKmemcpy( hDst, hSrc, sizeof(SBR_HEADER_DATA) );
    186 
    187   /* update pointers */
    188   hDst->freqBandData.freqBandTable[0]  = hDst->freqBandData.freqBandTableLo;
    189   hDst->freqBandData.freqBandTable[1] = hDst->freqBandData.freqBandTableHi;
    190 }
    191 
    192 
    193 /*!
    194   \brief Reset SBR decoder.
    195 
    196   Reset should only be called if SBR has been sucessfully detected by
    197   an appropriate checkForPayload() function.
    198 
    199   \return Error code.
    200 */
    201 static
    202 SBR_ERROR sbrDecoder_ResetElement (
    203         HANDLE_SBRDECODER    self,
    204         int                  sampleRateIn,
    205         int                  sampleRateOut,
    206         int                  samplesPerFrame,
    207         const MP4_ELEMENT_ID elementID,
    208         const int            elementIndex,
    209         const int            overlap
    210         )
    211 {
    212   SBR_ERROR sbrError = SBRDEC_OK;
    213   HANDLE_SBR_HEADER_DATA hSbrHeader;
    214   UINT qmfFlags = 0;
    215 
    216   int i, synDownsampleFac;
    217 
    218   /* Check in/out samplerates */
    219   if ( sampleRateIn < 6400
    220     || sampleRateIn > 24000
    221      )
    222   {
    223     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    224     goto bail;
    225   }
    226 
    227   if ( sampleRateOut > 48000 )
    228   {
    229     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    230     goto bail;
    231   }
    232 
    233   /* Set QMF mode flags */
    234   if (self->flags & SBRDEC_LOW_POWER)
    235     qmfFlags |= QMF_FLAG_LP;
    236 
    237   if (self->coreCodec == AOT_ER_AAC_ELD) {
    238     if (self->flags & SBRDEC_LD_MPS_QMF) {
    239       qmfFlags |=  QMF_FLAG_MPSLDFB;
    240     } else {
    241       qmfFlags |=  QMF_FLAG_CLDFB;
    242     }
    243   }
    244 
    245   /* Set downsampling factor for synthesis filter bank */
    246   if (sampleRateOut == 0)
    247   {
    248     /* no single rate mode */
    249       sampleRateOut = sampleRateIn<<1; /* In case of implicit signalling, assume dual rate SBR */
    250   }
    251 
    252   if ( sampleRateIn == sampleRateOut ) {
    253     synDownsampleFac = 2;
    254   } else {
    255     synDownsampleFac = 1;
    256   }
    257 
    258   self->synDownsampleFac = synDownsampleFac;
    259   self->sampleRateOut = sampleRateOut;
    260 
    261   {
    262     int i;
    263 
    264     for (i = 0; i < (1)+1; i++)
    265     {
    266       hSbrHeader = &(self->sbrHeader[elementIndex][i]);
    267 
    268       /* init a default header such that we can at least do upsampling later */
    269       sbrError = initHeaderData(
    270               hSbrHeader,
    271               sampleRateIn,
    272               sampleRateOut,
    273               samplesPerFrame,
    274               self->flags
    275               );
    276     }
    277   }
    278 
    279   if (sbrError != SBRDEC_OK) {
    280     goto bail;
    281   }
    282 
    283   /* Init SBR channels going to be assigned to a SBR element */
    284   {
    285     int ch;
    286 
    287     for (ch=0; ch<self->pSbrElement[elementIndex]->nChannels; ch++)
    288     {
    289       /* and create sbrDec */
    290       sbrError = createSbrDec (self->pSbrElement[elementIndex]->pSbrChannel[ch],
    291                           hSbrHeader,
    292                          &self->pSbrElement[elementIndex]->transposerSettings,
    293                           synDownsampleFac,
    294                           qmfFlags,
    295                           self->flags,
    296                           overlap,
    297                           ch );
    298 
    299       if (sbrError != SBRDEC_OK) {
    300         goto bail;
    301       }
    302     }
    303   }
    304 
    305   //FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer));
    306 
    307   if (self->numSbrElements == 1) {
    308     switch ( self->coreCodec ) {
    309     case AOT_AAC_LC:
    310     case AOT_SBR:
    311     case AOT_PS:
    312     case AOT_ER_AAC_SCAL:
    313     case AOT_DRM_AAC:
    314     case AOT_DRM_SURROUND:
    315       if (CreatePsDec ( &self->hParametricStereoDec, samplesPerFrame )) {
    316         sbrError = SBRDEC_CREATE_ERROR;
    317         goto bail;
    318       }
    319       break;
    320     default:
    321       break;
    322     }
    323   }
    324 
    325   /* Init frame delay slot handling */
    326   self->pSbrElement[elementIndex]->useFrameSlot = 0;
    327   for (i = 0; i < ((1)+1); i++) {
    328     self->pSbrElement[elementIndex]->useHeaderSlot[i] = i;
    329   }
    330 
    331 bail:
    332 
    333   return sbrError;
    334 }
    335 
    336 
    337 SBR_ERROR sbrDecoder_Open ( HANDLE_SBRDECODER  * pSelf )
    338 {
    339   HANDLE_SBRDECODER    self = NULL;
    340   SBR_ERROR sbrError = SBRDEC_OK;
    341 
    342   /* Get memory for this instance */
    343   self = GetRam_SbrDecoder();
    344   if (self == NULL) {
    345     sbrError = SBRDEC_MEM_ALLOC_FAILED;
    346     goto bail;
    347   }
    348 
    349   self->workBuffer1 = GetRam_SbrDecWorkBuffer1();
    350   self->workBuffer2 = GetRam_SbrDecWorkBuffer2();
    351 
    352   if (  self->workBuffer1 == NULL
    353      || self->workBuffer2 == NULL )
    354   {
    355     sbrError = SBRDEC_MEM_ALLOC_FAILED;
    356     goto bail;
    357   }
    358 
    359   /*
    360   Already zero because of calloc
    361   self->numSbrElements = 0;
    362   self->numSbrChannels = 0;
    363   self->codecFrameSize = 0;
    364   */
    365 
    366   self->numDelayFrames = (1);  /* set to the max value by default */
    367 
    368   *pSelf = self;
    369 
    370 bail:
    371   return sbrError;
    372 }
    373 
    374 /**
    375  * \brief determine if the given core codec AOT can be processed or not.
    376  * \param coreCodec core codec audio object type.
    377  * \return 1 if SBR can be processed, 0 if SBR cannot be processed/applied.
    378  */
    379 static
    380 int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec)
    381 {
    382   switch (coreCodec) {
    383     case AOT_AAC_LC:
    384     case AOT_SBR:
    385     case AOT_PS:
    386     case AOT_ER_AAC_SCAL:
    387     case AOT_ER_AAC_ELD:
    388       return 1;
    389     default:
    390       return 0;
    391   }
    392 }
    393 
    394 static
    395 void sbrDecoder_DestroyElement (
    396         HANDLE_SBRDECODER       self,
    397         const int               elementIndex
    398         )
    399 {
    400   if (self->pSbrElement[elementIndex] != NULL) {
    401     int ch;
    402 
    403     for (ch=0; ch<SBRDEC_MAX_CH_PER_ELEMENT; ch++) {
    404       if (self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) {
    405         deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    406         FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    407         self->numSbrChannels -= 1;
    408       }
    409     }
    410     FreeRam_SbrDecElement( &self->pSbrElement[elementIndex] );
    411     self->numSbrElements -= 1;
    412   }
    413 }
    414 
    415 
    416 SBR_ERROR sbrDecoder_InitElement (
    417         HANDLE_SBRDECODER       self,
    418         const int               sampleRateIn,
    419         const int               sampleRateOut,
    420         const int               samplesPerFrame,
    421         const AUDIO_OBJECT_TYPE coreCodec,
    422         const MP4_ELEMENT_ID    elementID,
    423         const int               elementIndex
    424         )
    425 {
    426   SBR_ERROR sbrError = SBRDEC_OK;
    427   int chCnt=0;
    428   int nSbrElementsStart = self->numSbrElements;
    429 
    430   /* Check core codec AOT */
    431   if (! sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (4)) {
    432     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    433     goto bail;
    434   }
    435 
    436   if ( elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE )
    437   {
    438     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    439     goto bail;
    440   }
    441 
    442   if (  self->sampleRateIn == sampleRateIn
    443      && self->codecFrameSize == samplesPerFrame
    444      && self->coreCodec == coreCodec
    445      && self->pSbrElement[elementIndex] != NULL
    446      && self->pSbrElement[elementIndex]->elementID == elementID
    447      )
    448   {
    449      /* Nothing to do */
    450      return SBRDEC_OK;
    451   }
    452 
    453   self->sampleRateIn = sampleRateIn;
    454   self->codecFrameSize = samplesPerFrame;
    455   self->coreCodec = coreCodec;
    456 
    457   self->flags = 0;
    458   self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0;
    459 
    460   /* Init SBR elements */
    461   {
    462     int elChannels, ch;
    463 
    464     if (self->pSbrElement[elementIndex] == NULL) {
    465       self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex);
    466       if (self->pSbrElement[elementIndex] == NULL) {
    467         sbrError = SBRDEC_MEM_ALLOC_FAILED;
    468         goto bail;
    469       }
    470       self->numSbrElements ++;
    471     } else {
    472       self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels;
    473     }
    474 
    475     /* Save element ID for sanity checks and to have a fallback for concealment. */
    476     self->pSbrElement[elementIndex]->elementID = elementID;
    477 
    478     /* Determine amount of channels for this element */
    479     switch (elementID) {
    480       case ID_NONE:
    481       case ID_CPE: elChannels=2;
    482         break;
    483       case ID_LFE:
    484       case ID_SCE: elChannels=1;
    485         break;
    486       default: elChannels=0;
    487         break;
    488     }
    489 
    490     /* Handle case of Parametric Stereo */
    491     if ( elementIndex == 0 && elementID == ID_SCE ) {
    492       switch (coreCodec) {
    493         case AOT_AAC_LC:
    494         case AOT_SBR:
    495         case AOT_PS:
    496         case AOT_ER_AAC_SCAL:
    497         case AOT_DRM_AAC:
    498         case AOT_DRM_SURROUND:
    499           elChannels = 2;
    500           break;
    501         default:
    502           break;
    503       }
    504     }
    505 
    506     self->pSbrElement[elementIndex]->nChannels = elChannels;
    507 
    508     for (ch=0; ch<elChannels; ch++)
    509     {
    510       if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
    511         self->pSbrElement[elementIndex]->pSbrChannel[ch] = GetRam_SbrDecChannel(chCnt);
    512         if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
    513           sbrError = SBRDEC_MEM_ALLOC_FAILED;
    514           goto bail;
    515         }
    516       }
    517       self->numSbrChannels ++;
    518 
    519       sbrDecoder_drcInitChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.sbrDrcChannel );
    520 
    521       /* Add reference pointer to workbuffers. */
    522       self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer1 = self->workBuffer1;
    523       self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer2 = self->workBuffer2;
    524       chCnt++;
    525     }
    526     if (elChannels == 1 && self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) {
    527       deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    528       FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    529     }
    530   }
    531 
    532   /* clear error flags for all delay slots */
    533   FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, ((1)+1)*sizeof(UCHAR));
    534 
    535   /* Initialize this instance */
    536   sbrError = sbrDecoder_ResetElement(
    537           self,
    538           sampleRateIn,
    539           sampleRateOut,
    540           samplesPerFrame,
    541           elementID,
    542           elementIndex,
    543           (coreCodec == AOT_ER_AAC_ELD) ? 0 : (6)
    544           );
    545 
    546 
    547 
    548 bail:
    549   if (sbrError != SBRDEC_OK) {
    550     if (nSbrElementsStart < self->numSbrElements) {
    551       /* Free the memory allocated for this element */
    552       sbrDecoder_DestroyElement( self, elementIndex );
    553     } else if (self->pSbrElement[elementIndex] != NULL) {
    554       /* Set error flag to trigger concealment */
    555       self->pSbrElement[elementIndex]->frameErrorFlag[self->pSbrElement[elementIndex]->useFrameSlot] = 1;;
    556     }
    557   }
    558 
    559   return sbrError;
    560 }
    561 
    562 /**
    563  * \brief Apply decoded SBR header for one element.
    564  * \param self SBR decoder instance handle
    565  * \param hSbrHeader SBR header handle to be processed.
    566  * \param hSbrChannel pointer array to the SBR element channels corresponding to the SBR header.
    567  * \param headerStatus header status value returned from SBR header parser.
    568  * \param numElementChannels amount of channels for the SBR element whos header is to be processed.
    569  */
    570 static
    571 SBR_ERROR sbrDecoder_HeaderUpdate(
    572         HANDLE_SBRDECODER self,
    573         HANDLE_SBR_HEADER_DATA hSbrHeader,
    574         SBR_HEADER_STATUS headerStatus,
    575         HANDLE_SBR_CHANNEL hSbrChannel[],
    576         const int numElementChannels
    577         )
    578 {
    579   SBR_ERROR errorStatus = SBRDEC_OK;
    580 
    581   /*
    582     change of control data, reset decoder
    583   */
    584   errorStatus = resetFreqBandTables(hSbrHeader, self->flags);
    585 
    586   if (errorStatus == SBRDEC_OK) {
    587     if (hSbrHeader->syncState == UPSAMPLING && headerStatus != HEADER_RESET)
    588     {
    589       /* As the default header would limit the frequency range,
    590          lowSubband and highSubband must be patched. */
    591       hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands;
    592       hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands;
    593     }
    594 
    595     /* Trigger a reset before processing this slot */
    596     hSbrHeader->status |= SBRDEC_HDR_STAT_RESET;
    597   }
    598 
    599   return errorStatus;
    600 }
    601 
    602 INT sbrDecoder_Header (
    603         HANDLE_SBRDECODER       self,
    604         HANDLE_FDK_BITSTREAM    hBs,
    605         const INT sampleRateIn,
    606         const INT sampleRateOut,
    607         const INT samplesPerFrame,
    608         const AUDIO_OBJECT_TYPE coreCodec,
    609         const MP4_ELEMENT_ID    elementID,
    610         const INT               elementIndex
    611         )
    612 {
    613   SBR_HEADER_STATUS headerStatus;
    614   HANDLE_SBR_HEADER_DATA hSbrHeader;
    615   SBR_ERROR sbrError = SBRDEC_OK;
    616   int headerIndex;
    617 
    618   if ( self == NULL || elementIndex > (4) )
    619   {
    620     return SBRDEC_UNSUPPORTED_CONFIG;
    621   }
    622 
    623   if (! sbrDecoder_isCoreCodecValid(coreCodec)) {
    624     return SBRDEC_UNSUPPORTED_CONFIG;
    625   }
    626 
    627   sbrError = sbrDecoder_InitElement(
    628           self,
    629           sampleRateIn,
    630           sampleRateOut,
    631           samplesPerFrame,
    632           coreCodec,
    633           elementID,
    634           elementIndex
    635           );
    636 
    637   if (sbrError != SBRDEC_OK) {
    638     goto bail;
    639   }
    640 
    641   headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
    642                               self->pSbrElement[elementIndex]->useHeaderSlot);
    643   hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]);
    644 
    645   headerStatus = sbrGetHeaderData ( hSbrHeader,
    646                                     hBs,
    647                                     self->flags,
    648                                     0);
    649 
    650 
    651   {
    652     SBR_DECODER_ELEMENT *pSbrElement;
    653 
    654     pSbrElement = self->pSbrElement[elementIndex];
    655 
    656     /* Sanity check */
    657     if (pSbrElement != NULL) {
    658       if ( (elementID == ID_CPE && pSbrElement->nChannels != 2)
    659         || (elementID != ID_CPE && pSbrElement->nChannels != 1) )
    660       {
    661         return SBRDEC_UNSUPPORTED_CONFIG;
    662       }
    663       if ( headerStatus == HEADER_RESET ) {
    664 
    665         sbrError = sbrDecoder_HeaderUpdate(
    666               self,
    667               hSbrHeader,
    668               headerStatus,
    669               pSbrElement->pSbrChannel,
    670               pSbrElement->nChannels
    671               );
    672 
    673         if (sbrError == SBRDEC_OK) {
    674           hSbrHeader->syncState = SBR_HEADER;
    675           hSbrHeader->status   |= SBRDEC_HDR_STAT_UPDATE;
    676         }
    677         /* else {
    678           Since we already have overwritten the old SBR header the only way out is UPSAMPLING!
    679           This will be prepared in the next step.
    680         } */
    681       }
    682     }
    683   }
    684 bail:
    685   return sbrError;
    686 }
    687 
    688 
    689 SBR_ERROR sbrDecoder_SetParam (HANDLE_SBRDECODER   self,
    690                                const SBRDEC_PARAM  param,
    691                                const INT           value )
    692 {
    693   SBR_ERROR errorStatus = SBRDEC_OK;
    694 
    695   /* configure the subsystems */
    696   switch (param)
    697   {
    698   case SBR_SYSTEM_BITSTREAM_DELAY:
    699     if (value < 0 || value > (1)) {
    700       errorStatus = SBRDEC_SET_PARAM_FAIL;
    701       break;
    702     }
    703     if (self == NULL) {
    704       errorStatus = SBRDEC_NOT_INITIALIZED;
    705     } else {
    706       self->numDelayFrames = (UCHAR)value;
    707     }
    708     break;
    709   case SBR_QMF_MODE:
    710     if (self == NULL) {
    711       errorStatus = SBRDEC_NOT_INITIALIZED;
    712     } else {
    713       if (value == 1) {
    714         self->flags |= SBRDEC_LOW_POWER;
    715       } else {
    716         self->flags &= ~SBRDEC_LOW_POWER;
    717       }
    718     }
    719     break;
    720   case SBR_LD_QMF_TIME_ALIGN:
    721     if (self == NULL) {
    722       errorStatus = SBRDEC_NOT_INITIALIZED;
    723     } else {
    724       if (value == 1) {
    725         self->flags |= SBRDEC_LD_MPS_QMF;
    726       } else {
    727         self->flags &= ~SBRDEC_LD_MPS_QMF;
    728       }
    729     }
    730     break;
    731   case SBR_BS_INTERRUPTION:
    732     {
    733       int elementIndex;
    734       /* Loop over SBR elements */
    735       for (elementIndex = 0; elementIndex < self->numSbrElements; elementIndex++)
    736       {
    737         HANDLE_SBR_HEADER_DATA hSbrHeader;
    738         int headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
    739                                         self->pSbrElement[elementIndex]->useHeaderSlot);
    740 
    741         hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]);
    742 
    743         /* Set sync state UPSAMPLING for the corresponding slot.
    744            This switches off bitstream parsing until a new header arrives. */
    745         hSbrHeader->syncState = UPSAMPLING;
    746         hSbrHeader->status   |= SBRDEC_HDR_STAT_UPDATE;
    747       }
    748     }
    749     break;
    750   default:
    751     errorStatus = SBRDEC_SET_PARAM_FAIL;
    752     break;
    753   }  /* switch(param) */
    754 
    755   return (errorStatus);
    756 }
    757 
    758 static
    759 SBRDEC_DRC_CHANNEL * sbrDecoder_drcGetChannel( const HANDLE_SBRDECODER self, const INT channel )
    760 {
    761   SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
    762   int elementIndex, elChanIdx=0, numCh=0;
    763 
    764   for (elementIndex = 0; (elementIndex < (4)) && (numCh <= channel); elementIndex++)
    765   {
    766     SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex];
    767     int c, elChannels;
    768 
    769     elChanIdx = 0;
    770     if (pSbrElement == NULL) break;
    771 
    772     /* Determine amount of channels for this element */
    773     switch (pSbrElement->elementID) {
    774       case ID_CPE: elChannels = 2;
    775         break;
    776       case ID_LFE:
    777       case ID_SCE: elChannels = 1;
    778         break;
    779       case ID_NONE:
    780       default: elChannels = 0;
    781         break;
    782     }
    783 
    784     /* Limit with actual allocated element channels */
    785     elChannels = FDKmin(elChannels, pSbrElement->nChannels);
    786 
    787     for (c = 0; (c < elChannels) && (numCh <= channel); c++) {
    788       if (pSbrElement->pSbrChannel[elChanIdx] != NULL) {
    789         numCh++;
    790         elChanIdx++;
    791       }
    792     }
    793   }
    794   elementIndex -= 1;
    795   elChanIdx -= 1;
    796 
    797   if (elChanIdx < 0 || elementIndex < 0) {
    798     return NULL;
    799   }
    800 
    801   if ( self->pSbrElement[elementIndex] != NULL ) {
    802     if ( self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL )
    803     {
    804       pSbrDrcChannelData = &self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx]->SbrDec.sbrDrcChannel;
    805     }
    806   }
    807 
    808   return (pSbrDrcChannelData);
    809 }
    810 
    811 SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER  self,
    812                                       INT                ch,
    813                                       UINT               numBands,
    814                                       FIXP_DBL          *pNextFact_mag,
    815                                       INT                nextFact_exp,
    816                                       SHORT              drcInterpolationScheme,
    817                                       UCHAR              winSequence,
    818                                       USHORT            *pBandTop )
    819 {
    820   SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
    821   int band, isValidData = 0;
    822 
    823   if (self == NULL) {
    824     return SBRDEC_NOT_INITIALIZED;
    825   }
    826   if (ch > (6) || pNextFact_mag == NULL) {
    827     return SBRDEC_SET_PARAM_FAIL;
    828   }
    829 
    830   /* Search for gain values different to 1.0f */
    831   for (band = 0; band < numBands; band += 1) {
    832     if ( !((pNextFact_mag[band] == FL2FXCONST_DBL(0.5))  && (nextFact_exp == 1))
    833       && !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && (nextFact_exp == 0)) ) {
    834       isValidData = 1;
    835       break;
    836     }
    837   }
    838 
    839   /* Find the right SBR channel */
    840   pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch );
    841 
    842   if ( pSbrDrcChannelData != NULL ) {
    843     if ( pSbrDrcChannelData->enable || isValidData )
    844   { /* Activate processing only with real and valid data */
    845     int i;
    846 
    847     pSbrDrcChannelData->enable   = 1;
    848     pSbrDrcChannelData->numBandsNext = numBands;
    849 
    850     pSbrDrcChannelData->winSequenceNext            = winSequence;
    851     pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme;
    852     pSbrDrcChannelData->nextFact_exp               = nextFact_exp;
    853 
    854     for (i = 0; i < (int)numBands; i++) {
    855       pSbrDrcChannelData->bandTopNext[i]  = pBandTop[i];
    856       pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i];
    857     }
    858   }
    859   }
    860 
    861   return SBRDEC_OK;
    862 }
    863 
    864 
    865 void sbrDecoder_drcDisable ( HANDLE_SBRDECODER  self,
    866                              INT                ch )
    867 {
    868   SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
    869 
    870   if ( (self == NULL)
    871     || (ch > (6))
    872     || (self->numSbrElements == 0)
    873     || (self->numSbrChannels == 0) ) {
    874     return;
    875   }
    876 
    877   /* Find the right SBR channel */
    878   pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch );
    879 
    880   if ( pSbrDrcChannelData != NULL ) {
    881     pSbrDrcChannelData->enable = 0;
    882   }
    883 }
    884 
    885 
    886 
    887 SBR_ERROR sbrDecoder_Parse(
    888         HANDLE_SBRDECODER self,
    889         HANDLE_FDK_BITSTREAM  hBs,
    890         int *count,
    891         int  bsPayLen,
    892         int  crcFlag,
    893         MP4_ELEMENT_ID prevElement,
    894         int elementIndex,
    895         int fGlobalIndependencyFlag
    896         )
    897 {
    898   SBR_DECODER_ELEMENT   *hSbrElement;
    899   HANDLE_SBR_HEADER_DATA hSbrHeader;
    900   HANDLE_SBR_CHANNEL    *pSbrChannel;
    901 
    902   SBR_FRAME_DATA *hFrameDataLeft;
    903   SBR_FRAME_DATA *hFrameDataRight;
    904 
    905   SBR_ERROR errorStatus = SBRDEC_OK;
    906   SBR_SYNC_STATE initialSyncState;
    907   SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT;
    908 
    909   INT  startPos;
    910   INT  CRCLen = 0;
    911 
    912   int  stereo;
    913   int  fDoDecodeSbrData = 1;
    914 
    915   int lastSlot, lastHdrSlot = 0, thisHdrSlot;
    916 
    917   /* Remember start position of  SBR element */
    918   startPos = FDKgetValidBits(hBs);
    919 
    920   /* SBR sanity checks */
    921   if ( self == NULL || self->pSbrElement[elementIndex] == NULL ) {
    922     errorStatus = SBRDEC_NOT_INITIALIZED;
    923     goto bail;
    924   }
    925 
    926   hSbrElement = self->pSbrElement[elementIndex];
    927 
    928   lastSlot    = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot-1 : self->numDelayFrames;
    929   lastHdrSlot =  hSbrElement->useHeaderSlot[lastSlot];
    930   thisHdrSlot =  getHeaderSlot( hSbrElement->useFrameSlot, hSbrElement->useHeaderSlot );  /* Get a free header slot not used by frames not processed yet. */
    931 
    932   /* Assign the free slot to store a new header if there is one. */
    933   hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot];
    934 
    935   pSbrChannel = hSbrElement->pSbrChannel;
    936   stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
    937 
    938   hFrameDataLeft  = &self->pSbrElement[elementIndex]->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
    939   hFrameDataRight = &self->pSbrElement[elementIndex]->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
    940 
    941   initialSyncState = hSbrHeader->syncState;
    942 
    943   /* reset PS flag; will be set after PS was found */
    944   self->flags &= ~SBRDEC_PS_DECODED;
    945 
    946   if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) {
    947     /* Got a new header from extern (e.g. from an ASC) */
    948     headerStatus = HEADER_OK;
    949     hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE;
    950   }
    951   else if (thisHdrSlot != lastHdrSlot) {
    952     /* Copy the last header into this slot otherwise the
    953        header compare will trigger more HEADER_RESETs than needed. */
    954     copySbrHeader( hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot] );
    955   }
    956 
    957   /*
    958      Check if bit stream data is valid and matches the element context
    959   */
    960   if ( ((prevElement != ID_SCE) && (prevElement != ID_CPE)) || prevElement != hSbrElement->elementID) {
    961     /* In case of LFE we also land here, since there is no LFE SBR element (do upsampling only) */
    962     fDoDecodeSbrData = 0;
    963   }
    964 
    965   if (fDoDecodeSbrData)
    966   {
    967     if ((INT)FDKgetValidBits(hBs) <= 0) {
    968       fDoDecodeSbrData = 0;
    969     }
    970   }
    971 
    972   /*
    973      SBR CRC-check
    974   */
    975   if (fDoDecodeSbrData)
    976   {
    977     if (crcFlag == 1) {
    978       switch (self->coreCodec) {
    979       case AOT_ER_AAC_ELD:
    980         FDKpushFor (hBs, 10);
    981         /* check sbrcrc later: we don't know the payload length now */
    982         break;
    983       default:
    984         CRCLen = bsPayLen - 10;                     /* change: 0 => i */
    985         if (CRCLen < 0) {
    986           fDoDecodeSbrData = 0;
    987         } else {
    988           fDoDecodeSbrData = SbrCrcCheck (hBs, CRCLen);
    989         }
    990         break;
    991       }
    992     }
    993   } /* if (fDoDecodeSbrData) */
    994 
    995   /*
    996      Read in the header data and issue a reset if change occured
    997   */
    998   if (fDoDecodeSbrData)
    999   {
   1000     int sbrHeaderPresent;
   1001 
   1002     {
   1003       sbrHeaderPresent = FDKreadBit(hBs);
   1004     }
   1005 
   1006     if ( sbrHeaderPresent ) {
   1007       headerStatus = sbrGetHeaderData (hSbrHeader,
   1008                                        hBs,
   1009                                        self->flags,
   1010                                        1);
   1011     }
   1012 
   1013     if (headerStatus == HEADER_RESET)
   1014     {
   1015       errorStatus = sbrDecoder_HeaderUpdate(
   1016             self,
   1017             hSbrHeader,
   1018             headerStatus,
   1019             pSbrChannel,
   1020             hSbrElement->nChannels
   1021             );
   1022 
   1023       if (errorStatus == SBRDEC_OK) {
   1024         hSbrHeader->syncState = SBR_HEADER;
   1025       } else {
   1026         hSbrHeader->syncState = SBR_NOT_INITIALIZED;
   1027       }
   1028     }
   1029 
   1030     if (errorStatus != SBRDEC_OK) {
   1031       fDoDecodeSbrData = 0;
   1032     }
   1033   } /* if (fDoDecodeSbrData) */
   1034 
   1035   /*
   1036     Print debugging output only if state has changed
   1037   */
   1038 
   1039   /* read frame data */
   1040   if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) {
   1041     int sbrFrameOk;
   1042     /* read the SBR element data */
   1043     if (stereo) {
   1044       sbrFrameOk = sbrGetChannelPairElement(hSbrHeader,
   1045                                             hFrameDataLeft,
   1046                                             hFrameDataRight,
   1047                                             hBs,
   1048                                             self->flags,
   1049                                             self->pSbrElement[elementIndex]->transposerSettings.overlap);
   1050     }
   1051     else {
   1052       if (self->hParametricStereoDec != NULL) {
   1053         /* update slot index for PS bitstream parsing */
   1054         self->hParametricStereoDec->bsLastSlot = self->hParametricStereoDec->bsReadSlot;
   1055         self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot;
   1056       }
   1057       sbrFrameOk = sbrGetSingleChannelElement(hSbrHeader,
   1058                                               hFrameDataLeft,
   1059                                               hBs,
   1060                                               self->hParametricStereoDec,
   1061                                               self->flags,
   1062                                               self->pSbrElement[elementIndex]->transposerSettings.overlap);
   1063     }
   1064     if (!sbrFrameOk) {
   1065       fDoDecodeSbrData = 0;
   1066     }
   1067     else {
   1068       INT valBits;
   1069 
   1070       if (bsPayLen > 0) {
   1071         valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs));
   1072       } else {
   1073         valBits = (INT)FDKgetValidBits(hBs);
   1074       }
   1075 
   1076       if ( crcFlag == 1 ) {
   1077         switch (self->coreCodec) {
   1078         case AOT_ER_AAC_ELD:
   1079           {
   1080             /* late crc check for eld */
   1081             INT payloadbits = (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos;
   1082             INT crcLen      = payloadbits - 10;
   1083             FDKpushBack(hBs, payloadbits);
   1084             fDoDecodeSbrData      = SbrCrcCheck (hBs, crcLen);
   1085             FDKpushFor(hBs, crcLen);
   1086           }
   1087           break;
   1088         default:
   1089           break;
   1090         }
   1091       }
   1092 
   1093       /* sanity check of remaining bits */
   1094       if (valBits < 0) {
   1095         fDoDecodeSbrData = 0;
   1096       } else {
   1097         switch (self->coreCodec) {
   1098         case AOT_SBR:
   1099         case AOT_PS:
   1100         case AOT_AAC_LC:
   1101           {
   1102             /* This sanity check is only meaningful with General Audio bitstreams */
   1103             int alignBits = valBits & 0x7;
   1104 
   1105             if (valBits > alignBits) {
   1106               fDoDecodeSbrData = 0;
   1107             }
   1108           }
   1109           break;
   1110         default:
   1111           /* No sanity check available */
   1112           break;
   1113         }
   1114       }
   1115     }
   1116   }
   1117 
   1118   if (!fDoDecodeSbrData) {
   1119     /* Set error flag for this slot to trigger concealment */
   1120     self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 1;
   1121     errorStatus = SBRDEC_PARSE_ERROR;
   1122   } else {
   1123     /* Everything seems to be ok so clear the error flag */
   1124     self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 0;
   1125   }
   1126 
   1127   if (!stereo) {
   1128     /* Turn coupling off explicitely to avoid access to absent right frame data
   1129        that might occur with corrupt bitstreams. */
   1130     hFrameDataLeft->coupling = COUPLING_OFF;
   1131   }
   1132 
   1133 bail:
   1134   if (errorStatus == SBRDEC_OK) {
   1135     if (headerStatus == HEADER_NOT_PRESENT) {
   1136       /* Use the old header for this frame */
   1137       hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot;
   1138     } else {
   1139       /* Use the new header for this frame */
   1140       hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot;
   1141     }
   1142 
   1143     /* Move frame pointer to the next slot which is up to be decoded/applied next */
   1144     hSbrElement->useFrameSlot = (hSbrElement->useFrameSlot+1) % (self->numDelayFrames+1);
   1145   }
   1146 
   1147   *count -= startPos - FDKgetValidBits(hBs);
   1148 
   1149   return errorStatus;
   1150 }
   1151 
   1152 
   1153 /**
   1154  * \brief Render one SBR element into time domain signal.
   1155  * \param self SBR decoder handle
   1156  * \param timeData pointer to output buffer
   1157  * \param interleaved flag indicating interleaved channel output
   1158  * \param channelMapping pointer to UCHAR array where next 2 channel offsets are stored.
   1159  * \param elementIndex enumerating index of the SBR element to render.
   1160  * \param numInChannels number of channels from core coder (reading stride).
   1161  * \param numOutChannels pointer to a location to return number of output channels.
   1162  * \param psPossible flag indicating if PS is possible or not.
   1163  * \return SBRDEC_OK if successfull, else error code
   1164  */
   1165 static SBR_ERROR
   1166 sbrDecoder_DecodeElement (
   1167         HANDLE_SBRDECODER    self,
   1168         INT_PCM             *timeData,
   1169         const int            interleaved,
   1170         const UCHAR         *channelMapping,
   1171         const int            elementIndex,
   1172         const int            numInChannels,
   1173         int                 *numOutChannels,
   1174         const int            psPossible
   1175         )
   1176 {
   1177   SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex];
   1178   HANDLE_SBR_CHANNEL    *pSbrChannel = self->pSbrElement[elementIndex]->pSbrChannel;
   1179   HANDLE_SBR_HEADER_DATA hSbrHeader = &self->sbrHeader[elementIndex][hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]];
   1180   HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec;
   1181 
   1182   /* get memory for frame data from scratch */
   1183   SBR_FRAME_DATA *hFrameDataLeft  = &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
   1184   SBR_FRAME_DATA *hFrameDataRight = &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
   1185 
   1186   SBR_ERROR errorStatus = SBRDEC_OK;
   1187 
   1188 
   1189   INT  strideIn, strideOut, offset0, offset1;
   1190   INT  codecFrameSize = self->codecFrameSize;
   1191 
   1192   int  stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
   1193   int  numElementChannels = hSbrElement->nChannels; /* Number of channels of the current SBR element */
   1194 
   1195   /* Update the header error flag */
   1196   hSbrHeader->frameErrorFlag = hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot];
   1197 
   1198   /*
   1199      Prepare filterbank for upsampling if no valid bit stream data is available.
   1200    */
   1201   if ( hSbrHeader->syncState == SBR_NOT_INITIALIZED )
   1202   {
   1203     errorStatus = initHeaderData(
   1204             hSbrHeader,
   1205             self->sampleRateIn,
   1206             self->sampleRateOut,
   1207             codecFrameSize,
   1208             self->flags
   1209             );
   1210 
   1211     if (errorStatus != SBRDEC_OK) {
   1212       return errorStatus;
   1213     }
   1214 
   1215     hSbrHeader->syncState = UPSAMPLING;
   1216 
   1217     errorStatus = sbrDecoder_HeaderUpdate(
   1218             self,
   1219             hSbrHeader,
   1220             HEADER_NOT_PRESENT,
   1221             pSbrChannel,
   1222             hSbrElement->nChannels
   1223             );
   1224 
   1225     if (errorStatus != SBRDEC_OK) {
   1226       hSbrHeader->syncState = SBR_NOT_INITIALIZED;
   1227       return errorStatus;
   1228     }
   1229   }
   1230 
   1231   /* reset */
   1232   if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) {
   1233     int ch;
   1234     for (ch = 0 ; ch < numElementChannels; ch++) {
   1235       SBR_ERROR errorStatusTmp = SBRDEC_OK;
   1236 
   1237       errorStatusTmp = resetSbrDec (
   1238              &pSbrChannel[ch]->SbrDec,
   1239               hSbrHeader,
   1240              &pSbrChannel[ch]->prevFrameData,
   1241               self->flags & SBRDEC_LOW_POWER,
   1242               self->synDownsampleFac
   1243               );
   1244 
   1245       if (errorStatusTmp != SBRDEC_OK) {
   1246         errorStatus = errorStatusTmp;
   1247       }
   1248     }
   1249     hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET;
   1250   }
   1251 
   1252   /* decoding */
   1253   if ( (hSbrHeader->syncState == SBR_ACTIVE)
   1254     || ((hSbrHeader->syncState == SBR_HEADER) && (hSbrHeader->frameErrorFlag == 0)) )
   1255   {
   1256     errorStatus = SBRDEC_OK;
   1257 
   1258     decodeSbrData (hSbrHeader,
   1259                    hFrameDataLeft,
   1260                   &pSbrChannel[0]->prevFrameData,
   1261                    (stereo) ? hFrameDataRight : NULL,
   1262                    (stereo) ? &pSbrChannel[1]->prevFrameData : NULL);
   1263 
   1264 
   1265     /* Now we have a full parameter set and can do parameter
   1266        based concealment instead of plain upsampling. */
   1267     hSbrHeader->syncState = SBR_ACTIVE;
   1268   }
   1269 
   1270   /* decode PS data if available */
   1271   if (h_ps_d != NULL && psPossible) {
   1272     int applyPs = 1;
   1273 
   1274     /* define which frame delay line slot to process */
   1275     h_ps_d->processSlot = hSbrElement->useFrameSlot;
   1276 
   1277     applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag);
   1278     self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0;
   1279   }
   1280 
   1281   /* Set strides for reading and writing */
   1282   if (interleaved) {
   1283     strideIn = numInChannels;
   1284     if ( psPossible )
   1285       strideOut = (numInChannels < 2) ? 2 : numInChannels;
   1286     else
   1287       strideOut = numInChannels;
   1288     offset0 = channelMapping[0];
   1289     offset1 = channelMapping[1];
   1290   } else {
   1291     strideIn  = 1;
   1292     strideOut = 1;
   1293     offset0 = channelMapping[0]*2*codecFrameSize;
   1294     offset1 = channelMapping[1]*2*codecFrameSize;
   1295   }
   1296 
   1297   /* use same buffers for left and right channel and apply PS per timeslot */
   1298   /* Process left channel */
   1299 //FDKprintf("self->codecFrameSize %d\t%d\n",self->codecFrameSize,self->sampleRateIn);
   1300   sbr_dec (&pSbrChannel[0]->SbrDec,
   1301             timeData + offset0,
   1302             timeData + offset0,
   1303            &pSbrChannel[1]->SbrDec,
   1304             timeData + offset1,
   1305             strideIn,
   1306             strideOut,
   1307             hSbrHeader,
   1308             hFrameDataLeft,
   1309            &pSbrChannel[0]->prevFrameData,
   1310             (hSbrHeader->syncState == SBR_ACTIVE),
   1311             h_ps_d,
   1312             self->flags
   1313           );
   1314 
   1315   if (stereo) {
   1316     /* Process right channel */
   1317     sbr_dec (&pSbrChannel[1]->SbrDec,
   1318               timeData + offset1,
   1319               timeData + offset1,
   1320               NULL,
   1321               NULL,
   1322               strideIn,
   1323               strideOut,
   1324               hSbrHeader,
   1325               hFrameDataRight,
   1326              &pSbrChannel[1]->prevFrameData,
   1327               (hSbrHeader->syncState == SBR_ACTIVE),
   1328               NULL,
   1329               self->flags
   1330             );
   1331   }
   1332 
   1333   if (h_ps_d != NULL) {
   1334     /* save PS status for next run */
   1335     h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0 ;
   1336   }
   1337 
   1338   if ( psPossible
   1339     )
   1340   {
   1341     FDK_ASSERT(strideOut > 1);
   1342     if ( !(self->flags & SBRDEC_PS_DECODED) ) {
   1343       /* A decoder which is able to decode PS has to produce a stereo output even if no PS data is availble. */
   1344       /* So copy left channel to right channel.                                                              */
   1345       if (interleaved) {
   1346         INT_PCM *ptr;
   1347         INT i;
   1348         FDK_ASSERT(strideOut == 2);
   1349 
   1350         ptr = timeData;
   1351         for (i = codecFrameSize; i--; )
   1352         {
   1353           INT_PCM tmp; /* This temporal variable is required because some compilers can't do *ptr++ = *ptr++ correctly. */
   1354           tmp = *ptr++; *ptr++ = tmp;
   1355           tmp = *ptr++; *ptr++ = tmp;
   1356         }
   1357       } else {
   1358         FDKmemcpy( timeData+2*codecFrameSize, timeData, 2*codecFrameSize*sizeof(INT_PCM) );
   1359       }
   1360     }
   1361     *numOutChannels = 2;  /* Output minimum two channels when PS is enabled. */
   1362   }
   1363 
   1364   return errorStatus;
   1365 }
   1366 
   1367 
   1368 SBR_ERROR sbrDecoder_Apply ( HANDLE_SBRDECODER   self,
   1369                              INT_PCM            *timeData,
   1370                              int                *numChannels,
   1371                              int                *sampleRate,
   1372                              const UCHAR         channelMapping[(6)],
   1373                              const int           interleaved,
   1374                              const int           coreDecodedOk,
   1375                              UCHAR              *psDecoded )
   1376 {
   1377   SBR_ERROR errorStatus = SBRDEC_OK;
   1378 
   1379   int   psPossible = 0;
   1380   int   sbrElementNum;
   1381   int   numCoreChannels = *numChannels;
   1382   int   numSbrChannels  = 0;
   1383 
   1384   psPossible = *psDecoded;
   1385 
   1386   if (self->numSbrElements < 1) {
   1387     /* exit immediately to avoid access violations */
   1388     return SBRDEC_CREATE_ERROR;
   1389   }
   1390 
   1391   /* Sanity check of allocated SBR elements. */
   1392   for (sbrElementNum=0; sbrElementNum<self->numSbrElements; sbrElementNum++) {
   1393     if (self->pSbrElement[sbrElementNum] == NULL) {
   1394       return SBRDEC_CREATE_ERROR;
   1395     }
   1396   }
   1397 
   1398   if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) {
   1399     psPossible = 0;
   1400   }
   1401 
   1402 
   1403   /* In case of non-interleaved time domain data and upsampling, make room for bigger SBR output. */
   1404   if (self->synDownsampleFac == 1 && interleaved == 0) {
   1405     int c, outputFrameSize;
   1406 
   1407     outputFrameSize =
   1408             self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_channels
   1409             * self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_col;
   1410 
   1411     for (c=numCoreChannels-1; c>0; c--) {
   1412       FDKmemmove(timeData + c*outputFrameSize, timeData + c*self->codecFrameSize , self->codecFrameSize*sizeof(INT_PCM));
   1413     }
   1414   }
   1415 
   1416 
   1417   /* Make sure that even if no SBR data was found/parsed *psDecoded is returned 1 if psPossible was 0. */
   1418   if (psPossible == 0) {
   1419     self->flags &= ~SBRDEC_PS_DECODED;
   1420   }
   1421 
   1422   /* Loop over SBR elements */
   1423   for (sbrElementNum = 0; sbrElementNum<self->numSbrElements; sbrElementNum++)
   1424   {
   1425     int numElementChan;
   1426 
   1427     if (psPossible && self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) {
   1428       errorStatus = SBRDEC_UNSUPPORTED_CONFIG;
   1429       goto bail;
   1430     }
   1431 
   1432     numElementChan = (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1;
   1433 
   1434     /* If core signal is bad then force upsampling */
   1435     if ( ! coreDecodedOk ) {
   1436       self->pSbrElement[sbrElementNum]->frameErrorFlag[self->pSbrElement[sbrElementNum]->useFrameSlot] = 1;
   1437     }
   1438 
   1439     errorStatus = sbrDecoder_DecodeElement (
   1440                                  self,
   1441                                  timeData,
   1442                                  interleaved,
   1443                                  channelMapping,
   1444                                  sbrElementNum,
   1445                                  numCoreChannels,
   1446                                 &numElementChan,
   1447                                  psPossible
   1448                                );
   1449 
   1450     if (errorStatus != SBRDEC_OK) {
   1451       goto bail;
   1452     }
   1453 
   1454     numSbrChannels += numElementChan;
   1455     channelMapping += numElementChan;
   1456 
   1457     if (numSbrChannels >= numCoreChannels) {
   1458       break;
   1459     }
   1460   }
   1461 
   1462   /* Update numChannels and samplerate */
   1463   *numChannels = numSbrChannels;
   1464   *sampleRate = self->sampleRateOut;
   1465   *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0;
   1466 
   1467 
   1468 
   1469 bail:
   1470 
   1471   return errorStatus;
   1472 }
   1473 
   1474 
   1475 SBR_ERROR sbrDecoder_Close ( HANDLE_SBRDECODER *pSelf )
   1476 {
   1477   HANDLE_SBRDECODER self = *pSelf;
   1478   int i;
   1479 
   1480   if (self != NULL)
   1481   {
   1482     if (self->hParametricStereoDec != NULL) {
   1483       DeletePsDec ( &self->hParametricStereoDec );
   1484     }
   1485 
   1486     if (self->workBuffer1 != NULL) {
   1487       FreeRam_SbrDecWorkBuffer1(&self->workBuffer1);
   1488     }
   1489     if (self->workBuffer2 != NULL) {
   1490       FreeRam_SbrDecWorkBuffer2(&self->workBuffer2);
   1491     }
   1492 
   1493     for (i = 0; i < (4); i++) {
   1494       sbrDecoder_DestroyElement( self, i );
   1495     }
   1496 
   1497     FreeRam_SbrDecoder(pSelf);
   1498   }
   1499 
   1500   return SBRDEC_OK;
   1501 }
   1502 
   1503 
   1504 INT sbrDecoder_GetLibInfo( LIB_INFO *info )
   1505 {
   1506   int i;
   1507 
   1508   if (info == NULL) {
   1509     return -1;
   1510   }
   1511 
   1512   /* search for next free tab */
   1513   for (i = 0; i < FDK_MODULE_LAST; i++) {
   1514     if (info[i].module_id == FDK_NONE)
   1515       break;
   1516   }
   1517   if (i == FDK_MODULE_LAST)
   1518     return -1;
   1519   info += i;
   1520 
   1521   info->module_id = FDK_SBRDEC;
   1522   info->version = LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2);
   1523   LIB_VERSION_STRING(info);
   1524   info->build_date = (char *)SBRDECODER_LIB_BUILD_DATE;
   1525   info->build_time = (char *)SBRDECODER_LIB_BUILD_TIME;
   1526   info->title      = (char *)SBRDECODER_LIB_TITLE;
   1527 
   1528   /* Set flags */
   1529   info->flags = 0
   1530     | CAPF_SBR_HQ
   1531     | CAPF_SBR_LP
   1532     | CAPF_SBR_PS_MPEG
   1533     | CAPF_SBR_CONCEALMENT
   1534     | CAPF_SBR_DRC
   1535       ;
   1536   /* End of flags */
   1537 
   1538   return 0;
   1539 }
   1540 
   1541