Home | History | Annotate | Download | only in srce
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 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_encoder.h"
     28 #include "sbc_enc_func_declare.h"
     29 
     30 /*global arrays*/
     31 const SINT16 sbc_enc_as16Offset4[4][4] = {  {-1, 0, 0, 0}, {-2, 0, 0, 1},
     32                                     {-2, 0, 0, 1}, {-2, 0, 0, 1} };
     33 const SINT16 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 {
     47     SINT32 s32MaxBitNeed;   /*to store the max bits needed per sb*/
     48     SINT32 s32BitCount;     /*the used number of bits*/
     49     SINT32 s32SliceCount;   /*to store hwo many slices can be put in bitpool*/
     50     SINT32 s32BitSlice;     /*number of bitslices in bitpool*/
     51     SINT32 s32Sb;           /*counter for sub-band*/
     52     SINT32 s32Ch;           /*counter for channel*/
     53     SINT16 *ps16BitNeed;    /*temp memory to store required number of bits*/
     54     SINT32 s32Loudness;     /*used in Loudness calculation*/
     55     SINT16 *ps16GenBufPtr;
     56     SINT16 *ps16GenArrPtr;
     57     SINT16 *ps16GenTabPtr;
     58     SINT32  s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands;
     59 
     60     ps16BitNeed = pstrCodecParams->s16ScartchMemForBitAlloc;
     61 
     62     for (s32Ch = 0; s32Ch < pstrCodecParams->s16NumOfChannels; s32Ch++)
     63     {
     64         ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands;
     65         ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*SBC_MAX_NUM_OF_SUBBANDS;
     66 
     67         /* bitneed values are derived from scale factor */
     68         if (pstrCodecParams->s16AllocationMethod == SBC_SNR)
     69         {
     70             ps16BitNeed = pstrCodecParams->as16ScaleFactor;
     71             ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands;
     72         }
     73         else
     74         {
     75             ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands;
     76             if(s32NumOfSubBands == 4)
     77             {
     78                 ps16GenTabPtr = (SINT16 *)
     79                     sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq];
     80             }
     81             else
     82             {
     83                 ps16GenTabPtr = (SINT16 *)
     84                     sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq];
     85             }
     86             for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++)
     87             {
     88                 if(pstrCodecParams->as16ScaleFactor[s32Ch*s32NumOfSubBands+s32Sb] == 0)
     89                     *(ps16GenBufPtr) = -5;
     90                 else
     91                 {
     92                     s32Loudness =
     93                         (SINT32)(pstrCodecParams->as16ScaleFactor[s32Ch*s32NumOfSubBands+s32Sb]
     94                                                             - *ps16GenTabPtr);
     95                     if(s32Loudness > 0)
     96                         *(ps16GenBufPtr) = (SINT16)(s32Loudness >>1);
     97                     else
     98                         *(ps16GenBufPtr) = (SINT16)s32Loudness;
     99                 }
    100                 ps16GenBufPtr++;
    101                 ps16GenTabPtr++;
    102             }
    103 
    104         }
    105 
    106         /* max bitneed index is searched*/
    107         s32MaxBitNeed = 0;
    108         ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands;
    109         for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++)
    110         {
    111             if( *(ps16GenBufPtr) > s32MaxBitNeed)
    112                 s32MaxBitNeed = *(ps16GenBufPtr);
    113 
    114             ps16GenBufPtr++;
    115         }
    116         ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands;
    117         /*iterative process to find hwo many bitslices fit into the bitpool*/
    118         s32BitSlice = s32MaxBitNeed + 1;
    119         s32BitCount = pstrCodecParams->s16BitPool;
    120         s32SliceCount = 0;
    121         do
    122         {
    123             s32BitSlice --;
    124             s32BitCount -= s32SliceCount;
    125             s32SliceCount = 0;
    126 
    127             for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++)
    128             {
    129                 if( (((*ps16GenBufPtr-s32BitSlice)< 16) && (*ps16GenBufPtr-s32BitSlice) >= 1))
    130                 {
    131                     if((*ps16GenBufPtr-s32BitSlice) == 1)
    132                         s32SliceCount+=2;
    133                     else
    134                         s32SliceCount++;
    135                 }
    136                 ps16GenBufPtr++;
    137 
    138             }/*end of for*/
    139             ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands;
    140         }while(s32BitCount-s32SliceCount>0);
    141 
    142         if(s32BitCount == 0)
    143         {
    144             s32BitCount -= s32SliceCount;
    145             s32BitSlice --;
    146         }
    147 
    148         /*Bits are distributed until the last bitslice is reached*/
    149         ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*s32NumOfSubBands;
    150         ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands;
    151         for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++)
    152         {
    153             if(*(ps16GenBufPtr) < s32BitSlice+2)
    154                 *(ps16GenArrPtr) = 0;
    155             else
    156                 *(ps16GenArrPtr) = ((*(ps16GenBufPtr)-s32BitSlice)<16) ?
    157                     (SINT16)(*(ps16GenBufPtr)-s32BitSlice) : 16;
    158 
    159             ps16GenBufPtr++;
    160             ps16GenArrPtr++;
    161         }
    162         ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*s32NumOfSubBands;
    163         ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands;
    164         /*the remaining bits are allocated starting at subband 0*/
    165         s32Sb=0;
    166         while( (s32BitCount > 0) && (s32Sb < s32NumOfSubBands) )
    167         {
    168             if( (*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16) )
    169             {
    170                 (*(ps16GenArrPtr))++;
    171                 s32BitCount--;
    172             }
    173             else if( (*(ps16GenBufPtr) == s32BitSlice+1) &&
    174                 (s32BitCount > 1) )
    175             {
    176                 *(ps16GenArrPtr) = 2;
    177                 s32BitCount -= 2;
    178             }
    179             s32Sb++;
    180             ps16GenArrPtr++;
    181             ps16GenBufPtr++;
    182         }
    183         ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*s32NumOfSubBands;
    184 
    185 
    186         s32Sb=0;
    187         while( (s32BitCount > 0) && (s32Sb < s32NumOfSubBands) )
    188         {
    189             if( *(ps16GenArrPtr) < 16)
    190             {
    191                 (*(ps16GenArrPtr))++;
    192                 s32BitCount--;
    193             }
    194             s32Sb++;
    195             ps16GenArrPtr++;
    196         }
    197     }
    198 }
    199 /*End of BitAlloc() function*/
    200