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