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 - 2013 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 2
    140 #define SBRDECODER_LIB_VL2 6
    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 > 48000
    221      )
    222   {
    223     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    224     goto bail;
    225   }
    226 
    227   if ( sampleRateOut > 96000 )
    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     self->flags |=  SBRDEC_DOWNSAMPLE;
    255   } else {
    256     synDownsampleFac = 1;
    257     self->flags &= ~SBRDEC_DOWNSAMPLE;
    258   }
    259 
    260   self->synDownsampleFac = synDownsampleFac;
    261   self->sampleRateOut = sampleRateOut;
    262 
    263   {
    264     int i;
    265 
    266     for (i = 0; i < (1)+1; i++)
    267     {
    268       hSbrHeader = &(self->sbrHeader[elementIndex][i]);
    269 
    270       /* init a default header such that we can at least do upsampling later */
    271       sbrError = initHeaderData(
    272               hSbrHeader,
    273               sampleRateIn,
    274               sampleRateOut,
    275               samplesPerFrame,
    276               self->flags
    277               );
    278     }
    279   }
    280 
    281   if (sbrError != SBRDEC_OK) {
    282     goto bail;
    283   }
    284 
    285   /* Init SBR channels going to be assigned to a SBR element */
    286   {
    287     int ch;
    288 
    289     for (ch=0; ch<self->pSbrElement[elementIndex]->nChannels; ch++)
    290     {
    291       /* and create sbrDec */
    292       sbrError = createSbrDec (self->pSbrElement[elementIndex]->pSbrChannel[ch],
    293                           hSbrHeader,
    294                          &self->pSbrElement[elementIndex]->transposerSettings,
    295                           synDownsampleFac,
    296                           qmfFlags,
    297                           self->flags,
    298                           overlap,
    299                           ch );
    300 
    301       if (sbrError != SBRDEC_OK) {
    302         goto bail;
    303       }
    304     }
    305   }
    306 
    307   //FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer));
    308 
    309   if (self->numSbrElements == 1) {
    310     switch ( self->coreCodec ) {
    311     case AOT_AAC_LC:
    312     case AOT_SBR:
    313     case AOT_PS:
    314     case AOT_ER_AAC_SCAL:
    315     case AOT_DRM_AAC:
    316     case AOT_DRM_SURROUND:
    317       if (CreatePsDec ( &self->hParametricStereoDec, samplesPerFrame )) {
    318         sbrError = SBRDEC_CREATE_ERROR;
    319         goto bail;
    320       }
    321       break;
    322     default:
    323       break;
    324     }
    325   }
    326 
    327   /* Init frame delay slot handling */
    328   self->pSbrElement[elementIndex]->useFrameSlot = 0;
    329   for (i = 0; i < ((1)+1); i++) {
    330     self->pSbrElement[elementIndex]->useHeaderSlot[i] = i;
    331   }
    332 
    333 bail:
    334 
    335   return sbrError;
    336 }
    337 
    338 
    339 SBR_ERROR sbrDecoder_Open ( HANDLE_SBRDECODER  * pSelf )
    340 {
    341   HANDLE_SBRDECODER    self = NULL;
    342   SBR_ERROR sbrError = SBRDEC_OK;
    343 
    344   /* Get memory for this instance */
    345   self = GetRam_SbrDecoder();
    346   if (self == NULL) {
    347     sbrError = SBRDEC_MEM_ALLOC_FAILED;
    348     goto bail;
    349   }
    350 
    351   self->workBuffer1 = GetRam_SbrDecWorkBuffer1();
    352   self->workBuffer2 = GetRam_SbrDecWorkBuffer2();
    353 
    354   if (  self->workBuffer1 == NULL
    355      || self->workBuffer2 == NULL )
    356   {
    357     sbrError = SBRDEC_MEM_ALLOC_FAILED;
    358     goto bail;
    359   }
    360 
    361   /*
    362   Already zero because of calloc
    363   self->numSbrElements = 0;
    364   self->numSbrChannels = 0;
    365   self->codecFrameSize = 0;
    366   */
    367 
    368   self->numDelayFrames = (1);  /* set to the max value by default */
    369 
    370   *pSelf = self;
    371 
    372 bail:
    373   return sbrError;
    374 }
    375 
    376 /**
    377  * \brief determine if the given core codec AOT can be processed or not.
    378  * \param coreCodec core codec audio object type.
    379  * \return 1 if SBR can be processed, 0 if SBR cannot be processed/applied.
    380  */
    381 static
    382 int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec)
    383 {
    384   switch (coreCodec) {
    385     case AOT_AAC_LC:
    386     case AOT_SBR:
    387     case AOT_PS:
    388     case AOT_ER_AAC_SCAL:
    389     case AOT_ER_AAC_ELD:
    390       return 1;
    391     default:
    392       return 0;
    393   }
    394 }
    395 
    396 static
    397 void sbrDecoder_DestroyElement (
    398         HANDLE_SBRDECODER       self,
    399         const int               elementIndex
    400         )
    401 {
    402   if (self->pSbrElement[elementIndex] != NULL) {
    403     int ch;
    404 
    405     for (ch=0; ch<SBRDEC_MAX_CH_PER_ELEMENT; ch++) {
    406       if (self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) {
    407         deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    408         FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    409         self->numSbrChannels -= 1;
    410       }
    411     }
    412     FreeRam_SbrDecElement( &self->pSbrElement[elementIndex] );
    413     self->numSbrElements -= 1;
    414   }
    415 }
    416 
    417 
    418 SBR_ERROR sbrDecoder_InitElement (
    419         HANDLE_SBRDECODER       self,
    420         const int               sampleRateIn,
    421         const int               sampleRateOut,
    422         const int               samplesPerFrame,
    423         const AUDIO_OBJECT_TYPE coreCodec,
    424         const MP4_ELEMENT_ID    elementID,
    425         const int               elementIndex
    426         )
    427 {
    428   SBR_ERROR sbrError = SBRDEC_OK;
    429   int chCnt=0;
    430   int nSbrElementsStart = self->numSbrElements;
    431 
    432   /* Check core codec AOT */
    433   if (! sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (8)) {
    434     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    435     goto bail;
    436   }
    437 
    438   if ( elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE )
    439   {
    440     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    441     goto bail;
    442   }
    443 
    444   if (  self->sampleRateIn == sampleRateIn
    445      && self->codecFrameSize == samplesPerFrame
    446      && self->coreCodec == coreCodec
    447      && self->pSbrElement[elementIndex] != NULL
    448      && self->pSbrElement[elementIndex]->elementID == elementID
    449      && !(self->flags & SBRDEC_FORCE_RESET)
    450      )
    451   {
    452      /* Nothing to do */
    453      return SBRDEC_OK;
    454   }
    455 
    456   self->sampleRateIn = sampleRateIn;
    457   self->codecFrameSize = samplesPerFrame;
    458   self->coreCodec = coreCodec;
    459 
    460   self->flags = 0;
    461   self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0;
    462 
    463   /* Init SBR elements */
    464   {
    465     int elChannels, ch;
    466 
    467     if (self->pSbrElement[elementIndex] == NULL) {
    468       self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex);
    469       if (self->pSbrElement[elementIndex] == NULL) {
    470         sbrError = SBRDEC_MEM_ALLOC_FAILED;
    471         goto bail;
    472       }
    473       self->numSbrElements ++;
    474     } else {
    475       self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels;
    476     }
    477 
    478     /* Save element ID for sanity checks and to have a fallback for concealment. */
    479     self->pSbrElement[elementIndex]->elementID = elementID;
    480 
    481     /* Determine amount of channels for this element */
    482     switch (elementID) {
    483       case ID_NONE:
    484       case ID_CPE: elChannels=2;
    485         break;
    486       case ID_LFE:
    487       case ID_SCE: elChannels=1;
    488         break;
    489       default: elChannels=0;
    490         break;
    491     }
    492 
    493     /* Handle case of Parametric Stereo */
    494     if ( elementIndex == 0 && elementID == ID_SCE ) {
    495       switch (coreCodec) {
    496         case AOT_AAC_LC:
    497         case AOT_SBR:
    498         case AOT_PS:
    499         case AOT_ER_AAC_SCAL:
    500         case AOT_DRM_AAC:
    501         case AOT_DRM_SURROUND:
    502           elChannels = 2;
    503           break;
    504         default:
    505           break;
    506       }
    507     }
    508 
    509     self->pSbrElement[elementIndex]->nChannels = elChannels;
    510 
    511     for (ch=0; ch<elChannels; ch++)
    512     {
    513       if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
    514         self->pSbrElement[elementIndex]->pSbrChannel[ch] = GetRam_SbrDecChannel(chCnt);
    515         if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
    516           sbrError = SBRDEC_MEM_ALLOC_FAILED;
    517           goto bail;
    518         }
    519       }
    520       self->numSbrChannels ++;
    521 
    522       sbrDecoder_drcInitChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.sbrDrcChannel );
    523 
    524       /* Add reference pointer to workbuffers. */
    525       self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer1 = self->workBuffer1;
    526       self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer2 = self->workBuffer2;
    527       chCnt++;
    528     }
    529     if (elChannels == 1 && self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) {
    530       deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    531       FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] );
    532     }
    533   }
    534 
    535   /* clear error flags for all delay slots */
    536   FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, ((1)+1)*sizeof(UCHAR));
    537 
    538   /* Initialize this instance */
    539   sbrError = sbrDecoder_ResetElement(
    540           self,
    541           sampleRateIn,
    542           sampleRateOut,
    543           samplesPerFrame,
    544           elementID,
    545           elementIndex,
    546           (coreCodec == AOT_ER_AAC_ELD) ? 0 : (6)
    547           );
    548 
    549 
    550 
    551 bail:
    552   if (sbrError != SBRDEC_OK) {
    553     if (nSbrElementsStart < self->numSbrElements) {
    554       /* Free the memory allocated for this element */
    555       sbrDecoder_DestroyElement( self, elementIndex );
    556     } else if ( (self->pSbrElement[elementIndex] != NULL)
    557              && (elementIndex < (8)))
    558     { /* Set error flag to trigger concealment */
    559       self->pSbrElement[elementIndex]->frameErrorFlag[self->pSbrElement[elementIndex]->useFrameSlot] = 1;
    560     }
    561   }
    562 
    563   return sbrError;
    564 }
    565 
    566 /**
    567  * \brief Apply decoded SBR header for one element.
    568  * \param self SBR decoder instance handle
    569  * \param hSbrHeader SBR header handle to be processed.
    570  * \param hSbrChannel pointer array to the SBR element channels corresponding to the SBR header.
    571  * \param headerStatus header status value returned from SBR header parser.
    572  * \param numElementChannels amount of channels for the SBR element whos header is to be processed.
    573  */
    574 static
    575 SBR_ERROR sbrDecoder_HeaderUpdate(
    576         HANDLE_SBRDECODER self,
    577         HANDLE_SBR_HEADER_DATA hSbrHeader,
    578         SBR_HEADER_STATUS headerStatus,
    579         HANDLE_SBR_CHANNEL hSbrChannel[],
    580         const int numElementChannels
    581         )
    582 {
    583   SBR_ERROR errorStatus = SBRDEC_OK;
    584 
    585   /*
    586     change of control data, reset decoder
    587   */
    588   errorStatus = resetFreqBandTables(hSbrHeader, self->flags);
    589 
    590   if (errorStatus == SBRDEC_OK) {
    591     if (hSbrHeader->syncState == UPSAMPLING && headerStatus != HEADER_RESET)
    592     {
    593       /* As the default header would limit the frequency range,
    594          lowSubband and highSubband must be patched. */
    595       hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands;
    596       hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands;
    597     }
    598 
    599     /* Trigger a reset before processing this slot */
    600     hSbrHeader->status |= SBRDEC_HDR_STAT_RESET;
    601   }
    602 
    603   return errorStatus;
    604 }
    605 
    606 INT sbrDecoder_Header (
    607         HANDLE_SBRDECODER       self,
    608         HANDLE_FDK_BITSTREAM    hBs,
    609         const INT sampleRateIn,
    610         const INT sampleRateOut,
    611         const INT samplesPerFrame,
    612         const AUDIO_OBJECT_TYPE coreCodec,
    613         const MP4_ELEMENT_ID    elementID,
    614         const INT               elementIndex
    615         )
    616 {
    617   SBR_HEADER_STATUS headerStatus;
    618   HANDLE_SBR_HEADER_DATA hSbrHeader;
    619   SBR_ERROR sbrError = SBRDEC_OK;
    620   int headerIndex;
    621 
    622   if ( self == NULL || elementIndex > (8) )
    623   {
    624     return SBRDEC_UNSUPPORTED_CONFIG;
    625   }
    626 
    627   if (! sbrDecoder_isCoreCodecValid(coreCodec)) {
    628     return SBRDEC_UNSUPPORTED_CONFIG;
    629   }
    630 
    631   sbrError = sbrDecoder_InitElement(
    632           self,
    633           sampleRateIn,
    634           sampleRateOut,
    635           samplesPerFrame,
    636           coreCodec,
    637           elementID,
    638           elementIndex
    639           );
    640 
    641   if (sbrError != SBRDEC_OK) {
    642     goto bail;
    643   }
    644 
    645   headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
    646                               self->pSbrElement[elementIndex]->useHeaderSlot);
    647   hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]);
    648 
    649   headerStatus = sbrGetHeaderData ( hSbrHeader,
    650                                     hBs,
    651                                     self->flags,
    652                                     0);
    653 
    654 
    655   {
    656     SBR_DECODER_ELEMENT *pSbrElement;
    657 
    658     pSbrElement = self->pSbrElement[elementIndex];
    659 
    660     /* Sanity check */
    661     if (pSbrElement != NULL) {
    662       if ( (elementID == ID_CPE && pSbrElement->nChannels != 2)
    663         || (elementID != ID_CPE && pSbrElement->nChannels != 1) )
    664       {
    665         return SBRDEC_UNSUPPORTED_CONFIG;
    666       }
    667       if ( headerStatus == HEADER_RESET ) {
    668 
    669         sbrError = sbrDecoder_HeaderUpdate(
    670               self,
    671               hSbrHeader,
    672               headerStatus,
    673               pSbrElement->pSbrChannel,
    674               pSbrElement->nChannels
    675               );
    676 
    677         if (sbrError == SBRDEC_OK) {
    678           hSbrHeader->syncState = SBR_HEADER;
    679           hSbrHeader->status   |= SBRDEC_HDR_STAT_UPDATE;
    680         }
    681         /* else {
    682           Since we already have overwritten the old SBR header the only way out is UPSAMPLING!
    683           This will be prepared in the next step.
    684         } */
    685       }
    686     }
    687   }
    688 bail:
    689   return sbrError;
    690 }
    691 
    692 
    693 SBR_ERROR sbrDecoder_SetParam (HANDLE_SBRDECODER   self,
    694                                const SBRDEC_PARAM  param,
    695                                const INT           value )
    696 {
    697   SBR_ERROR errorStatus = SBRDEC_OK;
    698 
    699   /* configure the subsystems */
    700   switch (param)
    701   {
    702   case SBR_SYSTEM_BITSTREAM_DELAY:
    703     if (value < 0 || value > (1)) {
    704       errorStatus = SBRDEC_SET_PARAM_FAIL;
    705       break;
    706     }
    707     if (self == NULL) {
    708       errorStatus = SBRDEC_NOT_INITIALIZED;
    709     } else {
    710       self->numDelayFrames = (UCHAR)value;
    711     }
    712     break;
    713   case SBR_QMF_MODE:
    714     if (self == NULL) {
    715       errorStatus = SBRDEC_NOT_INITIALIZED;
    716     } else {
    717       if (value == 1) {
    718         self->flags |= SBRDEC_LOW_POWER;
    719       } else {
    720         self->flags &= ~SBRDEC_LOW_POWER;
    721       }
    722     }
    723     break;
    724   case SBR_LD_QMF_TIME_ALIGN:
    725     if (self == NULL) {
    726       errorStatus = SBRDEC_NOT_INITIALIZED;
    727     } else {
    728       if (value == 1) {
    729         self->flags |= SBRDEC_LD_MPS_QMF;
    730       } else {
    731         self->flags &= ~SBRDEC_LD_MPS_QMF;
    732       }
    733     }
    734     break;
    735   case SBR_FLUSH_DATA:
    736     if (value != 0) {
    737       if (self == NULL) {
    738         errorStatus = SBRDEC_NOT_INITIALIZED;
    739       } else {
    740         self->flags |= SBRDEC_FLUSH;
    741       }
    742     }
    743     break;
    744   case SBR_CLEAR_HISTORY:
    745     if (value != 0) {
    746       if (self == NULL) {
    747         errorStatus = SBRDEC_NOT_INITIALIZED;
    748       } else {
    749         self->flags |= SBRDEC_FORCE_RESET;
    750       }
    751     }
    752     break;
    753   case SBR_BS_INTERRUPTION:
    754     {
    755       int elementIndex;
    756 
    757       if (self == NULL) {
    758         errorStatus = SBRDEC_NOT_INITIALIZED;
    759         break;
    760       }
    761 
    762       /* Loop over SBR elements */
    763       for (elementIndex = 0; elementIndex < self->numSbrElements; elementIndex++) {
    764       if (self->pSbrElement[elementIndex] != NULL)
    765       {
    766         HANDLE_SBR_HEADER_DATA hSbrHeader;
    767         int headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
    768                                         self->pSbrElement[elementIndex]->useHeaderSlot);
    769 
    770         hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]);
    771 
    772         /* Set sync state UPSAMPLING for the corresponding slot.
    773            This switches off bitstream parsing until a new header arrives. */
    774         hSbrHeader->syncState = UPSAMPLING;
    775         hSbrHeader->status   |= SBRDEC_HDR_STAT_UPDATE;
    776       } }
    777     }
    778     break;
    779   default:
    780     errorStatus = SBRDEC_SET_PARAM_FAIL;
    781     break;
    782   }  /* switch(param) */
    783 
    784   return (errorStatus);
    785 }
    786 
    787 static
    788 SBRDEC_DRC_CHANNEL * sbrDecoder_drcGetChannel( const HANDLE_SBRDECODER self, const INT channel )
    789 {
    790   SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
    791   int elementIndex, elChanIdx=0, numCh=0;
    792 
    793   for (elementIndex = 0; (elementIndex < (8)) && (numCh <= channel); elementIndex++)
    794   {
    795     SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex];
    796     int c, elChannels;
    797 
    798     elChanIdx = 0;
    799     if (pSbrElement == NULL) break;
    800 
    801     /* Determine amount of channels for this element */
    802     switch (pSbrElement->elementID) {
    803       case ID_CPE: elChannels = 2;
    804         break;
    805       case ID_LFE:
    806       case ID_SCE: elChannels = 1;
    807         break;
    808       case ID_NONE:
    809       default: elChannels = 0;
    810         break;
    811     }
    812 
    813     /* Limit with actual allocated element channels */
    814     elChannels = FDKmin(elChannels, pSbrElement->nChannels);
    815 
    816     for (c = 0; (c < elChannels) && (numCh <= channel); c++) {
    817       if (pSbrElement->pSbrChannel[elChanIdx] != NULL) {
    818         numCh++;
    819         elChanIdx++;
    820       }
    821     }
    822   }
    823   elementIndex -= 1;
    824   elChanIdx -= 1;
    825 
    826   if (elChanIdx < 0 || elementIndex < 0) {
    827     return NULL;
    828   }
    829 
    830   if ( self->pSbrElement[elementIndex] != NULL ) {
    831     if ( self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL )
    832     {
    833       pSbrDrcChannelData = &self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx]->SbrDec.sbrDrcChannel;
    834     }
    835   }
    836 
    837   return (pSbrDrcChannelData);
    838 }
    839 
    840 SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER  self,
    841                                       INT                ch,
    842                                       UINT               numBands,
    843                                       FIXP_DBL          *pNextFact_mag,
    844                                       INT                nextFact_exp,
    845                                       SHORT              drcInterpolationScheme,
    846                                       UCHAR              winSequence,
    847                                       USHORT            *pBandTop )
    848 {
    849   SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
    850   int band, isValidData = 0;
    851 
    852   if (self == NULL) {
    853     return SBRDEC_NOT_INITIALIZED;
    854   }
    855   if (ch > (8) || pNextFact_mag == NULL) {
    856     return SBRDEC_SET_PARAM_FAIL;
    857   }
    858 
    859   /* Search for gain values different to 1.0f */
    860   for (band = 0; band < numBands; band += 1) {
    861     if ( !((pNextFact_mag[band] == FL2FXCONST_DBL(0.5))  && (nextFact_exp == 1))
    862       && !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && (nextFact_exp == 0)) ) {
    863       isValidData = 1;
    864       break;
    865     }
    866   }
    867 
    868   /* Find the right SBR channel */
    869   pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch );
    870 
    871   if ( pSbrDrcChannelData != NULL ) {
    872     if ( pSbrDrcChannelData->enable || isValidData )
    873   { /* Activate processing only with real and valid data */
    874     int i;
    875 
    876     pSbrDrcChannelData->enable   = 1;
    877     pSbrDrcChannelData->numBandsNext = numBands;
    878 
    879     pSbrDrcChannelData->winSequenceNext            = winSequence;
    880     pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme;
    881     pSbrDrcChannelData->nextFact_exp               = nextFact_exp;
    882 
    883     for (i = 0; i < (int)numBands; i++) {
    884       pSbrDrcChannelData->bandTopNext[i]  = pBandTop[i];
    885       pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i];
    886     }
    887   }
    888   }
    889 
    890   return SBRDEC_OK;
    891 }
    892 
    893 
    894 void sbrDecoder_drcDisable ( HANDLE_SBRDECODER  self,
    895                              INT                ch )
    896 {
    897   SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
    898 
    899   if ( (self == NULL)
    900     || (ch > (8))
    901     || (self->numSbrElements == 0)
    902     || (self->numSbrChannels == 0) ) {
    903     return;
    904   }
    905 
    906   /* Find the right SBR channel */
    907   pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch );
    908 
    909   if ( pSbrDrcChannelData != NULL ) {
    910     sbrDecoder_drcInitChannel( pSbrDrcChannelData );
    911   }
    912 }
    913 
    914 
    915 
    916 SBR_ERROR sbrDecoder_Parse(
    917         HANDLE_SBRDECODER self,
    918         HANDLE_FDK_BITSTREAM  hBs,
    919         int *count,
    920         int  bsPayLen,
    921         int  crcFlag,
    922         MP4_ELEMENT_ID prevElement,
    923         int elementIndex,
    924         int fGlobalIndependencyFlag
    925         )
    926 {
    927   SBR_DECODER_ELEMENT   *hSbrElement;
    928   HANDLE_SBR_HEADER_DATA hSbrHeader;
    929   HANDLE_SBR_CHANNEL    *pSbrChannel;
    930 
    931   SBR_FRAME_DATA *hFrameDataLeft;
    932   SBR_FRAME_DATA *hFrameDataRight;
    933 
    934   SBR_ERROR errorStatus = SBRDEC_OK;
    935   SBR_SYNC_STATE initialSyncState;
    936   SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT;
    937 
    938   INT  startPos;
    939   INT  CRCLen = 0;
    940 
    941   int  stereo;
    942   int  fDoDecodeSbrData = 1;
    943 
    944   int lastSlot, lastHdrSlot = 0, thisHdrSlot;
    945 
    946   /* Remember start position of  SBR element */
    947   startPos = FDKgetValidBits(hBs);
    948 
    949   /* SBR sanity checks */
    950   if ( self == NULL || self->pSbrElement[elementIndex] == NULL ) {
    951     errorStatus = SBRDEC_NOT_INITIALIZED;
    952     goto bail;
    953   }
    954 
    955   hSbrElement = self->pSbrElement[elementIndex];
    956 
    957   lastSlot    = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot-1 : self->numDelayFrames;
    958   lastHdrSlot =  hSbrElement->useHeaderSlot[lastSlot];
    959   thisHdrSlot =  getHeaderSlot( hSbrElement->useFrameSlot, hSbrElement->useHeaderSlot );  /* Get a free header slot not used by frames not processed yet. */
    960 
    961   /* Assign the free slot to store a new header if there is one. */
    962   hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot];
    963 
    964   pSbrChannel = hSbrElement->pSbrChannel;
    965   stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
    966 
    967   hFrameDataLeft  = &self->pSbrElement[elementIndex]->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
    968   hFrameDataRight = &self->pSbrElement[elementIndex]->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
    969 
    970   initialSyncState = hSbrHeader->syncState;
    971 
    972   /* reset PS flag; will be set after PS was found */
    973   self->flags &= ~SBRDEC_PS_DECODED;
    974 
    975   if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) {
    976     /* Got a new header from extern (e.g. from an ASC) */
    977     headerStatus = HEADER_OK;
    978     hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE;
    979   }
    980   else if (thisHdrSlot != lastHdrSlot) {
    981     /* Copy the last header into this slot otherwise the
    982        header compare will trigger more HEADER_RESETs than needed. */
    983     copySbrHeader( hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot] );
    984   }
    985 
    986   /*
    987      Check if bit stream data is valid and matches the element context
    988   */
    989   if ( ((prevElement != ID_SCE) && (prevElement != ID_CPE)) || prevElement != hSbrElement->elementID) {
    990     /* In case of LFE we also land here, since there is no LFE SBR element (do upsampling only) */
    991     fDoDecodeSbrData = 0;
    992   }
    993 
    994   if (fDoDecodeSbrData)
    995   {
    996     if ((INT)FDKgetValidBits(hBs) <= 0) {
    997       fDoDecodeSbrData = 0;
    998     }
    999   }
   1000 
   1001   /*
   1002      SBR CRC-check
   1003   */
   1004   if (fDoDecodeSbrData)
   1005   {
   1006     if (crcFlag == 1) {
   1007       switch (self->coreCodec) {
   1008       case AOT_ER_AAC_ELD:
   1009         FDKpushFor (hBs, 10);
   1010         /* check sbrcrc later: we don't know the payload length now */
   1011         break;
   1012       default:
   1013         CRCLen = bsPayLen - 10;                     /* change: 0 => i */
   1014         if (CRCLen < 0) {
   1015           fDoDecodeSbrData = 0;
   1016         } else {
   1017           fDoDecodeSbrData = SbrCrcCheck (hBs, CRCLen);
   1018         }
   1019         break;
   1020       }
   1021     }
   1022   } /* if (fDoDecodeSbrData) */
   1023 
   1024   /*
   1025      Read in the header data and issue a reset if change occured
   1026   */
   1027   if (fDoDecodeSbrData)
   1028   {
   1029     int sbrHeaderPresent;
   1030 
   1031     {
   1032       sbrHeaderPresent = FDKreadBit(hBs);
   1033     }
   1034 
   1035     if ( sbrHeaderPresent ) {
   1036       headerStatus = sbrGetHeaderData (hSbrHeader,
   1037                                        hBs,
   1038                                        self->flags,
   1039                                        1);
   1040     }
   1041 
   1042     if (headerStatus == HEADER_RESET)
   1043     {
   1044       errorStatus = sbrDecoder_HeaderUpdate(
   1045             self,
   1046             hSbrHeader,
   1047             headerStatus,
   1048             pSbrChannel,
   1049             hSbrElement->nChannels
   1050             );
   1051 
   1052       if (errorStatus == SBRDEC_OK) {
   1053         hSbrHeader->syncState = SBR_HEADER;
   1054       } else {
   1055         hSbrHeader->syncState = SBR_NOT_INITIALIZED;
   1056       }
   1057     }
   1058 
   1059     if (errorStatus != SBRDEC_OK) {
   1060       fDoDecodeSbrData = 0;
   1061     }
   1062   } /* if (fDoDecodeSbrData) */
   1063 
   1064   /*
   1065     Print debugging output only if state has changed
   1066   */
   1067 
   1068   /* read frame data */
   1069   if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) {
   1070     int sbrFrameOk;
   1071     /* read the SBR element data */
   1072     if (stereo) {
   1073       sbrFrameOk = sbrGetChannelPairElement(hSbrHeader,
   1074                                             hFrameDataLeft,
   1075                                             hFrameDataRight,
   1076                                             hBs,
   1077                                             self->flags,
   1078                                             self->pSbrElement[elementIndex]->transposerSettings.overlap);
   1079     }
   1080     else {
   1081       if (self->hParametricStereoDec != NULL) {
   1082         /* update slot index for PS bitstream parsing */
   1083         self->hParametricStereoDec->bsLastSlot = self->hParametricStereoDec->bsReadSlot;
   1084         self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot;
   1085       }
   1086       sbrFrameOk = sbrGetSingleChannelElement(hSbrHeader,
   1087                                               hFrameDataLeft,
   1088                                               hBs,
   1089                                               self->hParametricStereoDec,
   1090                                               self->flags,
   1091                                               self->pSbrElement[elementIndex]->transposerSettings.overlap);
   1092     }
   1093     if (!sbrFrameOk) {
   1094       fDoDecodeSbrData = 0;
   1095     }
   1096     else {
   1097       INT valBits;
   1098 
   1099       if (bsPayLen > 0) {
   1100         valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs));
   1101       } else {
   1102         valBits = (INT)FDKgetValidBits(hBs);
   1103       }
   1104 
   1105       if ( crcFlag == 1 ) {
   1106         switch (self->coreCodec) {
   1107         case AOT_ER_AAC_ELD:
   1108           {
   1109             /* late crc check for eld */
   1110             INT payloadbits = (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos;
   1111             INT crcLen      = payloadbits - 10;
   1112             FDKpushBack(hBs, payloadbits);
   1113             fDoDecodeSbrData      = SbrCrcCheck (hBs, crcLen);
   1114             FDKpushFor(hBs, crcLen);
   1115           }
   1116           break;
   1117         default:
   1118           break;
   1119         }
   1120       }
   1121 
   1122       /* sanity check of remaining bits */
   1123       if (valBits < 0) {
   1124         fDoDecodeSbrData = 0;
   1125       } else {
   1126         switch (self->coreCodec) {
   1127         case AOT_SBR:
   1128         case AOT_PS:
   1129         case AOT_AAC_LC:
   1130           {
   1131             /* This sanity check is only meaningful with General Audio bitstreams */
   1132             int alignBits = valBits & 0x7;
   1133 
   1134             if (valBits > alignBits) {
   1135               fDoDecodeSbrData = 0;
   1136             }
   1137           }
   1138           break;
   1139         default:
   1140           /* No sanity check available */
   1141           break;
   1142         }
   1143       }
   1144     }
   1145   } else {
   1146     /* The returned bit count will not be the actual payload size since we did not
   1147        parse the frame data. Return an error so that the caller can react respectively. */
   1148     errorStatus = SBRDEC_PARSE_ERROR;
   1149   }
   1150 
   1151   if (!fDoDecodeSbrData) {
   1152     /* Set error flag for this slot to trigger concealment */
   1153     self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 1;
   1154     errorStatus = SBRDEC_PARSE_ERROR;
   1155   } else {
   1156     /* Everything seems to be ok so clear the error flag */
   1157     self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 0;
   1158   }
   1159 
   1160   if (!stereo) {
   1161     /* Turn coupling off explicitely to avoid access to absent right frame data
   1162        that might occur with corrupt bitstreams. */
   1163     hFrameDataLeft->coupling = COUPLING_OFF;
   1164   }
   1165 
   1166 bail:
   1167   if (errorStatus == SBRDEC_OK) {
   1168     if (headerStatus == HEADER_NOT_PRESENT) {
   1169       /* Use the old header for this frame */
   1170       hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot;
   1171     } else {
   1172       /* Use the new header for this frame */
   1173       hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot;
   1174     }
   1175 
   1176     /* Move frame pointer to the next slot which is up to be decoded/applied next */
   1177     hSbrElement->useFrameSlot = (hSbrElement->useFrameSlot+1) % (self->numDelayFrames+1);
   1178   }
   1179 
   1180   *count -= startPos - FDKgetValidBits(hBs);
   1181 
   1182   return errorStatus;
   1183 }
   1184 
   1185 
   1186 /**
   1187  * \brief Render one SBR element into time domain signal.
   1188  * \param self SBR decoder handle
   1189  * \param timeData pointer to output buffer
   1190  * \param interleaved flag indicating interleaved channel output
   1191  * \param channelMapping pointer to UCHAR array where next 2 channel offsets are stored.
   1192  * \param elementIndex enumerating index of the SBR element to render.
   1193  * \param numInChannels number of channels from core coder (reading stride).
   1194  * \param numOutChannels pointer to a location to return number of output channels.
   1195  * \param psPossible flag indicating if PS is possible or not.
   1196  * \return SBRDEC_OK if successfull, else error code
   1197  */
   1198 static SBR_ERROR
   1199 sbrDecoder_DecodeElement (
   1200         HANDLE_SBRDECODER    self,
   1201         INT_PCM             *timeData,
   1202         const int            interleaved,
   1203         const UCHAR         *channelMapping,
   1204         const int            elementIndex,
   1205         const int            numInChannels,
   1206         int                 *numOutChannels,
   1207         const int            psPossible
   1208         )
   1209 {
   1210   SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex];
   1211   HANDLE_SBR_CHANNEL    *pSbrChannel = self->pSbrElement[elementIndex]->pSbrChannel;
   1212   HANDLE_SBR_HEADER_DATA hSbrHeader = &self->sbrHeader[elementIndex][hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]];
   1213   HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec;
   1214 
   1215   /* get memory for frame data from scratch */
   1216   SBR_FRAME_DATA *hFrameDataLeft  = &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
   1217   SBR_FRAME_DATA *hFrameDataRight = &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
   1218 
   1219   SBR_ERROR errorStatus = SBRDEC_OK;
   1220 
   1221 
   1222   INT  strideIn, strideOut, offset0, offset1;
   1223   INT  codecFrameSize = self->codecFrameSize;
   1224 
   1225   int  stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
   1226   int  numElementChannels = hSbrElement->nChannels; /* Number of channels of the current SBR element */
   1227 
   1228   if (self->flags & SBRDEC_FLUSH) {
   1229     /* Move frame pointer to the next slot which is up to be decoded/applied next */
   1230     hSbrElement->useFrameSlot = (hSbrElement->useFrameSlot+1) % (self->numDelayFrames+1);
   1231     /* Update header and frame data pointer because they have already been set */
   1232     hSbrHeader = &self->sbrHeader[elementIndex][hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]];
   1233     hFrameDataLeft  = &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
   1234     hFrameDataRight = &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
   1235   }
   1236 
   1237   /* Update the header error flag */
   1238   hSbrHeader->frameErrorFlag = hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot];
   1239 
   1240   /*
   1241      Prepare filterbank for upsampling if no valid bit stream data is available.
   1242    */
   1243   if ( hSbrHeader->syncState == SBR_NOT_INITIALIZED )
   1244   {
   1245     errorStatus = initHeaderData(
   1246             hSbrHeader,
   1247             self->sampleRateIn,
   1248             self->sampleRateOut,
   1249             codecFrameSize,
   1250             self->flags
   1251             );
   1252 
   1253     if (errorStatus != SBRDEC_OK) {
   1254       return errorStatus;
   1255     }
   1256 
   1257     hSbrHeader->syncState = UPSAMPLING;
   1258 
   1259     errorStatus = sbrDecoder_HeaderUpdate(
   1260             self,
   1261             hSbrHeader,
   1262             HEADER_NOT_PRESENT,
   1263             pSbrChannel,
   1264             hSbrElement->nChannels
   1265             );
   1266 
   1267     if (errorStatus != SBRDEC_OK) {
   1268       hSbrHeader->syncState = SBR_NOT_INITIALIZED;
   1269       return errorStatus;
   1270     }
   1271   }
   1272 
   1273   /* reset */
   1274   if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) {
   1275     int ch;
   1276     for (ch = 0 ; ch < numElementChannels; ch++) {
   1277       SBR_ERROR errorStatusTmp = SBRDEC_OK;
   1278 
   1279       errorStatusTmp = resetSbrDec (
   1280              &pSbrChannel[ch]->SbrDec,
   1281               hSbrHeader,
   1282              &pSbrChannel[ch]->prevFrameData,
   1283               self->flags & SBRDEC_LOW_POWER,
   1284               self->synDownsampleFac
   1285               );
   1286 
   1287       if (errorStatusTmp != SBRDEC_OK) {
   1288         errorStatus = errorStatusTmp;
   1289       }
   1290     }
   1291     hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET;
   1292   }
   1293 
   1294   /* decoding */
   1295   if ( (hSbrHeader->syncState == SBR_ACTIVE)
   1296     || ((hSbrHeader->syncState == SBR_HEADER) && (hSbrHeader->frameErrorFlag == 0)) )
   1297   {
   1298     errorStatus = SBRDEC_OK;
   1299 
   1300     decodeSbrData (hSbrHeader,
   1301                    hFrameDataLeft,
   1302                   &pSbrChannel[0]->prevFrameData,
   1303                    (stereo) ? hFrameDataRight : NULL,
   1304                    (stereo) ? &pSbrChannel[1]->prevFrameData : NULL);
   1305 
   1306 
   1307     /* Now we have a full parameter set and can do parameter
   1308        based concealment instead of plain upsampling. */
   1309     hSbrHeader->syncState = SBR_ACTIVE;
   1310   }
   1311 
   1312   /* decode PS data if available */
   1313   if (h_ps_d != NULL && psPossible) {
   1314     int applyPs = 1;
   1315 
   1316     /* define which frame delay line slot to process */
   1317     h_ps_d->processSlot = hSbrElement->useFrameSlot;
   1318 
   1319     applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag);
   1320     self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0;
   1321   }
   1322 
   1323   /* Set strides for reading and writing */
   1324   if (interleaved) {
   1325     strideIn = numInChannels;
   1326     if ( psPossible )
   1327       strideOut = (numInChannels < 2) ? 2 : numInChannels;
   1328     else
   1329       strideOut = numInChannels;
   1330     offset0 = channelMapping[0];
   1331     offset1 = channelMapping[1];
   1332   } else {
   1333     strideIn  = 1;
   1334     strideOut = 1;
   1335     offset0 = channelMapping[0]*2*codecFrameSize;
   1336     offset1 = channelMapping[1]*2*codecFrameSize;
   1337   }
   1338 
   1339   /* use same buffers for left and right channel and apply PS per timeslot */
   1340   /* Process left channel */
   1341 //FDKprintf("self->codecFrameSize %d\t%d\n",self->codecFrameSize,self->sampleRateIn);
   1342   sbr_dec (&pSbrChannel[0]->SbrDec,
   1343             timeData + offset0,
   1344             timeData + offset0,
   1345            &pSbrChannel[1]->SbrDec,
   1346             timeData + offset1,
   1347             strideIn,
   1348             strideOut,
   1349             hSbrHeader,
   1350             hFrameDataLeft,
   1351            &pSbrChannel[0]->prevFrameData,
   1352             (hSbrHeader->syncState == SBR_ACTIVE),
   1353             h_ps_d,
   1354             self->flags
   1355           );
   1356 
   1357   if (stereo) {
   1358     /* Process right channel */
   1359     sbr_dec (&pSbrChannel[1]->SbrDec,
   1360               timeData + offset1,
   1361               timeData + offset1,
   1362               NULL,
   1363               NULL,
   1364               strideIn,
   1365               strideOut,
   1366               hSbrHeader,
   1367               hFrameDataRight,
   1368              &pSbrChannel[1]->prevFrameData,
   1369               (hSbrHeader->syncState == SBR_ACTIVE),
   1370               NULL,
   1371               self->flags
   1372             );
   1373   }
   1374 
   1375   if (h_ps_d != NULL) {
   1376     /* save PS status for next run */
   1377     h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0 ;
   1378   }
   1379 
   1380   if ( psPossible
   1381     )
   1382   {
   1383     FDK_ASSERT(strideOut > 1);
   1384     if ( !(self->flags & SBRDEC_PS_DECODED) ) {
   1385       /* A decoder which is able to decode PS has to produce a stereo output even if no PS data is availble. */
   1386       /* So copy left channel to right channel.                                                              */
   1387       if (interleaved) {
   1388         INT_PCM *ptr;
   1389         INT i;
   1390         FDK_ASSERT(strideOut == 2);
   1391 
   1392         ptr = timeData;
   1393         for (i = codecFrameSize; i--; )
   1394         {
   1395           INT_PCM tmp; /* This temporal variable is required because some compilers can't do *ptr++ = *ptr++ correctly. */
   1396           tmp = *ptr++; *ptr++ = tmp;
   1397           tmp = *ptr++; *ptr++ = tmp;
   1398         }
   1399       } else {
   1400         FDKmemcpy( timeData+2*codecFrameSize, timeData, 2*codecFrameSize*sizeof(INT_PCM) );
   1401       }
   1402     }
   1403     *numOutChannels = 2;  /* Output minimum two channels when PS is enabled. */
   1404   }
   1405 
   1406   return errorStatus;
   1407 }
   1408 
   1409 
   1410 SBR_ERROR sbrDecoder_Apply ( HANDLE_SBRDECODER   self,
   1411                              INT_PCM            *timeData,
   1412                              int                *numChannels,
   1413                              int                *sampleRate,
   1414                              const UCHAR         channelMapping[(8)],
   1415                              const int           interleaved,
   1416                              const int           coreDecodedOk,
   1417                              UCHAR              *psDecoded )
   1418 {
   1419   SBR_ERROR errorStatus = SBRDEC_OK;
   1420 
   1421   int   psPossible = 0;
   1422   int   sbrElementNum;
   1423   int   numCoreChannels = *numChannels;
   1424   int   numSbrChannels  = 0;
   1425 
   1426   psPossible = *psDecoded;
   1427 
   1428   if (self->numSbrElements < 1) {
   1429     /* exit immediately to avoid access violations */
   1430     return SBRDEC_CREATE_ERROR;
   1431   }
   1432 
   1433   /* Sanity check of allocated SBR elements. */
   1434   for (sbrElementNum=0; sbrElementNum<self->numSbrElements; sbrElementNum++) {
   1435     if (self->pSbrElement[sbrElementNum] == NULL) {
   1436       return SBRDEC_CREATE_ERROR;
   1437     }
   1438   }
   1439 
   1440   if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) {
   1441     psPossible = 0;
   1442   }
   1443 
   1444 
   1445   /* In case of non-interleaved time domain data and upsampling, make room for bigger SBR output. */
   1446   if (self->synDownsampleFac == 1 && interleaved == 0) {
   1447     int c, outputFrameSize;
   1448 
   1449     outputFrameSize =
   1450             self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_channels
   1451             * self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_col;
   1452 
   1453     for (c=numCoreChannels-1; c>0; c--) {
   1454       FDKmemmove(timeData + c*outputFrameSize, timeData + c*self->codecFrameSize , self->codecFrameSize*sizeof(INT_PCM));
   1455     }
   1456   }
   1457 
   1458 
   1459   /* Make sure that even if no SBR data was found/parsed *psDecoded is returned 1 if psPossible was 0. */
   1460   if (psPossible == 0) {
   1461     self->flags &= ~SBRDEC_PS_DECODED;
   1462   }
   1463 
   1464   /* Loop over SBR elements */
   1465   for (sbrElementNum = 0; sbrElementNum<self->numSbrElements; sbrElementNum++)
   1466   {
   1467     int numElementChan;
   1468 
   1469     if (psPossible && self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) {
   1470       errorStatus = SBRDEC_UNSUPPORTED_CONFIG;
   1471       goto bail;
   1472     }
   1473 
   1474     numElementChan = (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1;
   1475 
   1476     /* If core signal is bad then force upsampling */
   1477     if ( ! coreDecodedOk ) {
   1478       self->pSbrElement[sbrElementNum]->frameErrorFlag[self->pSbrElement[sbrElementNum]->useFrameSlot] = 1;
   1479     }
   1480 
   1481     errorStatus = sbrDecoder_DecodeElement (
   1482                                  self,
   1483                                  timeData,
   1484                                  interleaved,
   1485                                  channelMapping,
   1486                                  sbrElementNum,
   1487                                  numCoreChannels,
   1488                                 &numElementChan,
   1489                                  psPossible
   1490                                );
   1491 
   1492     if (errorStatus != SBRDEC_OK) {
   1493       goto bail;
   1494     }
   1495 
   1496     numSbrChannels += numElementChan;
   1497     channelMapping += numElementChan;
   1498 
   1499     if (numSbrChannels >= numCoreChannels) {
   1500       break;
   1501     }
   1502   }
   1503 
   1504   /* Update numChannels and samplerate */
   1505   *numChannels = numSbrChannels;
   1506   *sampleRate = self->sampleRateOut;
   1507   *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0;
   1508 
   1509 
   1510 
   1511   /* Clear reset and flush flag because everything seems to be done successfully. */
   1512   self->flags &= ~SBRDEC_FORCE_RESET;
   1513   self->flags &= ~SBRDEC_FLUSH;
   1514 
   1515 bail:
   1516 
   1517   return errorStatus;
   1518 }
   1519 
   1520 
   1521 SBR_ERROR sbrDecoder_Close ( HANDLE_SBRDECODER *pSelf )
   1522 {
   1523   HANDLE_SBRDECODER self = *pSelf;
   1524   int i;
   1525 
   1526   if (self != NULL)
   1527   {
   1528     if (self->hParametricStereoDec != NULL) {
   1529       DeletePsDec ( &self->hParametricStereoDec );
   1530     }
   1531 
   1532     if (self->workBuffer1 != NULL) {
   1533       FreeRam_SbrDecWorkBuffer1(&self->workBuffer1);
   1534     }
   1535     if (self->workBuffer2 != NULL) {
   1536       FreeRam_SbrDecWorkBuffer2(&self->workBuffer2);
   1537     }
   1538 
   1539     for (i = 0; i < (8); i++) {
   1540       sbrDecoder_DestroyElement( self, i );
   1541     }
   1542 
   1543     FreeRam_SbrDecoder(pSelf);
   1544   }
   1545 
   1546   return SBRDEC_OK;
   1547 }
   1548 
   1549 
   1550 INT sbrDecoder_GetLibInfo( LIB_INFO *info )
   1551 {
   1552   int i;
   1553 
   1554   if (info == NULL) {
   1555     return -1;
   1556   }
   1557 
   1558   /* search for next free tab */
   1559   for (i = 0; i < FDK_MODULE_LAST; i++) {
   1560     if (info[i].module_id == FDK_NONE)
   1561       break;
   1562   }
   1563   if (i == FDK_MODULE_LAST)
   1564     return -1;
   1565   info += i;
   1566 
   1567   info->module_id = FDK_SBRDEC;
   1568   info->version = LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2);
   1569   LIB_VERSION_STRING(info);
   1570   info->build_date = (char *)SBRDECODER_LIB_BUILD_DATE;
   1571   info->build_time = (char *)SBRDECODER_LIB_BUILD_TIME;
   1572   info->title      = (char *)SBRDECODER_LIB_TITLE;
   1573 
   1574   /* Set flags */
   1575   info->flags = 0
   1576     | CAPF_SBR_HQ
   1577     | CAPF_SBR_LP
   1578     | CAPF_SBR_PS_MPEG
   1579     | CAPF_SBR_CONCEALMENT
   1580     | CAPF_SBR_DRC
   1581       ;
   1582   /* End of flags */
   1583 
   1584   return 0;
   1585 }
   1586 
   1587 
   1588 UINT sbrDecoder_GetDelay( const HANDLE_SBRDECODER self )
   1589 {
   1590   UINT outputDelay = 0;
   1591 
   1592   if ( self != NULL) {
   1593     UINT flags = self->flags;
   1594 
   1595     /* See chapter 1.6.7.2 of ISO/IEC 14496-3 for the GA-SBR figures below. */
   1596 
   1597     /* Are we initialized? */
   1598     if ( (self->numSbrChannels > 0)
   1599       && (self->numSbrElements > 0) )
   1600     {
   1601       /* Add QMF synthesis delay */
   1602       if ( (flags & SBRDEC_ELD_GRID)
   1603         && IS_LOWDELAY(self->coreCodec) ) {
   1604         /* Low delay SBR: */
   1605         {
   1606           outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 32 : 64;   /* QMF synthesis */
   1607         }
   1608       }
   1609       else if (!IS_USAC(self->coreCodec)) {
   1610         /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...) branch: */
   1611         outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 481 : 962;
   1612       }
   1613     }
   1614   }
   1615 
   1616   return (outputDelay);
   1617 }
   1618