diff options
author | Kausik Sinnaswamy <kausik@broadcom.com> | 2012-03-07 19:30:20 -0800 |
---|---|---|
committer | Matthew Xie <mattx@google.com> | 2012-07-14 11:19:12 -0700 |
commit | 95fa11b3b2f19a382c7e3a744a6afb452fad86df (patch) | |
tree | 1019e123db4596f2b8bd1259da04b51f3c44d7b2 /embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c | |
parent | e2197423bcf1a93c620be13d458a9da6693fa94d (diff) | |
download | external_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.zip external_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.tar.gz external_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.tar.bz2 |
AV control and data path added
Change-Id: I88ec6084c140fa257154a98e23e075900e84cc8c
Diffstat (limited to 'embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c')
-rw-r--r-- | embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c b/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c new file mode 100644 index 0000000..c8b13a9 --- /dev/null +++ b/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c @@ -0,0 +1,188 @@ +/****************************************************************************** +** +** File Name: $RCSfile: sbc_enc_bit_alloc_mono.c,v $ +** +** Description: This file contains the code for bit allocation algorithm. +** It calculates the number of bits required for the encoded stream of data. +** +** Revision : $Id: sbc_enc_bit_alloc_mono.c,v 1.9 2006/03/31 17:16:35 mjougit Exp $ +** +** Copyright (c) 1999-2002, Widcomm Inc., All Rights Reserved. +** Widcomm Bluetooth Core. Proprietary and confidential. +** +******************************************************************************/ + +/*Includes*/ +#include "sbc_encoder.h" +#include "sbc_enc_func_declare.h" + +/*global arrays*/ +const SINT16 sbc_enc_as16Offset4[4][4] = { {-1, 0, 0, 0}, {-2, 0, 0, 1}, + {-2, 0, 0, 1}, {-2, 0, 0, 1} }; +const SINT16 sbc_enc_as16Offset8[4][8] = { {-2, 0, 0, 0, 0, 0, 0, 1}, + {-3, 0, 0, 0, 0, 0, 1, 2}, + {-4, 0, 0, 0, 0, 0, 1, 2}, + {-4, 0, 0, 0, 0, 0, 1, 2} }; + +/**************************************************************************** +* BitAlloc - Calculates the required number of bits for the given scale factor +* and the number of subbands. +* +* RETURNS : N/A +*/ + +void sbc_enc_bit_alloc_mono(SBC_ENC_PARAMS *pstrCodecParams) +{ + SINT32 s32MaxBitNeed; /*to store the max bits needed per sb*/ + SINT32 s32BitCount; /*the used number of bits*/ + SINT32 s32SliceCount; /*to store hwo many slices can be put in bitpool*/ + SINT32 s32BitSlice; /*number of bitslices in bitpool*/ + SINT32 s32Sb; /*counter for sub-band*/ + SINT32 s32Ch; /*counter for channel*/ + SINT16 *ps16BitNeed; /*temp memory to store required number of bits*/ + SINT32 s32Loudness; /*used in Loudness calculation*/ + SINT16 *ps16GenBufPtr; + SINT16 *ps16GenArrPtr; + SINT16 *ps16GenTabPtr; + SINT32 s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands; + + ps16BitNeed = pstrCodecParams->s16ScartchMemForBitAlloc; + + for (s32Ch = 0; s32Ch < pstrCodecParams->s16NumOfChannels; s32Ch++) + { + ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands; + ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*SBC_MAX_NUM_OF_SUBBANDS; + + /* bitneed values are derived from scale factor */ + if (pstrCodecParams->s16AllocationMethod == SBC_SNR) + { + ps16BitNeed = pstrCodecParams->as16ScaleFactor; + ps16GenBufPtr = ps16BitNeed + s32Ch * s32NumOfSubBands; + } + else + { + ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands; + if(s32NumOfSubBands == 4) + { + ps16GenTabPtr = (SINT16 *) + sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq]; + } + else + { + ps16GenTabPtr = (SINT16 *) + sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq]; + } + for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++) + { + if(pstrCodecParams->as16ScaleFactor[s32Ch*s32NumOfSubBands+s32Sb] == 0) + *(ps16GenBufPtr) = -5; + else + { + s32Loudness = + (SINT32)(pstrCodecParams->as16ScaleFactor[s32Ch*s32NumOfSubBands+s32Sb] + - *ps16GenTabPtr); + if(s32Loudness > 0) + *(ps16GenBufPtr) = (SINT16)(s32Loudness >>1); + else + *(ps16GenBufPtr) = (SINT16)s32Loudness; + } + ps16GenBufPtr++; + ps16GenTabPtr++; + } + + } + + /* max bitneed index is searched*/ + s32MaxBitNeed = 0; + ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands; + for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++) + { + if( *(ps16GenBufPtr) > s32MaxBitNeed) + s32MaxBitNeed = *(ps16GenBufPtr); + + ps16GenBufPtr++; + } + ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands; + /*iterative process to find hwo many bitslices fit into the bitpool*/ + s32BitSlice = s32MaxBitNeed + 1; + s32BitCount = pstrCodecParams->s16BitPool; + s32SliceCount = 0; + do + { + s32BitSlice --; + s32BitCount -= s32SliceCount; + s32SliceCount = 0; + + for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++) + { + if( (((*ps16GenBufPtr-s32BitSlice)< 16) && (*ps16GenBufPtr-s32BitSlice) >= 1)) + { + if((*ps16GenBufPtr-s32BitSlice) == 1) + s32SliceCount+=2; + else + s32SliceCount++; + } + ps16GenBufPtr++; + + }/*end of for*/ + ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands; + }while(s32BitCount-s32SliceCount>0); + + if(s32BitCount == 0) + { + s32BitCount -= s32SliceCount; + s32BitSlice --; + } + + /*Bits are distributed until the last bitslice is reached*/ + ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*s32NumOfSubBands; + ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands; + for(s32Sb=0; s32Sb<s32NumOfSubBands; s32Sb++) + { + if(*(ps16GenBufPtr) < s32BitSlice+2) + *(ps16GenArrPtr) = 0; + else + *(ps16GenArrPtr) = ((*(ps16GenBufPtr)-s32BitSlice)<16) ? + (SINT16)(*(ps16GenBufPtr)-s32BitSlice) : 16; + + ps16GenBufPtr++; + ps16GenArrPtr++; + } + ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*s32NumOfSubBands; + ps16GenBufPtr = ps16BitNeed + s32Ch*s32NumOfSubBands; + /*the remaining bits are allocated starting at subband 0*/ + s32Sb=0; + while( (s32BitCount > 0) && (s32Sb < s32NumOfSubBands) ) + { + if( (*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16) ) + { + (*(ps16GenArrPtr))++; + s32BitCount--; + } + else if( (*(ps16GenBufPtr) == s32BitSlice+1) && + (s32BitCount > 1) ) + { + *(ps16GenArrPtr) = 2; + s32BitCount -= 2; + } + s32Sb++; + ps16GenArrPtr++; + ps16GenBufPtr++; + } + ps16GenArrPtr = pstrCodecParams->as16Bits+s32Ch*s32NumOfSubBands; + + + s32Sb=0; + while( (s32BitCount > 0) && (s32Sb < s32NumOfSubBands) ) + { + if( *(ps16GenArrPtr) < 16) + { + (*(ps16GenArrPtr))++; + s32BitCount--; + } + s32Sb++; + ps16GenArrPtr++; + } + } +} +/*End of BitAlloc() function*/ |