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  Frequency scale calculation
     87 */
     88 
     89 #include "sbrdec_freq_sca.h"
     90 
     91 #include "transcendent.h"
     92 #include "sbr_rom.h"
     93 #include "env_extr.h"
     94 
     95 #include "genericStds.h"      /* need log() for debug-code only */
     96 
     97 #define MAX_OCTAVE         29
     98 #define MAX_SECOND_REGION  50
     99 
    100 
    101 static int  numberOfBands(FIXP_SGL bpo_div16, int start, int stop, int warpFlag);
    102 static void CalcBands(UCHAR * diff, UCHAR start, UCHAR stop, UCHAR num_bands);
    103 static SBR_ERROR modifyBands(UCHAR max_band, UCHAR * diff, UCHAR length);
    104 static void cumSum(UCHAR start_value, UCHAR* diff, UCHAR length, UCHAR *start_adress);
    105 
    106 
    107 
    108 /*!
    109   \brief     Retrieve QMF-band where the SBR range starts
    110 
    111   Convert startFreq which was read from the bitstream into a
    112   QMF-channel number.
    113 
    114   \return  Number of start band
    115 */
    116 static UCHAR
    117 getStartBand(UINT   fs,               /*!< Output sampling frequency */
    118              UCHAR  startFreq,        /*!< Index to table of possible start bands */
    119              UINT   headerDataFlags)  /*!< Info to SBR mode */
    120 {
    121   INT  band;
    122   UINT fsMapped;
    123 
    124     fsMapped = fs;
    125 
    126   switch (fsMapped) {
    127     case 48000:
    128       band = FDK_sbrDecoder_sbr_start_freq_48[startFreq];
    129       break;
    130     case 44100:
    131       band = FDK_sbrDecoder_sbr_start_freq_44[startFreq];
    132       break;
    133     case 32000:
    134       band = FDK_sbrDecoder_sbr_start_freq_32[startFreq];
    135       break;
    136     case 24000:
    137       band = FDK_sbrDecoder_sbr_start_freq_24[startFreq];
    138       break;
    139     case 22050:
    140       band = FDK_sbrDecoder_sbr_start_freq_22[startFreq];
    141       break;
    142     case 16000:
    143       band = FDK_sbrDecoder_sbr_start_freq_16[startFreq];
    144       break;
    145     default:
    146       band = 255;
    147   }
    148 
    149   return band;
    150 }
    151 
    152 
    153 /*!
    154   \brief     Retrieve QMF-band where the SBR range starts
    155 
    156   Convert startFreq which was read from the bitstream into a
    157   QMF-channel number.
    158 
    159   \return  Number of start band
    160 */
    161 static UCHAR
    162 getStopBand(UINT   fs,               /*!< Output sampling frequency */
    163             UCHAR  stopFreq,         /*!< Index to table of possible start bands */
    164             UINT   headerDataFlags,  /*!< Info to SBR mode */
    165             UCHAR  k0)               /*!< Start freq index */
    166 {
    167   UCHAR k2;
    168 
    169   if (stopFreq < 14) {
    170     INT    stopMin;
    171     UCHAR  diff_tot[MAX_OCTAVE + MAX_SECOND_REGION];
    172     UCHAR *diff0 = diff_tot;
    173     UCHAR *diff1 = diff_tot+MAX_OCTAVE;
    174 
    175     if (fs < 32000) {
    176       stopMin = (((2*6000*2*(64)) / fs) + 1) >> 1;
    177     }
    178     else {
    179       if (fs < 64000) {
    180         stopMin = (((2*8000*2*(64)) / fs) + 1) >> 1;
    181       }
    182       else {
    183         stopMin = (((2*10000*2*(64)) / fs) + 1) >> 1;
    184       }
    185     }
    186 
    187     /*
    188       Choose a stop band between k1 and 64 depending on stopFreq (0..13),
    189       based on a logarithmic scale.
    190       The vectors diff0 and diff1 are used temporarily here.
    191     */
    192     CalcBands( diff0, stopMin, 64, 13);
    193     shellsort( diff0, 13);
    194     cumSum(stopMin, diff0, 13, diff1);
    195     k2 = diff1[stopFreq];
    196   }
    197   else if (stopFreq==14)
    198     k2 = 2*k0;
    199   else
    200     k2 = 3*k0;
    201 
    202   /* Limit to Nyquist */
    203   if (k2 > (64))
    204     k2 = (64);
    205 
    206 
    207   /* Range checks */
    208   /* 1 <= difference <= 48; 1 <= fs <= 96000 */
    209   if ( ((k2 - k0) > MAX_FREQ_COEFFS) || (k2 <= k0) ) {
    210     return 255;
    211   }
    212 
    213   if (headerDataFlags & (SBRDEC_SYNTAX_USAC|SBRDEC_SYNTAX_RSVD50)) {
    214     /* 1 <= difference <= 35; 42000 <= fs <= 96000 */
    215     if ( (fs >= 42000) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS44100 ) ) {
    216       return 255;
    217     }
    218     /* 1 <= difference <= 32; 46009 <= fs <= 96000 */
    219     if ( (fs >= 46009) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS48000 ) ) {
    220       return 255;
    221     }
    222   }
    223   else {
    224     /* 1 <= difference <= 35; fs == 44100 */
    225     if ( (fs == 44100) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS44100 ) ) {
    226       return 255;
    227     }
    228     /* 1 <= difference <= 32; 48000 <= fs <= 96000 */
    229     if ( (fs >= 48000) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS48000 ) ) {
    230       return 255;
    231     }
    232   }
    233 
    234   return k2;
    235 }
    236 
    237 
    238 /*!
    239   \brief     Generates master frequency tables
    240 
    241   Frequency tables are calculated according to the selected domain
    242   (linear/logarithmic) and granularity.
    243   IEC 14496-3 4.6.18.3.2.1
    244 
    245   \return  errorCode, 0 if successful
    246 */
    247 SBR_ERROR
    248 sbrdecUpdateFreqScale(UCHAR * v_k_master,    /*!< Master table to be created */
    249                       UCHAR *numMaster,      /*!< Number of entries in master table */
    250                       UINT   fs,             /*!< SBR working sampling rate */
    251                       HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Control data from bitstream */
    252                       UINT flags)
    253 {
    254   FIXP_SGL bpo_div16;        /* bands_per_octave divided by 16 */
    255   INT      dk=0;
    256 
    257   /* Internal variables */
    258   UCHAR  k0, k2, i;
    259   UCHAR  num_bands0 = 0;
    260   UCHAR  num_bands1 = 0;
    261   UCHAR  diff_tot[MAX_OCTAVE + MAX_SECOND_REGION];
    262   UCHAR *diff0 = diff_tot;
    263   UCHAR *diff1 = diff_tot+MAX_OCTAVE;
    264   INT    k2_achived;
    265   INT    k2_diff;
    266   INT    incr=0;
    267 
    268   /*
    269     Determine start band
    270   */
    271   k0 = getStartBand(fs, hHeaderData->bs_data.startFreq, flags);
    272   if (k0 == 255) {
    273     return SBRDEC_UNSUPPORTED_CONFIG;
    274   }
    275 
    276   /*
    277     Determine stop band
    278   */
    279   k2 = getStopBand(fs, hHeaderData->bs_data.stopFreq, flags, k0);
    280   if (k2 == 255) {
    281     return SBRDEC_UNSUPPORTED_CONFIG;
    282   }
    283 
    284   if(hHeaderData->bs_data.freqScale>0) { /* Bark */
    285     INT k1;
    286 
    287     if(hHeaderData->bs_data.freqScale==1) {
    288       bpo_div16 = FL2FXCONST_SGL(12.0f/16.0f);
    289     }
    290     else if(hHeaderData->bs_data.freqScale==2) {
    291       bpo_div16 = FL2FXCONST_SGL(10.0f/16.0f);
    292     }
    293     else {
    294       bpo_div16 =  FL2FXCONST_SGL(8.0f/16.0f);
    295     }
    296 
    297 
    298     if( 1000 * k2 > 2245 * k0 ) { /* Two or more regions */
    299       k1 = 2*k0;
    300 
    301       num_bands0 = numberOfBands(bpo_div16, k0, k1, 0);
    302       num_bands1 = numberOfBands(bpo_div16, k1, k2, hHeaderData->bs_data.alterScale );
    303       if ( num_bands0 < 1) {
    304         return SBRDEC_UNSUPPORTED_CONFIG;
    305       }
    306       if ( num_bands1 < 1 ) {
    307         return SBRDEC_UNSUPPORTED_CONFIG;
    308       }
    309 
    310       CalcBands(diff0, k0, k1, num_bands0);
    311       shellsort( diff0, num_bands0);
    312       if (diff0[0] == 0) {
    313 #ifdef DEBUG_TOOLS
    314 #endif
    315         return SBRDEC_UNSUPPORTED_CONFIG;
    316       }
    317 
    318       cumSum(k0, diff0, num_bands0, v_k_master);
    319 
    320       CalcBands(diff1, k1, k2, num_bands1);
    321       shellsort( diff1, num_bands1);
    322       if(diff0[num_bands0-1] > diff1[0]) {
    323         SBR_ERROR err;
    324 
    325         err = modifyBands(diff0[num_bands0-1],diff1, num_bands1);
    326         if (err)
    327           return SBRDEC_UNSUPPORTED_CONFIG;
    328       }
    329 
    330       /* Add 2nd region */
    331       cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]);
    332       *numMaster = num_bands0 + num_bands1;     /* Output nr of bands */
    333 
    334     }
    335     else { /* Only one region */
    336       k1=k2;
    337 
    338       num_bands0 = numberOfBands(bpo_div16, k0, k1, 0);
    339       if ( num_bands0 < 1) {
    340         return SBRDEC_UNSUPPORTED_CONFIG;
    341       }
    342       CalcBands(diff0, k0, k1, num_bands0);
    343       shellsort(diff0, num_bands0);
    344       if (diff0[0] == 0) {
    345 #ifdef DEBUG_TOOLS
    346 #endif
    347         return SBRDEC_UNSUPPORTED_CONFIG;
    348       }
    349 
    350       cumSum(k0, diff0, num_bands0, v_k_master);
    351       *numMaster = num_bands0;        /* Output nr of bands */
    352 
    353     }
    354   }
    355   else { /* Linear mode */
    356      if (hHeaderData->bs_data.alterScale==0) {
    357         dk = 1;
    358         /* FLOOR to get to few number of bands (next lower even number) */
    359         num_bands0 = (k2 - k0) & 254;
    360       } else {
    361         dk = 2;
    362         num_bands0 = ( ((k2 - k0) >> 1) + 1 ) & 254; /* ROUND to the closest fit */
    363       }
    364 
    365       if (num_bands0 < 1) {
    366         return SBRDEC_UNSUPPORTED_CONFIG;
    367         /* We must return already here because 'i' can become negative below. */
    368       }
    369 
    370       k2_achived = k0 + num_bands0*dk;
    371       k2_diff = k2 - k2_achived;
    372 
    373       for(i=0;i<num_bands0;i++)
    374         diff_tot[i] = dk;
    375 
    376       /* If linear scale wasn't achieved */
    377       /* and we got too wide SBR area */
    378       if (k2_diff < 0) {
    379           incr = 1;
    380           i = 0;
    381       }
    382 
    383       /* If linear scale wasn't achieved */
    384       /* and we got too small SBR area */
    385       if (k2_diff > 0) {
    386           incr = -1;
    387           i = num_bands0-1;
    388       }
    389 
    390       /* Adjust diff vector to get sepc. SBR range */
    391       while (k2_diff != 0) {
    392         diff_tot[i] = diff_tot[i] - incr;
    393         i = i + incr;
    394         k2_diff = k2_diff + incr;
    395       }
    396 
    397       cumSum(k0, diff_tot, num_bands0, v_k_master);/* cumsum */
    398     *numMaster = num_bands0;  /* Output nr of bands */
    399   }
    400 
    401   if (*numMaster < 1) {
    402     return SBRDEC_UNSUPPORTED_CONFIG;
    403   }
    404 
    405 
    406   /*
    407     Print out the calculated table
    408   */
    409 
    410   return SBRDEC_OK;
    411 }
    412 
    413 
    414 /*!
    415   \brief     Calculate frequency ratio of one SBR band
    416 
    417   All SBR bands should span a constant frequency range in the logarithmic
    418   domain. This function calculates the ratio of any SBR band's upper and lower
    419   frequency.
    420 
    421  \return    num_band-th root of k_start/k_stop
    422 */
    423 static FIXP_SGL calcFactorPerBand(int k_start, int k_stop, int num_bands)
    424 {
    425 /* Scaled bandfactor and step 1 bit right to avoid overflow
    426  * use double data type */
    427   FIXP_DBL bandfactor = FL2FXCONST_DBL(0.25f); /* Start value */
    428   FIXP_DBL step = FL2FXCONST_DBL(0.125f);      /* Initial increment for factor */
    429 
    430   int    direction = 1;
    431 
    432 /* Because saturation can't be done in INT IIS,
    433  * changed start and stop data type from FIXP_SGL to FIXP_DBL */
    434   FIXP_DBL start = k_start << (DFRACT_BITS-8);
    435   FIXP_DBL stop = k_stop << (DFRACT_BITS-8);
    436 
    437   FIXP_DBL temp;
    438 
    439   int   j, i=0;
    440 
    441   while ( step > FL2FXCONST_DBL(0.0f)) {
    442     i++;
    443     temp = stop;
    444 
    445     /* Calculate temp^num_bands: */
    446     for (j=0; j<num_bands; j++)
    447       //temp = fMult(temp,bandfactor);
    448       temp = fMultDiv2(temp,bandfactor)<<2;
    449 
    450     if (temp<start) { /* Factor too strong, make it weaker */
    451       if (direction == 0)
    452         /* Halfen step. Right shift is not done as fract because otherwise the
    453            lowest bit cannot be cleared due to rounding */
    454         step = (FIXP_DBL)((LONG)step >> 1);
    455       direction = 1;
    456       bandfactor = bandfactor + step;
    457     }
    458     else {  /* Factor is too weak: make it stronger */
    459       if (direction == 1)
    460         step = (FIXP_DBL)((LONG)step >> 1);
    461       direction = 0;
    462       bandfactor = bandfactor - step;
    463     }
    464 
    465     if (i>100) {
    466       step = FL2FXCONST_DBL(0.0f);
    467     }
    468   }
    469   return FX_DBL2FX_SGL(bandfactor<<1);
    470 }
    471 
    472 
    473 /*!
    474   \brief     Calculate number of SBR bands between start and stop band
    475 
    476   Given the number of bands per octave, this function calculates how many
    477   bands fit in the given frequency range.
    478   When the warpFlag is set, the 'band density' is decreased by a factor
    479   of 1/1.3
    480 
    481   \return    number of bands
    482 */
    483 static int
    484 numberOfBands(FIXP_SGL bpo_div16, /*!< Input: number of bands per octave divided by 16 */
    485               int    start,     /*!< First QMF band of SBR frequency range */
    486               int    stop,      /*!< Last QMF band of SBR frequency range + 1 */
    487               int    warpFlag)  /*!< Stretching flag */
    488 {
    489   FIXP_SGL num_bands_div128;
    490   int    num_bands;
    491 
    492   num_bands_div128 = FX_DBL2FX_SGL(fMult(FDK_getNumOctavesDiv8(start,stop),bpo_div16));
    493 
    494   if (warpFlag) {
    495     /* Apply the warp factor of 1.3 to get wider bands.  We use a value
    496        of 32768/25200 instead of the exact value to avoid critical cases
    497        of rounding.
    498     */
    499     num_bands_div128 = FX_DBL2FX_SGL(fMult(num_bands_div128, FL2FXCONST_SGL(25200.0/32768.0)));
    500   }
    501 
    502   /* add scaled 1 for rounding to even numbers: */
    503   num_bands_div128 = num_bands_div128 + FL2FXCONST_SGL( 1.0f/128.0f );
    504   /* scale back to right aligned integer and double the value: */
    505   num_bands = 2 * ((LONG)num_bands_div128 >> (FRACT_BITS - 7));
    506 
    507   return(num_bands);
    508 }
    509 
    510 
    511 /*!
    512   \brief     Calculate width of SBR bands
    513 
    514   Given the desired number of bands within the SBR frequency range,
    515   this function calculates the width of each SBR band in QMF channels.
    516   The bands get wider from start to stop (bark scale).
    517 */
    518 static void
    519 CalcBands(UCHAR * diff,    /*!< Vector of widths to be calculated */
    520           UCHAR start,     /*!< Lower end of subband range */
    521           UCHAR stop,      /*!< Upper end of subband range */
    522           UCHAR num_bands) /*!< Desired number of bands */
    523 {
    524   int i;
    525   int previous;
    526   int current;
    527   FIXP_SGL exact, temp;
    528   FIXP_SGL bandfactor = calcFactorPerBand(start, stop, num_bands);
    529 
    530   previous = stop; /* Start with highest QMF channel */
    531   exact = (FIXP_SGL)(stop << (FRACT_BITS-8)); /* Shift left to gain some accuracy */
    532 
    533   for(i=num_bands-1; i>=0; i--) {
    534     /* Calculate border of next lower sbr band */
    535     exact = FX_DBL2FX_SGL(fMult(exact,bandfactor));
    536 
    537     /* Add scaled 0.5 for rounding:
    538        We use a value 128/256 instead of 0.5 to avoid some critical cases of rounding. */
    539     temp = exact +  FL2FXCONST_SGL(128.0/32768.0);
    540 
    541     /* scale back to right alinged integer: */
    542     current = (LONG)temp >> (FRACT_BITS-8);
    543 
    544     /* Save width of band i */
    545     diff[i] = previous - current;
    546     previous = current;
    547   }
    548 }
    549 
    550 
    551 /*!
    552   \brief     Calculate cumulated sum vector from delta vector
    553 */
    554 static void
    555 cumSum(UCHAR start_value, UCHAR* diff, UCHAR length, UCHAR *start_adress)
    556 {
    557   int i;
    558   start_adress[0]=start_value;
    559   for(i=1; i<=length; i++)
    560     start_adress[i] = start_adress[i-1] + diff[i-1];
    561 }
    562 
    563 
    564 /*!
    565   \brief     Adapt width of frequency bands in the second region
    566 
    567   If SBR spans more than 2 octaves, the upper part of a bark-frequency-scale
    568   is calculated separately. This function tries to avoid that the second region
    569   starts with a band smaller than the highest band of the first region.
    570 */
    571 static SBR_ERROR
    572 modifyBands(UCHAR max_band_previous, UCHAR * diff, UCHAR length)
    573 {
    574   int change = max_band_previous - diff[0];
    575 
    576   /* Limit the change so that the last band cannot get narrower than the first one */
    577   if ( change > (diff[length-1]-diff[0])>>1 )
    578     change = (diff[length-1]-diff[0])>>1;
    579 
    580   diff[0] += change;
    581   diff[length-1] -= change;
    582   shellsort(diff, length);
    583 
    584   return SBRDEC_OK;
    585 }
    586 
    587 
    588 /*!
    589   \brief   Update high resolution frequency band table
    590 */
    591 static void
    592 sbrdecUpdateHiRes(UCHAR * h_hires,
    593                   UCHAR * num_hires,
    594                   UCHAR * v_k_master,
    595                   UCHAR num_bands,
    596                   UCHAR xover_band)
    597 {
    598   UCHAR i;
    599 
    600   *num_hires = num_bands-xover_band;
    601 
    602   for(i=xover_band; i<=num_bands; i++) {
    603     h_hires[i-xover_band] = v_k_master[i];
    604   }
    605 }
    606 
    607 
    608 /*!
    609   \brief  Build low resolution table out of high resolution table
    610 */
    611 static void
    612 sbrdecUpdateLoRes(UCHAR * h_lores,
    613                   UCHAR * num_lores,
    614                   UCHAR * h_hires,
    615                   UCHAR num_hires)
    616 {
    617   UCHAR i;
    618 
    619   if( (num_hires & 1) == 0) {
    620     /* If even number of hires bands */
    621     *num_lores = num_hires >> 1;
    622     /* Use every second lores=hires[0,2,4...] */
    623     for(i=0; i<=*num_lores; i++)
    624       h_lores[i] = h_hires[i*2];
    625   }
    626   else {
    627     /* Odd number of hires, which means xover is odd */
    628     *num_lores = (num_hires+1) >> 1;
    629     /* Use lores=hires[0,1,3,5 ...] */
    630     h_lores[0] = h_hires[0];
    631     for(i=1; i<=*num_lores; i++) {
    632       h_lores[i] = h_hires[i*2-1];
    633     }
    634   }
    635 }
    636 
    637 
    638 /*!
    639   \brief   Derive a low-resolution frequency-table from the master frequency table
    640 */
    641 void
    642 sbrdecDownSampleLoRes(UCHAR *v_result,
    643                       UCHAR num_result,
    644                       UCHAR *freqBandTableRef,
    645                       UCHAR num_Ref)
    646 {
    647   int step;
    648   int i,j;
    649   int org_length,result_length;
    650   int v_index[MAX_FREQ_COEFFS>>1];
    651 
    652   /* init */
    653   org_length = num_Ref;
    654   result_length = num_result;
    655 
    656   v_index[0] = 0;   /* Always use left border */
    657   i=0;
    658   while(org_length > 0) {
    659     /* Create downsample vector */
    660     i++;
    661     step = org_length / result_length;
    662     org_length = org_length - step;
    663     result_length--;
    664     v_index[i] = v_index[i-1] + step;
    665   }
    666 
    667   for(j=0;j<=i;j++) {
    668     /* Use downsample vector to index LoResolution vector */
    669     v_result[j]=freqBandTableRef[v_index[j]];
    670   }
    671 
    672 }
    673 
    674 
    675 /*!
    676   \brief   Sorting routine
    677 */
    678 void shellsort(UCHAR *in, UCHAR n)
    679 {
    680 
    681   int i, j, v, w;
    682   int inc = 1;
    683 
    684   do
    685     inc = 3 * inc + 1;
    686   while (inc <= n);
    687 
    688   do {
    689     inc = inc / 3;
    690     for (i = inc; i < n; i++) {
    691       v = in[i];
    692       j = i;
    693       while ((w=in[j-inc]) > v) {
    694         in[j] = w;
    695         j -= inc;
    696         if (j < inc)
    697           break;
    698       }
    699       in[j] = v;
    700     }
    701   } while (inc > 1);
    702 
    703 }
    704 
    705 
    706 
    707 /*!
    708   \brief   Reset frequency band tables
    709   \return  errorCode, 0 if successful
    710 */
    711 SBR_ERROR
    712 resetFreqBandTables(HANDLE_SBR_HEADER_DATA hHeaderData, const UINT flags)
    713 {
    714   SBR_ERROR err = SBRDEC_OK;
    715   int k2,kx, lsb, usb;
    716   int     intTemp;
    717   UCHAR    nBandsLo, nBandsHi;
    718   HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData;
    719 
    720   /* Calculate master frequency function */
    721   err = sbrdecUpdateFreqScale(hFreq->v_k_master,
    722                               &hFreq->numMaster,
    723                               hHeaderData->sbrProcSmplRate,
    724                               hHeaderData,
    725                               flags);
    726 
    727   if ( err || (hHeaderData->bs_info.xover_band > hFreq->numMaster) ) {
    728     return SBRDEC_UNSUPPORTED_CONFIG;
    729   }
    730 
    731   /* Derive Hiresolution from master frequency function */
    732   sbrdecUpdateHiRes(hFreq->freqBandTable[1], &nBandsHi, hFreq->v_k_master, hFreq->numMaster, hHeaderData->bs_info.xover_band );
    733   /* Derive Loresolution from Hiresolution */
    734   sbrdecUpdateLoRes(hFreq->freqBandTable[0], &nBandsLo, hFreq->freqBandTable[1], nBandsHi);
    735 
    736 
    737   hFreq->nSfb[0] = nBandsLo;
    738   hFreq->nSfb[1] = nBandsHi;
    739 
    740   /* Check index to freqBandTable[0] */
    741   if ( !(nBandsLo > 0) || (nBandsLo > (MAX_FREQ_COEFFS>>1)) ) {
    742     return SBRDEC_UNSUPPORTED_CONFIG;
    743   }
    744 
    745   lsb = hFreq->freqBandTable[0][0];
    746   usb = hFreq->freqBandTable[0][nBandsLo];
    747 
    748   /* Additional check for lsb */
    749   if ( (lsb > (32)) || (lsb >= usb) ) {
    750     return SBRDEC_UNSUPPORTED_CONFIG;
    751   }
    752 
    753 
    754   /* Calculate number of noise bands */
    755 
    756   k2 = hFreq->freqBandTable[1][nBandsHi];
    757   kx = hFreq->freqBandTable[1][0];
    758 
    759   if (hHeaderData->bs_data.noise_bands == 0)
    760   {
    761     hFreq->nNfb = 1;
    762   }
    763   else /* Calculate no of noise bands 1,2 or 3 bands/octave */
    764   {
    765     /* Fetch number of octaves divided by 32 */
    766     intTemp = (LONG)FDK_getNumOctavesDiv8(kx,k2) >> 2;
    767 
    768     /* Integer-Multiplication with number of bands: */
    769     intTemp = intTemp * hHeaderData->bs_data.noise_bands;
    770 
    771     /* Add scaled 0.5 for rounding: */
    772     intTemp = intTemp + (LONG)FL2FXCONST_SGL(0.5f/32.0f);
    773 
    774     /* Convert to right-aligned integer: */
    775     intTemp = intTemp >> (FRACT_BITS - 1 /*sign*/ - 5 /* rescale */);
    776 
    777     /* Compare with float calculation */
    778     FDK_ASSERT( intTemp ==  (int)((hHeaderData->bs_data.noise_bands * FDKlog( (float)k2/kx) / (float)(FDKlog(2.0)))+0.5) );
    779 
    780     if( intTemp==0)
    781       intTemp=1;
    782 
    783     hFreq->nNfb = intTemp;
    784   }
    785 
    786   hFreq->nInvfBands = hFreq->nNfb;
    787 
    788   if( hFreq->nNfb > MAX_NOISE_COEFFS ) {
    789     return SBRDEC_UNSUPPORTED_CONFIG;
    790   }
    791 
    792   /* Get noise bands */
    793   sbrdecDownSampleLoRes(hFreq->freqBandTableNoise,
    794                         hFreq->nNfb,
    795                         hFreq->freqBandTable[0],
    796                         nBandsLo);
    797 
    798 
    799 
    800 
    801   hFreq->lowSubband  = lsb;
    802   hFreq->highSubband = usb;
    803 
    804   return SBRDEC_OK;
    805 }
    806