15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the code for bit allocation algorithm. It calculates 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the number of bits required for the encoded stream of data. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*Includes*/ 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_encoder.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_enc_func_declare.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*global arrays*/ 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern const SINT16 sbc_enc_as16Offset4[4][4]; 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern const SINT16 sbc_enc_as16Offset8[4][8]; 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**************************************************************************** 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* BitAlloc - Calculates the required number of bits for the given scale factor 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* and the number of subbands. 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* RETURNS : N/A 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sbc_enc_bit_alloc_ste(SBC_ENC_PARAMS *pstrCodecParams) 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CAUTIOM -> mips optim for arm 32 require to use SINT32 instead of SINT16 */ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not change variable type or name */ 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32MaxBitNeed; /*to store the max bits needed per sb*/ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32BitCount; /*the used number of bits*/ 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32SliceCount; /*to store hwo many slices can be put in bitpool*/ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32BitSlice; /*number of bitslices in bitpool*/ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32Sb; /*counter for sub-band*/ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32Ch; /*counter for channel*/ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 *ps16BitNeed; /*temp memory to store required number of bits*/ 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32Loudness; /*used in Loudness calculation*/ 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 *ps16GenBufPtr,*pas16ScaleFactor; 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 *ps16GenArrPtr; 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 *ps16GenTabPtr; 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands; 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32BitPool = pstrCodecParams->s16BitPool; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* bitneed values are derived from scale factor */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pstrCodecParams->s16AllocationMethod == SBC_SNR) 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16BitNeed = pstrCodecParams->as16ScaleFactor; 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32MaxBitNeed = pstrCodecParams->s16MaxBitNeed; 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16BitNeed = pstrCodecParams->s16ScartchMemForBitAlloc; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pas16ScaleFactor=pstrCodecParams->as16ScaleFactor; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32MaxBitNeed = 0; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr = ps16BitNeed; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (s32Ch = 0; s32Ch < 2; s32Ch++) 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s32NumOfSubBands == 4) 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq]; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq]; 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*pas16ScaleFactor == 0) 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *ps16GenBufPtr = -5; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Loudness = (SINT32)(*pas16ScaleFactor - *ps16GenTabPtr); 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s32Loudness > 0) 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *ps16GenBufPtr = (SINT16)(s32Loudness >> 1); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *ps16GenBufPtr = (SINT16)s32Loudness; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*ps16GenBufPtr > s32MaxBitNeed) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32MaxBitNeed = *ps16GenBufPtr; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pas16ScaleFactor++; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr++; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenTabPtr++; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* iterative process to find out hwo many bitslices fit into the bitpool */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitSlice = s32MaxBitNeed + 1; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitCount = s32BitPool; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32SliceCount = 0; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitSlice --; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitCount -= s32SliceCount; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32SliceCount = 0; 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr = ps16BitNeed; 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (s32Sb = 0; s32Sb < 2*s32NumOfSubBands; s32Sb++) 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (*ps16GenBufPtr >= s32BitSlice + 1) && (*ps16GenBufPtr < s32BitSlice + 16) ) 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*(ps16GenBufPtr) == s32BitSlice+1) 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32SliceCount += 2; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32SliceCount++; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr++; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (s32BitCount-s32SliceCount>0); 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s32BitCount-s32SliceCount == 0) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitCount -= s32SliceCount; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitSlice --; 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Bits are distributed until the last bitslice is reached */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr = ps16BitNeed; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr = pstrCodecParams->as16Bits; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (s32Ch = 0; s32Ch < 2; s32Ch++) 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*ps16GenBufPtr < s32BitSlice+2) 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *ps16GenArrPtr = 0; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *ps16GenArrPtr = ((*(ps16GenBufPtr)-s32BitSlice) < 16) ? 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (SINT16)(*(ps16GenBufPtr)-s32BitSlice):16; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr++; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr++; 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the remaining bits are allocated starting at subband 0 */ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Ch=0; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Sb=0; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr = ps16BitNeed; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr -= 2*s32NumOfSubBands; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ( (s32BitCount > 0) && (s32Sb < s32NumOfSubBands) ) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16) ) 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*(ps16GenArrPtr))++; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitCount--; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((*ps16GenBufPtr == s32BitSlice+1) && (s32BitCount > 1)) 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *(ps16GenArrPtr) = 2; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitCount -= 2; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(s32Ch == 1) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Ch = 0; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Sb++; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr = ps16BitNeed+s32Sb; 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr = pstrCodecParams->as16Bits+s32Sb; 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Ch =1; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenBufPtr = ps16BitNeed+s32NumOfSubBands+s32Sb; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr = pstrCodecParams->as16Bits+s32NumOfSubBands+s32Sb; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Ch=0; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Sb=0; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr = pstrCodecParams->as16Bits; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((s32BitCount >0) && (s32Sb < s32NumOfSubBands)) 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(*(ps16GenArrPtr) < 16) 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*(ps16GenArrPtr))++; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32BitCount--; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s32Ch == 1) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Ch = 0; 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Sb++; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr = pstrCodecParams->as16Bits+s32Sb; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s32Ch = 1; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ps16GenArrPtr = pstrCodecParams->as16Bits+s32NumOfSubBands+s32Sb; 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*End of BitAlloc() function*/ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 213