1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/* 2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** you may not use this file except in compliance with the License. 6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** You may obtain a copy of the License at 7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** See the License for the specific language governing permissions and 14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** limitations under the License. 15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard */ 16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/******************************************************************************* 17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard File: stat_bits.c 18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Content: Static bit counter functions 20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*******************************************************************************/ 2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "stat_bits.h" 2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "bitenc.h" 2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "tns.h" 2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongtypedef enum { 2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_ID_BITS =(3), 3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_FILL_COUNT_BITS =(4), 3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_FILL_ESC_COUNT_BITS =(8), 3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_FILL_EXTENTION_BITS =(4), 3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_FILL_NIBBLE_BITS =(4), 3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_SCE_BITS =(4), 3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_CPE_BITS =(5), 3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_CPE_MS_MASK_BITS =(2) , 3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_ICS_INFO_BITS_LONG =(1+2+1+6+1), 3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_ICS_INFO_BITS_SHORT =(1+2+1+4+7), 3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong SI_ICS_BITS =(8+1+1+1) 4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} SI_BITS; 4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/********************************************************************************* 4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: countMsMaskBits 4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: count ms stereo bits demand 4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic Word16 countMsMaskBits(Word16 sfbCnt, 5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 sfbPerGroup, 5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 maxSfbPerGroup, 5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong struct TOOLSINFO *toolsInfo) 5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 msBits, sfbOff, sfb; 5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong msBits = 0; 5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong switch(toolsInfo->msDigest) { 5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case MS_NONE: 6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case MS_ALL: 6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case MS_SOME: 6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for(sfbOff=0; sfbOff<sfbCnt; sfbOff+=sfbPerGroup) 6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for(sfb=0; sfb<maxSfbPerGroup; sfb++) 6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong msBits += 1; 6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return(msBits); 7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/********************************************************************************* 7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: tnsCount 7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: count tns bit demand core function 7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) 7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 i, k; 8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Flag tnsPresent; 8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 numOfWindows; 8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 count; 85219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 coefBits; 8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 *ptcoef; 8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 88219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard count = 0; 8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (blockType == 2) 9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong numOfWindows = 8; 9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong numOfWindows = 1; 9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong tnsPresent = 0; 9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (i=0; i<numOfWindows; i++) { 9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (tnsInfo->tnsActive[i]!=0) { 9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong tnsPresent = 1; 10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (tnsPresent) { 10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* there is data to be written*/ 10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /*count += 1; */ 10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (i=0; i<numOfWindows; i++) { 10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (blockType == 2) 10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 1; 11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 2; 11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (tnsInfo->tnsActive[i]) { 11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 1; 11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (blockType == 2) { 11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 4; 11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 3; 11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else { 12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 6; 12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 5; 12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (tnsInfo->order[i]) { 12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 1; /*direction*/ 12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += 1; /*coef_compression */ 12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (tnsInfo->coefRes[i] == 4) { 130219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; 13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong coefBits = 3; 13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for(k=0; k<tnsInfo->order[i]; k++) { 13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) { 13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong coefBits = 4; 13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else { 14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong coefBits = 2; 142219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; 14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for(k=0; k<tnsInfo->order[i]; k++) { 14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) { 14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong coefBits = 3; 14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (k=0; k<tnsInfo->order[i]; k++ ) { 15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong count += coefBits; 15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 157219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return count; 16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/********************************************************************************** 16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: countTnsBits 16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: count tns bit demand 16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType) 16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return(tnsCount(tnsInfo, blockType)); 17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/********************************************************************************* 17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: countStaticBitdemand 17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: count static bit demand include tns 17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 17917299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], 18017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong PSY_OUT_ELEMENT *psyOutElement, 181219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 channels, 18217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 adtsUsed) 18317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 18417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 statBits; 18517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 ch; 18617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 187219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard statBits = 0; 188219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 18917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* if adts used, add 56 bits */ 19017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if(adtsUsed) statBits += 56; 19117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 19217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 19317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong switch (channels) { 19417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case 1: 19517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS; 19617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += countTnsBits(&(psyOutChannel[0].tnsInfo), 19717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong psyOutChannel[0].windowSequence); 19817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 19917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong switch(psyOutChannel[0].windowSequence){ 20017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case LONG_WINDOW: 20117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case START_WINDOW: 20217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case STOP_WINDOW: 20317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += SI_ICS_INFO_BITS_LONG; 20417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 20517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case SHORT_WINDOW: 20617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += SI_ICS_INFO_BITS_SHORT; 20717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 20817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 20917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 21017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case 2: 21117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += SI_ID_BITS+SI_CPE_BITS+2*SI_ICS_BITS; 21217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 21317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += SI_CPE_MS_MASK_BITS; 21417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += countMsMaskBits(psyOutChannel[0].sfbCnt, 21517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong psyOutChannel[0].sfbPerGroup, 21617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong psyOutChannel[0].maxSfbPerGroup, 21717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &psyOutElement->toolsInfo); 21817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 21917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong switch (psyOutChannel[0].windowSequence) { 22017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case LONG_WINDOW: 22117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case START_WINDOW: 22217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case STOP_WINDOW: 22317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += SI_ICS_INFO_BITS_LONG; 22417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 22517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong case SHORT_WINDOW: 22617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += SI_ICS_INFO_BITS_SHORT; 22717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 22817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 22917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for(ch=0; ch<2; ch++) 23017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong statBits += countTnsBits(&(psyOutChannel[ch].tnsInfo), 23117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong psyOutChannel[ch].windowSequence); 23217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 23317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 23417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 23517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return statBits; 23617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 23717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 238