summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/aacenc/src/stat_bits.c
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/aacenc/src/stat_bits.c')
-rw-r--r--media/libstagefright/codecs/aacenc/src/stat_bits.c237
1 files changed, 237 insertions, 0 deletions
diff --git a/media/libstagefright/codecs/aacenc/src/stat_bits.c b/media/libstagefright/codecs/aacenc/src/stat_bits.c
new file mode 100644
index 0000000..c2bd8bd
--- /dev/null
+++ b/media/libstagefright/codecs/aacenc/src/stat_bits.c
@@ -0,0 +1,237 @@
+/*
+ ** 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; sfbOff<sfbCnt; sfbOff+=sfbPerGroup)
+ for(sfb=0; sfb<maxSfbPerGroup; sfb++)
+ msBits += 1;
+ break;
+ }
+ return(msBits);
+}
+
+/*********************************************************************************
+*
+* function name: tnsCount
+* description: count tns bit demand core function
+*
+**********************************************************************************/
+static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
+{
+
+ Word32 i, k;
+ Flag tnsPresent;
+ Word32 numOfWindows;
+ Word32 count;
+ Word32 coefBits;
+ Word16 *ptcoef;
+
+ count = 0;
+
+ if (blockType == 2)
+ numOfWindows = 8;
+ else
+ numOfWindows = 1;
+ tnsPresent = 0;
+
+ for (i=0; i<numOfWindows; i++) {
+
+ if (tnsInfo->tnsActive[i]!=0) {
+ tnsPresent = 1;
+ }
+ }
+
+ if (tnsPresent) {
+ /* there is data to be written*/
+ /*count += 1; */
+ for (i=0; i<numOfWindows; i++) {
+
+ if (blockType == 2)
+ count += 1;
+ else
+ count += 2;
+
+ if (tnsInfo->tnsActive[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; k<tnsInfo->order[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; k<tnsInfo->order[i]; k++) {
+
+ if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) {
+ coefBits = 3;
+ break;
+ }
+ }
+ }
+ for (k=0; k<tnsInfo->order[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;
+}
+