Home | History | Annotate | Download | only in srce
      1 /******************************************************************************
      2  *
      3  *  Copyright 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains the code for bit allocation algorithm. It calculates
     22  *  the number of bits required for the encoded stream of data.
     23  *
     24  ******************************************************************************/
     25 
     26 /*Includes*/
     27 #include "sbc_enc_func_declare.h"
     28 #include "sbc_encoder.h"
     29 
     30 /*global arrays*/
     31 const int16_t sbc_enc_as16Offset4[4][4] = {
     32     {-1, 0, 0, 0}, {-2, 0, 0, 1}, {-2, 0, 0, 1}, {-2, 0, 0, 1}};
     33 const int16_t sbc_enc_as16Offset8[4][8] = {{-2, 0, 0, 0, 0, 0, 0, 1},
     34                                            {-3, 0, 0, 0, 0, 0, 1, 2},
     35                                            {-4, 0, 0, 0, 0, 0, 1, 2},
     36                                            {-4, 0, 0, 0, 0, 0, 1, 2}};
     37 
     38 /****************************************************************************
     39 * BitAlloc - Calculates the required number of bits for the given scale factor
     40 * and the number of subbands.
     41 *
     42 * RETURNS : N/A
     43 */
     44 
     45 void sbc_enc_bit_alloc_mono(SBC_ENC_PARAMS* pstrCodecParams) {
     46   int32_t s32MaxBitNeed; /*to store the max bits needed per sb*/
     47   int32_t s32BitCount;   /*the used number of bits*/
     48   int32_t s32SliceCount; /*to store hwo many slices can be put in bitpool*/
     49   int32_t s32BitSlice;   /*number of bitslices in bitpool*/
     50   int32_t s32Sb;         /*counter for sub-band*/
     51   int32_t s32Ch;         /*counter for channel*/
     52   int16_t* ps16BitNeed;  /*temp memory to store required number of bits*/
     53   int32_t s32Loudness;   /*used in Loudness calculation*/
     54   int16_t* ps16GenBufPtr;
     55   int16_t* ps16GenArrPtr;
     56   int16_t* ps16GenTabPtr;
     57   int32_t s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands;
     58 
     59   ps16BitNeed = pstrCodecParams->s16ScartchMemForBitAlloc;
     60 
     61   for (s32Ch = 0; s32Ch < pstrCodecParams->s16NumOfChannels; s32Ch++) {
     62     ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
     63     ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * SBC_MAX_NUM_OF_SUBBANDS;
     64 
     65     /* bitneed values are derived from scale factor */
     66     if (pstrCodecParams->s16AllocationMethod == SBC_SNR) {
     67       ps16BitNeed = pstrCodecParams->as16ScaleFactor;
     68       ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
     69     } else {
     70       ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
     71       if (s32NumOfSubBands == 4) {
     72         ps16GenTabPtr =
     73             (int16_t*)sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq];
     74       } else {
     75         ps16GenTabPtr =
     76             (int16_t*)sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq];
     77       }
     78       for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) {
     79         if (pstrCodecParams
     80                 ->as16ScaleFactor[s32Ch * s32NumOfSubBands + s32Sb] == 0)
     81           *(ps16GenBufPtr) = -5;
     82         else {
     83           s32Loudness = (int32_t)(
     84               pstrCodecParams
     85                   ->as16ScaleFactor[s32Ch * s32NumOfSubBands + s32Sb] -
     86               *ps16GenTabPtr);
     87           if (s32Loudness > 0)
     88             *(ps16GenBufPtr) = (int16_t)(s32Loudness >> 1);
     89           else
     90             *(ps16GenBufPtr) = (int16_t)s32Loudness;
     91         }
     92         ps16GenBufPtr++;
     93         ps16GenTabPtr++;
     94       }
     95     }
     96 
     97     /* max bitneed index is searched*/
     98     s32MaxBitNeed = 0;
     99     ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
    100     for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) {
    101       if (*(ps16GenBufPtr) > s32MaxBitNeed) s32MaxBitNeed = *(ps16GenBufPtr);
    102 
    103       ps16GenBufPtr++;
    104     }
    105     ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
    106     /*iterative process to find hwo many bitslices fit into the bitpool*/
    107     s32BitSlice = s32MaxBitNeed + 1;
    108     s32BitCount = pstrCodecParams->s16BitPool;
    109     s32SliceCount = 0;
    110     do {
    111       s32BitSlice--;
    112       s32BitCount -= s32SliceCount;
    113       s32SliceCount = 0;
    114 
    115       for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) {
    116         if ((((*ps16GenBufPtr - s32BitSlice) < 16) &&
    117              (*ps16GenBufPtr - s32BitSlice) >= 1)) {
    118           if ((*ps16GenBufPtr - s32BitSlice) == 1)
    119             s32SliceCount += 2;
    120           else
    121             s32SliceCount++;
    122         }
    123         ps16GenBufPtr++;
    124 
    125       } /*end of for*/
    126       ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
    127     } while (s32BitCount - s32SliceCount > 0);
    128 
    129     if (s32BitCount == 0) {
    130       s32BitCount -= s32SliceCount;
    131       s32BitSlice--;
    132     }
    133 
    134     /*Bits are distributed until the last bitslice is reached*/
    135     ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * s32NumOfSubBands;
    136     ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
    137     for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) {
    138       if (*(ps16GenBufPtr) < s32BitSlice + 2)
    139         *(ps16GenArrPtr) = 0;
    140       else
    141         *(ps16GenArrPtr) = ((*(ps16GenBufPtr)-s32BitSlice) < 16)
    142                                ? (int16_t)(*(ps16GenBufPtr)-s32BitSlice)
    143                                : 16;
    144 
    145       ps16GenBufPtr++;
    146       ps16GenArrPtr++;
    147     }
    148     ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * s32NumOfSubBands;
    149     ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
    150     /*the remaining bits are allocated starting at subband 0*/
    151     s32Sb = 0;
    152     while ((s32BitCount > 0) && (s32Sb < s32NumOfSubBands)) {
    153       if ((*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16)) {
    154         (*(ps16GenArrPtr))++;
    155         s32BitCount--;
    156       } else if ((*(ps16GenBufPtr) == s32BitSlice + 1) && (s32BitCount > 1)) {
    157         *(ps16GenArrPtr) = 2;
    158         s32BitCount -= 2;
    159       }
    160       s32Sb++;
    161       ps16GenArrPtr++;
    162       ps16GenBufPtr++;
    163     }
    164     ps16GenArrPtr = pstrCodecParams->as16Bits + s32Ch * s32NumOfSubBands;
    165 
    166     s32Sb = 0;
    167     while ((s32BitCount > 0) && (s32Sb < s32NumOfSubBands)) {
    168       if (*(ps16GenArrPtr) < 16) {
    169         (*(ps16GenArrPtr))++;
    170         s32BitCount--;
    171       }
    172       s32Sb++;
    173       ps16GenArrPtr++;
    174     }
    175   }
    176 }
    177 /*End of BitAlloc() function*/
    178