/* ** Copyright 2003-2010, VisualOn, Inc. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ /******************************************************************************* File: stat_bits.c Content: Static bit counter functions *******************************************************************************/ #include "stat_bits.h" #include "bitenc.h" #include "tns.h" typedef enum { SI_ID_BITS =(3), SI_FILL_COUNT_BITS =(4), SI_FILL_ESC_COUNT_BITS =(8), SI_FILL_EXTENTION_BITS =(4), SI_FILL_NIBBLE_BITS =(4), SI_SCE_BITS =(4), SI_CPE_BITS =(5), SI_CPE_MS_MASK_BITS =(2) , SI_ICS_INFO_BITS_LONG =(1+2+1+6+1), SI_ICS_INFO_BITS_SHORT =(1+2+1+4+7), SI_ICS_BITS =(8+1+1+1) } SI_BITS; /********************************************************************************* * * function name: countMsMaskBits * description: count ms stereo bits demand * **********************************************************************************/ static Word16 countMsMaskBits(Word16 sfbCnt, Word16 sfbPerGroup, Word16 maxSfbPerGroup, struct TOOLSINFO *toolsInfo) { Word16 msBits, sfbOff, sfb; msBits = 0; switch(toolsInfo->msDigest) { case MS_NONE: case MS_ALL: break; case MS_SOME: for(sfbOff=0; sfbOfftnsActive[i]!=0) { tnsPresent = 1; } } if (tnsPresent) { /* there is data to be written*/ /*count += 1; */ for (i=0; itnsActive[i]) { count += 1; if (blockType == 2) { count += 4; count += 3; } else { count += 6; count += 5; } if (tnsInfo->order[i]) { count += 1; /*direction*/ count += 1; /*coef_compression */ if (tnsInfo->coefRes[i] == 4) { ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; coefBits = 3; for(k=0; korder[i]; k++) { if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) { coefBits = 4; break; } } } else { coefBits = 2; ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; for(k=0; korder[i]; k++) { if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) { coefBits = 3; break; } } } for (k=0; korder[i]; k++ ) { count += coefBits; } } } } } return count; } /********************************************************************************** * * function name: countTnsBits * description: count tns bit demand * **********************************************************************************/ static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType) { return(tnsCount(tnsInfo, blockType)); } /********************************************************************************* * * function name: countStaticBitdemand * description: count static bit demand include tns * **********************************************************************************/ Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], PSY_OUT_ELEMENT *psyOutElement, Word16 channels, Word16 adtsUsed) { Word32 statBits; Word32 ch; statBits = 0; /* if adts used, add 56 bits */ if(adtsUsed) statBits += 56; switch (channels) { case 1: statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS; statBits += countTnsBits(&(psyOutChannel[0].tnsInfo), psyOutChannel[0].windowSequence); switch(psyOutChannel[0].windowSequence){ case LONG_WINDOW: case START_WINDOW: case STOP_WINDOW: statBits += SI_ICS_INFO_BITS_LONG; break; case SHORT_WINDOW: statBits += SI_ICS_INFO_BITS_SHORT; break; } break; case 2: statBits += SI_ID_BITS+SI_CPE_BITS+2*SI_ICS_BITS; statBits += SI_CPE_MS_MASK_BITS; statBits += countMsMaskBits(psyOutChannel[0].sfbCnt, psyOutChannel[0].sfbPerGroup, psyOutChannel[0].maxSfbPerGroup, &psyOutElement->toolsInfo); switch (psyOutChannel[0].windowSequence) { case LONG_WINDOW: case START_WINDOW: case STOP_WINDOW: statBits += SI_ICS_INFO_BITS_LONG; break; case SHORT_WINDOW: statBits += SI_ICS_INFO_BITS_SHORT; break; } for(ch=0; ch<2; ch++) statBits += countTnsBits(&(psyOutChannel[ch].tnsInfo), psyOutChannel[ch].windowSequence); break; } return statBits; }