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