Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 #include "avcdec_lib.h"
     19 #include "avcdec_bitstream.h"
     20 
     21 //#define PV_ARM_V5
     22 #ifdef PV_ARM_V5
     23 #define PV_CLZ(A,B) __asm{CLZ (A),(B)}  \
     24     A -= 16;
     25 #else
     26 #define PV_CLZ(A,B) while (((B) & 0x8000) == 0) {(B) <<=1; A++;}
     27 #endif
     28 
     29 
     30 #define PV_NO_CLZ
     31 
     32 #ifndef PV_NO_CLZ
     33 typedef struct tagVLCNumCoeffTrail
     34 {
     35     int trailing;
     36     int total_coeff;
     37     int length;
     38 } VLCNumCoeffTrail;
     39 
     40 typedef struct tagShiftOffset
     41 {
     42     int shift;
     43     int offset;
     44 } ShiftOffset;
     45 
     46 const VLCNumCoeffTrail NumCoeffTrailOnes[3][67] =
     47 {
     48     {{0, 0, 1}, {1, 1, 2}, {2, 2, 3}, {1, 2, 6}, {0, 1, 6}, {3, 3, 5}, {3, 3, 5}, {3, 5, 7},
     49         {2, 3, 7}, {3, 4, 6}, {3, 4, 6}, {3, 6, 8}, {2, 4, 8}, {1, 3, 8}, {0, 2, 8}, {3, 7, 9},
     50         {2, 5, 9}, {1, 4, 9}, {0, 3, 9}, {3, 8, 10}, {2, 6, 10}, {1, 5, 10}, {0, 4, 10}, {3, 9, 11},
     51         {2, 7, 11}, {1, 6, 11}, {0, 5, 11}, {0, 8, 13}, {2, 9, 13}, {1, 8, 13}, {0, 7, 13}, {3, 10, 13},
     52         {2, 8, 13}, {1, 7, 13}, {0, 6, 13}, {3, 12, 14}, {2, 11, 14}, {1, 10, 14}, {0, 10, 14}, {3, 11, 14},
     53         {2, 10, 14}, {1, 9, 14}, {0, 9, 14}, {3, 14, 15}, {2, 13, 15}, {1, 12, 15}, {0, 12, 15}, {3, 13, 15},
     54         {2, 12, 15}, {1, 11, 15}, {0, 11, 15}, {3, 16, 16}, {2, 15, 16}, {1, 15, 16}, {0, 14, 16}, {3, 15, 16},
     55         {2, 14, 16}, {1, 14, 16}, {0, 13, 16}, {0, 16, 16}, {2, 16, 16}, {1, 16, 16}, {0, 15, 16}, {1, 13, 15},
     56         { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}},
     57 
     58     {{1, 1, 2}, {0, 0, 2}, {3, 4, 4}, {3, 3, 4}, {2, 2, 3}, {2, 2, 3}, {3, 6, 6}, {2, 3, 6},
     59         {1, 3, 6}, {0, 1, 6}, {3, 5, 5}, {3, 5, 5}, {1, 2, 5}, {1, 2, 5}, {3, 7, 6}, {2, 4, 6},
     60         {1, 4, 6}, {0, 2, 6}, {3, 8, 7}, {2, 5, 7}, {1, 5, 7}, {0, 3, 7}, {0, 5, 8}, {2, 6, 8},
     61         {1, 6, 8}, {0, 4, 8}, {3, 9, 9}, {2, 7, 9}, {1, 7, 9}, {0, 6, 9}, {3, 11, 11}, {2, 9, 11},
     62         {1, 9, 11}, {0, 8, 11}, {3, 10, 11}, {2, 8, 11}, {1, 8, 11}, {0, 7, 11}, {0, 11, 12}, {2, 11, 12},
     63         {1, 11, 12}, {0, 10, 12}, {3, 12, 12}, {2, 10, 12}, {1, 10, 12}, {0, 9, 12}, {3, 14, 13}, {2, 13, 13},
     64         {1, 13, 13}, {0, 13, 13}, {3, 13, 13}, {2, 12, 13}, {1, 12, 13}, {0, 12, 13}, {1, 15, 14}, {0, 15, 14},
     65         {2, 15, 14}, {1, 14, 14}, {2, 14, 13}, {2, 14, 13}, {0, 14, 13}, {0, 14, 13}, {3, 16, 14}, {2, 16, 14},
     66         {1, 16, 14}, {0, 16, 14}, {3, 15, 13}},
     67 
     68     {{3, 7, 4}, {3, 6, 4}, {3, 5, 4}, {3, 4, 4}, {3, 3, 4}, {2, 2, 4}, {1, 1, 4}, {0, 0, 4},
     69         {1, 5, 5}, {2, 5, 5}, {1, 4, 5}, {2, 4, 5}, {1, 3, 5}, {3, 8, 5}, {2, 3, 5}, {1, 2, 5},
     70         {0, 3, 6}, {2, 7, 6}, {1, 7, 6}, {0, 2, 6}, {3, 9, 6}, {2, 6, 6}, {1, 6, 6}, {0, 1, 6},
     71         {0, 7, 7}, {0, 6, 7}, {2, 9, 7}, {0, 5, 7}, {3, 10, 7}, {2, 8, 7}, {1, 8, 7}, {0, 4, 7},
     72         {3, 12, 8}, {2, 11, 8}, {1, 10, 8}, {0, 9, 8}, {3, 11, 8}, {2, 10, 8}, {1, 9, 8}, {0, 8, 8},
     73         {0, 12, 9}, {2, 13, 9}, {1, 12, 9}, {0, 11, 9}, {3, 13, 9}, {2, 12, 9}, {1, 11, 9}, {0, 10, 9},
     74         {1, 15, 10}, {0, 14, 10}, {3, 14, 10}, {2, 14, 10}, {1, 14, 10}, {0, 13, 10}, {1, 13, 9}, {1, 13, 9},
     75         {1, 16, 10}, {0, 15, 10}, {3, 15, 10}, {2, 15, 10}, {3, 16, 10}, {2, 16, 10}, {0, 16, 10}, { -1, -1, -1},
     76         { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1}}
     77 };
     78 
     79 
     80 const ShiftOffset NumCoeffTrailOnes_indx[3][15] =
     81 {
     82     {{15, -1}, {14, 0}, {13, 1}, {10, -1}, {9, 3}, {8, 7}, {7, 11}, {6, 15},
     83         {5, 19}, {3, 19}, {2, 27}, {1, 35}, {0, 43}, {0, 55}, {1, 62}},
     84 
     85     {{14, -2}, {12, -2}, {10, -2}, {10, 10}, {9, 14}, {8, 18}, {7, 22}, {5, 22},
     86         {4, 30}, {3, 38}, {2, 46}, {2, 58}, {3, 65}, {16, 0}, {16, 0}},
     87 
     88     {{12, -8}, {11, 0}, {10, 8}, {9, 16}, {8, 24}, {7, 32}, {6, 40}, {6, 52},
     89         {6, 58}, {6, 61}, {16, 0}, {16, 0}, {16, 0}, {16, 0}, {16, 0}}
     90 };
     91 
     92 const static int nC_table[8] = {0, 0, 1, 1, 2, 2, 2, 2};
     93 
     94 #endif
     95 /**
     96 See algorithm in subclause 9.1, Table 9-1, Table 9-2. */
     97 AVCDec_Status ue_v(AVCDecBitstream *bitstream, uint *codeNum)
     98 {
     99     uint temp, tmp_cnt;
    100     int leading_zeros = 0;
    101     BitstreamShowBits(bitstream, 16, &temp);
    102     tmp_cnt = temp  | 0x1;
    103 
    104     PV_CLZ(leading_zeros, tmp_cnt)
    105 
    106     if (leading_zeros < 8)
    107     {
    108         *codeNum = (temp >> (15 - (leading_zeros << 1))) - 1;
    109         BitstreamFlushBits(bitstream, (leading_zeros << 1) + 1);
    110     }
    111     else
    112     {
    113         BitstreamReadBits(bitstream, (leading_zeros << 1) + 1, &temp);
    114         *codeNum = temp - 1;
    115     }
    116 
    117     return AVCDEC_SUCCESS;
    118 }
    119 
    120 /**
    121 See subclause 9.1.1, Table 9-3 */
    122 AVCDec_Status  se_v(AVCDecBitstream *bitstream, int *value)
    123 {
    124     uint temp, tmp_cnt;
    125     int leading_zeros = 0;
    126     BitstreamShowBits(bitstream, 16, &temp);
    127     tmp_cnt = temp | 0x1;
    128 
    129     PV_CLZ(leading_zeros, tmp_cnt)
    130 
    131     if (leading_zeros < 8)
    132     {
    133         temp >>= (15 - (leading_zeros << 1));
    134         BitstreamFlushBits(bitstream, (leading_zeros << 1) + 1);
    135     }
    136     else
    137     {
    138         BitstreamReadBits(bitstream, (leading_zeros << 1) + 1, &temp);
    139     }
    140 
    141     *value = temp >> 1;
    142 
    143     if (temp & 0x01)                          // lsb is signed bit
    144         *value = -(*value);
    145 
    146 //  leading_zeros = temp >> 1;
    147 //  *value = leading_zeros - (leading_zeros*2*(temp&1));
    148 
    149     return AVCDEC_SUCCESS;
    150 }
    151 
    152 AVCDec_Status  se_v32bit(AVCDecBitstream *bitstream, int32 *value)
    153 {
    154     int leadingZeros;
    155     uint32 infobits;
    156     uint32 codeNum;
    157 
    158     if (AVCDEC_SUCCESS != GetEGBitstring32bit(bitstream, &leadingZeros, &infobits))
    159         return AVCDEC_FAIL;
    160 
    161     codeNum = (1 << leadingZeros) - 1 + infobits;
    162 
    163     *value = (codeNum + 1) / 2;
    164 
    165     if ((codeNum & 0x01) == 0)                        // lsb is signed bit
    166         *value = -(*value);
    167 
    168     return AVCDEC_SUCCESS;
    169 }
    170 
    171 
    172 AVCDec_Status te_v(AVCDecBitstream *bitstream, uint *value, uint range)
    173 {
    174     if (range > 1)
    175     {
    176         ue_v(bitstream, value);
    177     }
    178     else
    179     {
    180         BitstreamRead1Bit(bitstream, value);
    181         *value = 1 - (*value);
    182     }
    183     return AVCDEC_SUCCESS;
    184 }
    185 
    186 
    187 
    188 /* This function is only used for syntax with range from -2^31 to 2^31-1 */
    189 /* only a few of them in the SPS and PPS */
    190 AVCDec_Status GetEGBitstring32bit(AVCDecBitstream *bitstream, int *leadingZeros, uint32 *infobits)
    191 {
    192     int bit_value;
    193     uint info_temp;
    194 
    195     *leadingZeros = 0;
    196 
    197     BitstreamRead1Bit(bitstream, (uint*)&bit_value);
    198 
    199     while (!bit_value)
    200     {
    201         (*leadingZeros)++;
    202         BitstreamRead1Bit(bitstream, (uint*)&bit_value);
    203     }
    204 
    205     if (*leadingZeros > 0)
    206     {
    207         if (sizeof(uint) == 4)  /* 32 bit machine */
    208         {
    209             BitstreamReadBits(bitstream, *leadingZeros, (uint*)&info_temp);
    210             *infobits = (uint32)info_temp;
    211         }
    212         else if (sizeof(uint) == 2) /* 16 bit machine */
    213         {
    214             *infobits = 0;
    215             if (*leadingZeros > 16)
    216             {
    217                 BitstreamReadBits(bitstream, 16, (uint*)&info_temp);
    218                 (*leadingZeros) -= 16;
    219                 *infobits = ((uint32)info_temp) << (*leadingZeros);
    220             }
    221 
    222             BitstreamReadBits(bitstream, *leadingZeros, (uint*)&info_temp);
    223             *infobits |= (uint32)info_temp ;
    224         }
    225     }
    226     else
    227         *infobits = 0;
    228 
    229     return AVCDEC_SUCCESS;
    230 }
    231 
    232 /* see Table 9-4 assignment of codeNum to values of coded_block_pattern. */
    233 const static uint8 MapCBP[48][2] =
    234 {
    235     {47, 0}, {31, 16}, {15, 1}, { 0, 2}, {23, 4}, {27, 8}, {29, 32}, {30, 3}, { 7, 5}, {11, 10}, {13, 12}, {14, 15},
    236     {39, 47}, {43, 7}, {45, 11}, {46, 13}, {16, 14}, { 3, 6}, { 5, 9}, {10, 31}, {12, 35}, {19, 37}, {21, 42}, {26, 44},
    237     {28, 33}, {35, 34}, {37, 36}, {42, 40}, {44, 39}, { 1, 43}, { 2, 45}, { 4, 46}, { 8, 17}, {17, 18}, {18, 20}, {20, 24},
    238     {24, 19}, { 6, 21}, { 9, 26}, {22, 28}, {25, 23}, {32, 27}, {33, 29}, {34, 30}, {36, 22}, {40, 25}, {38, 38}, {41, 41},
    239 };
    240 
    241 AVCDec_Status DecodeCBP(AVCMacroblock *currMB, AVCDecBitstream *stream)
    242 {
    243     uint codeNum;
    244     uint coded_block_pattern;
    245 
    246     ue_v(stream, &codeNum);
    247 
    248     if (codeNum > 47)
    249     {
    250         return AVCDEC_FAIL;
    251     }
    252 
    253     /* can get rid of the if _OPTIMIZE */
    254     if (currMB->mbMode == AVC_I4)
    255     {
    256         coded_block_pattern = MapCBP[codeNum][0];
    257     }
    258     else
    259     {
    260         coded_block_pattern = MapCBP[codeNum][1];
    261     }
    262 
    263 //  currMB->cbpL = coded_block_pattern&0xF;  /* modulo 16 */
    264 //  currMB->cbpC = coded_block_pattern>>4;   /* divide 16 */
    265     currMB->CBP = coded_block_pattern;
    266 
    267     return AVCDEC_SUCCESS;
    268 }
    269 
    270 
    271 /* TO BE OPTIMIZED !!!!! */
    272 AVCDec_Status ce_TotalCoeffTrailingOnes(AVCDecBitstream *stream, int *TrailingOnes, int *TotalCoeff, int nC)
    273 {
    274 #ifdef PV_NO_CLZ
    275     const static uint8 TotCofNTrail1[75][3] = {{0, 0, 16}/*error */, {0, 0, 16}/*error */, {1, 13, 15}, {1, 13, 15}, {0, 16, 16}, {2, 16, 16}, {1, 16, 16}, {0, 15, 16},
    276         {3, 16, 16}, {2, 15, 16}, {1, 15, 16}, {0, 14, 16}, {3, 15, 16}, {2, 14, 16}, {1, 14, 16}, {0, 13, 16},
    277         {3, 14, 15}, {2, 13, 15}, {1, 12, 15}, {0, 12, 15}, {3, 13, 15}, {2, 12, 15}, {1, 11, 15}, {0, 11, 15},
    278         {3, 12, 14}, {2, 11, 14}, {1, 10, 14}, {0, 10, 14}, {3, 11, 14}, {2, 10, 14}, {1, 9, 14}, {0, 9, 14},
    279         {0, 8, 13}, {2, 9, 13}, {1, 8, 13}, {0, 7, 13}, {3, 10, 13}, {2, 8, 13}, {1, 7, 13}, {0, 6, 13},
    280         {3, 9, 11}, {2, 7, 11}, {1, 6, 11}, {0, 5, 11}, {3, 8, 10},
    281         {2, 6, 10}, {1, 5, 10}, {0, 4, 10}, {3, 7, 9}, {2, 5, 9}, {1, 4, 9}, {0, 3, 9}, {3, 6, 8},
    282         {2, 4, 8}, {1, 3, 8}, {0, 2, 8}, {3, 5, 7}, {2, 3, 7}, {3, 4, 6}, {3, 4, 6}, {1, 2, 6},
    283         {1, 2, 6}, {0, 1, 6}, {0, 1, 6}, {3, 3, 5}, {3, 3, 5}, {3, 3, 5}, {3, 3, 5}, {2, 2, 3},
    284         {1, 1, 2}, {1, 1, 2}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1}
    285     };
    286 
    287     const static uint8 TotCofNTrail2[84][3] = {{0, 0, 14 /* error */}, {0, 0, 14/*error */}, {3, 15, 13}, {3, 15, 13}, {3, 16, 14}, {2, 16, 14}, {1, 16, 14}, {0, 16, 14},
    288         {1, 15, 14}, {0, 15, 14}, {2, 15, 14}, {1, 14, 14}, {2, 14, 13}, {2, 14, 13}, {0, 14, 13}, {0, 14, 13},
    289         {3, 14, 13}, {2, 13, 13}, {1, 13, 13}, {0, 13, 13}, {3, 13, 13}, {2, 12, 13}, {1, 12, 13}, {0, 12, 13},
    290         {0, 11, 12}, {2, 11, 12}, {1, 11, 12}, {0, 10, 12}, {3, 12, 12}, {2, 10, 12}, {1, 10, 12}, {0, 9, 12},
    291         {3, 11, 11}, {2, 9, 11}, {1, 9, 11}, {0, 8, 11}, {3, 10, 11}, {2, 8, 11}, {1, 8, 11}, {0, 7, 11},
    292         {3, 9, 9}, {2, 7, 9}, {1, 7, 9}, {0, 6, 9}, {0, 5, 8}, {0, 5, 8}, {2, 6, 8}, {2, 6, 8},
    293         {1, 6, 8}, {1, 6, 8}, {0, 4, 8}, {0, 4, 8}, {3, 8, 7}, {2, 5, 7}, {1, 5, 7}, {0, 3, 7},
    294         {3, 7, 6}, {3, 7, 6}, {2, 4, 6}, {2, 4, 6}, {1, 4, 6}, {1, 4, 6}, {0, 2, 6}, {0, 2, 6},
    295         {3, 6, 6}, {2, 3, 6}, {1, 3, 6}, {0, 1, 6}, {3, 5, 5}, {3, 5, 5}, {1, 2, 5}, {1, 2, 5},
    296         {3, 4, 4}, {3, 3, 4}, {2, 2, 3}, {2, 2, 3}, {1, 1, 2}, {1, 1, 2}, {1, 1, 2}, {1, 1, 2},
    297         {0, 0, 2}, {0, 0, 2}, {0, 0, 2}, {0, 0, 2}
    298     };
    299 
    300     const static uint8 TotCofNTrail3[64][3] = {{0, 0, 10/*error*/}, {0, 16, 10}, {3, 16, 10}, {2, 16, 10}, {1, 16, 10}, {0, 15, 10}, {3, 15, 10},
    301         {2, 15, 10}, {1, 15, 10}, {0, 14, 10}, {3, 14, 10}, {2, 14, 10}, {1, 14, 10}, {0, 13, 10}, {1, 13, 9},
    302         {1, 13, 9}, {0, 12, 9}, {2, 13, 9}, {1, 12, 9}, {0, 11, 9}, {3, 13, 9}, {2, 12, 9}, {1, 11, 9},
    303         {0, 10, 9}, {3, 12, 8}, {2, 11, 8}, {1, 10, 8}, {0, 9, 8}, {3, 11, 8}, {2, 10, 8}, {1, 9, 8},
    304         {0, 8, 8}, {0, 7, 7}, {0, 6, 7}, {2, 9, 7}, {0, 5, 7}, {3, 10, 7}, {2, 8, 7}, {1, 8, 7},
    305         {0, 4, 7}, {0, 3, 6}, {2, 7, 6}, {1, 7, 6}, {0, 2, 6}, {3, 9, 6}, {2, 6, 6}, {1, 6, 6},
    306         {0, 1, 6}, {1, 5, 5}, {2, 5, 5}, {1, 4, 5}, {2, 4, 5}, {1, 3, 5}, {3, 8, 5}, {2, 3, 5},
    307         {1, 2, 5}, {3, 7, 4}, {3, 6, 4}, {3, 5, 4}, {3, 4, 4}, {3, 3, 4}, {2, 2, 4}, {1, 1, 4},
    308         {0, 0, 4}
    309     };
    310 #endif
    311     uint code;
    312 
    313 #ifdef PV_NO_CLZ
    314     uint8 *pcode;
    315     if (nC < 2)
    316     {
    317         BitstreamShowBits(stream, 16, &code);
    318 
    319         if (code >= 8192)
    320         {
    321             pcode = (uint8*) & (TotCofNTrail1[(code>>13)+65+2][0]);
    322         }
    323         else if (code >= 2048)
    324         {
    325             pcode = (uint8*) & (TotCofNTrail1[(code>>9)+50+2][0]);
    326         }
    327         else if (code >= 1024)
    328         {
    329             pcode = (uint8*) & (TotCofNTrail1[(code>>8)+46+2][0]);
    330         }
    331         else if (code >= 512)
    332         {
    333             pcode = (uint8*) & (TotCofNTrail1[(code>>7)+42+2][0]);
    334         }
    335         else if (code >= 256)
    336         {
    337             pcode = (uint8*) & (TotCofNTrail1[(code>>6)+38+2][0]);
    338         }
    339         else if (code >= 128)
    340         {
    341             pcode = (uint8*) & (TotCofNTrail1[(code>>5)+34+2][0]);
    342         }
    343         else if (code >= 64)
    344         {
    345             pcode = (uint8*) & (TotCofNTrail1[(code>>3)+22+2][0]);
    346         }
    347         else if (code >= 32)
    348         {
    349             pcode = (uint8*) & (TotCofNTrail1[(code>>2)+14+2][0]);
    350         }
    351         else if (code >= 16)
    352         {
    353             pcode = (uint8*) & (TotCofNTrail1[(code>>1)+6+2][0]);
    354         }
    355         else
    356         {
    357             pcode = (uint8*) & (TotCofNTrail1[(code-2)+2][0]);
    358         }
    359 
    360         *TrailingOnes = pcode[0];
    361         *TotalCoeff = pcode[1];
    362 
    363         BitstreamFlushBits(stream, pcode[2]);
    364     }
    365     else if (nC < 4)
    366     {
    367         BitstreamShowBits(stream, 14, &code);
    368 
    369         if (code >= 4096)
    370         {
    371             pcode = (uint8*) & (TotCofNTrail2[(code>>10)+66+2][0]);
    372         }
    373         else if (code >= 2048)
    374         {
    375             pcode = (uint8*) & (TotCofNTrail2[(code>>8)+54+2][0]);
    376         }
    377         else if (code >= 512)
    378         {
    379             pcode = (uint8*) & (TotCofNTrail2[(code>>7)+46+2][0]);
    380         }
    381         else if (code >= 128)
    382         {
    383             pcode = (uint8*) & (TotCofNTrail2[(code>>5)+34+2][0]);
    384         }
    385         else if (code >= 64)
    386         {
    387             pcode = (uint8*) & (TotCofNTrail2[(code>>3)+22+2][0]);
    388         }
    389         else if (code >= 32)
    390         {
    391             pcode = (uint8*) & (TotCofNTrail2[(code>>2)+14+2][0]);
    392         }
    393         else if (code >= 16)
    394         {
    395             pcode = (uint8*) & (TotCofNTrail2[(code>>1)+6+2][0]);
    396         }
    397         else
    398         {
    399             pcode = (uint8*) & (TotCofNTrail2[code-2+2][0]);
    400         }
    401         *TrailingOnes = pcode[0];
    402         *TotalCoeff = pcode[1];
    403 
    404         BitstreamFlushBits(stream, pcode[2]);
    405     }
    406     else if (nC < 8)
    407     {
    408         BitstreamShowBits(stream, 10, &code);
    409 
    410         if (code >= 512)
    411         {
    412             pcode = (uint8*) & (TotCofNTrail3[(code>>6)+47+1][0]);
    413         }
    414         else if (code >= 256)
    415         {
    416             pcode = (uint8*) & (TotCofNTrail3[(code>>5)+39+1][0]);
    417         }
    418         else if (code >= 128)
    419         {
    420             pcode = (uint8*) & (TotCofNTrail3[(code>>4)+31+1][0]);
    421         }
    422         else if (code >= 64)
    423         {
    424             pcode = (uint8*) & (TotCofNTrail3[(code>>3)+23+1][0]);
    425         }
    426         else if (code >= 32)
    427         {
    428             pcode = (uint8*) & (TotCofNTrail3[(code>>2)+15+1][0]);
    429         }
    430         else if (code >= 16)
    431         {
    432             pcode = (uint8*) & (TotCofNTrail3[(code>>1)+7+1][0]);
    433         }
    434         else
    435         {
    436             pcode = (uint8*) & (TotCofNTrail3[code-1+1][0]);
    437         }
    438         *TrailingOnes = pcode[0];
    439         *TotalCoeff = pcode[1];
    440 
    441         BitstreamFlushBits(stream, pcode[2]);
    442     }
    443     else
    444     {
    445         /* read 6 bit FLC */
    446         BitstreamReadBits(stream, 6, &code);
    447 
    448 
    449         *TrailingOnes = code & 3;
    450         *TotalCoeff = (code >> 2) + 1;
    451 
    452         if (*TotalCoeff > 16)
    453         {
    454             *TotalCoeff = 16;  // _ERROR
    455         }
    456 
    457         if (code == 3)
    458         {
    459             *TrailingOnes = 0;
    460             (*TotalCoeff)--;
    461         }
    462     }
    463 #else
    464     const VLCNumCoeffTrail *ptr;
    465     const ShiftOffset *ptr_indx;
    466     uint temp, leading_zeros = 0;
    467 
    468     if (nC < 8)
    469     {
    470 
    471         BitstreamShowBits(stream, 16, &code);
    472         temp = code | 1;
    473 
    474         PV_CLZ(leading_zeros, temp)
    475 
    476         temp = nC_table[nC];
    477         ptr_indx = &NumCoeffTrailOnes_indx[temp][leading_zeros];
    478         ptr = &NumCoeffTrailOnes[temp][(code >> ptr_indx->shift) + ptr_indx->offset];
    479         *TrailingOnes = ptr->trailing;
    480         *TotalCoeff = ptr->total_coeff;
    481         BitstreamFlushBits(stream, ptr->length);
    482     }
    483     else
    484     {
    485         /* read 6 bit FLC */
    486         BitstreamReadBits(stream, 6, &code);
    487 
    488 
    489         *TrailingOnes = code & 3;
    490         *TotalCoeff = (code >> 2) + 1;
    491 
    492         if (*TotalCoeff > 16)
    493         {
    494             *TotalCoeff = 16;  // _ERROR
    495         }
    496 
    497         if (code == 3)
    498         {
    499             *TrailingOnes = 0;
    500             (*TotalCoeff)--;
    501         }
    502     }
    503 #endif
    504     return AVCDEC_SUCCESS;
    505 }
    506 
    507 /* TO BE OPTIMIZED !!!!! */
    508 AVCDec_Status ce_TotalCoeffTrailingOnesChromaDC(AVCDecBitstream *stream, int *TrailingOnes, int *TotalCoeff)
    509 {
    510     AVCDec_Status status;
    511 
    512     const static uint8 TotCofNTrail5[21][3] =
    513     {
    514         {3, 4, 7}, {3, 4, 7}, {2, 4, 8}, {1, 4, 8}, {2, 3, 7}, {2, 3, 7}, {1, 3, 7},
    515         {1, 3, 7}, {0, 4, 6}, {0, 3, 6}, {0, 2, 6}, {3, 3, 6}, {1, 2, 6}, {0, 1, 6},
    516         {2, 2, 3}, {0, 0, 2}, {0, 0, 2}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}, {1, 1, 1}
    517     };
    518 
    519     uint code;
    520     uint8 *pcode;
    521 
    522     status = BitstreamShowBits(stream, 8, &code);
    523 
    524     if (code >= 32)
    525     {
    526         pcode = (uint8*) & (TotCofNTrail5[(code>>5)+13][0]);
    527     }
    528     else if (code >= 8)
    529     {
    530         pcode = (uint8*) & (TotCofNTrail5[(code>>2)+6][0]);
    531     }
    532     else
    533     {
    534         pcode = (uint8*) & (TotCofNTrail5[code][0]);
    535     }
    536 
    537     *TrailingOnes = pcode[0];
    538     *TotalCoeff = pcode[1];
    539 
    540     BitstreamFlushBits(stream, pcode[2]);
    541 
    542     return status;
    543 }
    544 
    545 /* see Table 9-6 */
    546 AVCDec_Status ce_LevelPrefix(AVCDecBitstream *stream, uint *code)
    547 {
    548     uint temp;
    549     uint leading_zeros = 0;
    550     BitstreamShowBits(stream, 16, &temp);
    551     temp |= 1 ;
    552 
    553     PV_CLZ(leading_zeros, temp)
    554 
    555     BitstreamFlushBits(stream, leading_zeros + 1);
    556     *code = leading_zeros;
    557     return AVCDEC_SUCCESS;
    558 }
    559 
    560 /* see Table 9-7 and 9-8 */
    561 AVCDec_Status ce_TotalZeros(AVCDecBitstream *stream, int *code, int TotalCoeff)
    562 {
    563     const static uint8 TotZero1[28][2] = {{15, 9}, {14, 9}, {13, 9}, {12, 8},
    564         {12, 8}, {11, 8}, {11, 8}, {10, 7}, {9, 7}, {8, 6}, {8, 6}, {7, 6}, {7, 6}, {6, 5}, {6, 5},
    565         {6, 5}, {6, 5}, {5, 5}, {5, 5}, {5, 5}, {5, 5}, {4, 4}, {3, 4},
    566         {2, 3}, {2, 3}, {1, 3}, {1, 3}, {0, 1}
    567     };
    568 
    569     const static uint8 TotZero2n3[2][18][2] = {{{14, 6}, {13, 6}, {12, 6}, {11, 6},
    570             {10, 5}, {10, 5}, {9, 5}, {9, 5}, {8, 4}, {7, 4}, {6, 4}, {5, 4}, {4, 3}, {4, 3},
    571             {3, 3}, {2, 3}, {1, 3}, {0, 3}},
    572 
    573         /*const static uint8 TotZero3[18][2]=*/{{13, 6}, {11, 6}, {12, 5}, {12, 5}, {10, 5},
    574             {10, 5}, {9, 5}, {9, 5}, {8, 4}, {5, 4}, {4, 4}, {0, 4}, {7, 3}, {7, 3}, {6, 3}, {3, 3},
    575             {2, 3}, {1, 3}}
    576     };
    577 
    578     const static uint8 TotZero4[17][2] = {{12, 5}, {11, 5}, {10, 5}, {0, 5}, {9, 4},
    579         {9, 4}, {7, 4}, {7, 4}, {3, 4}, {3, 4}, {2, 4}, {2, 4}, {8, 3}, {6, 3}, {5, 3}, {4, 3}, {1, 3}
    580     };
    581 
    582     const static uint8 TotZero5[13][2] = {{11, 5}, {9, 5}, {10, 4}, {8, 4}, {2, 4},
    583         {1, 4}, {0, 4}, {7, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}
    584     };
    585 
    586     const static uint8 TotZero6to10[5][15][2] = {{{10, 6}, {0, 6}, {1, 5}, {1, 5}, {8, 4},
    587             {8, 4}, {8, 4}, {8, 4}, {9, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}, {2, 3}},
    588 
    589         /*const static uint8 TotZero7[15][2]=*/{{9, 6}, {0, 6}, {1, 5}, {1, 5}, {7, 4},
    590             {7, 4}, {7, 4}, {7, 4}, {8, 3}, {6, 3}, {4, 3}, {3, 3}, {2, 3}, {5, 2}, {5, 2}},
    591 
    592         /*const static uint8 TotZero8[15][2]=*/{{8, 6}, {0, 6}, {2, 5}, {2, 5}, {1, 4},
    593             {1, 4}, {1, 4}, {1, 4}, {7, 3}, {6, 3}, {3, 3}, {5, 2}, {5, 2}, {4, 2}, {4, 2}},
    594 
    595         /*const static uint8 TotZero9[15][2]=*/{{1, 6}, {0, 6}, {7, 5}, {7, 5}, {2, 4},
    596             {2, 4}, {2, 4}, {2, 4}, {5, 3}, {6, 2}, {6, 2}, {4, 2}, {4, 2}, {3, 2}, {3, 2}},
    597 
    598         /*const static uint8 TotZero10[11][2]=*/{{1, 5}, {0, 5}, {6, 4}, {6, 4}, {2, 3},
    599             {2, 3}, {2, 3}, {2, 3}, {5, 2}, {4, 2}, {3, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}
    600     };
    601 
    602     const static uint8 TotZero11[7][2] = {{0, 4}, {1, 4}, {2, 3}, {2, 3}, {3, 3}, {5, 3}, {4, 1}};
    603 
    604     const static uint8 TotZero12to15[4][5][2] =
    605     {
    606         {{3, 1}, {2, 2}, {4, 3}, {1, 4}, {0, 4}},
    607         {{2, 1}, {3, 2}, {1, 3}, {0, 3}, {0, 0}},
    608         {{2, 1}, {1, 2}, {0, 2}, {0, 0}, {0, 0}},
    609         {{1, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}}
    610     };
    611 
    612     uint temp, mask;
    613     int indx;
    614     uint8 *pcode;
    615 
    616     if (TotalCoeff == 1)
    617     {
    618         BitstreamShowBits(stream, 9, &temp);
    619 
    620         if (temp >= 256)
    621         {
    622             pcode = (uint8*) & (TotZero1[27][0]);
    623         }
    624         else if (temp >= 64)
    625         {
    626             pcode = (uint8*) & (TotZero1[(temp>>5)+19][0]);
    627         }
    628         else if (temp >= 8)
    629         {
    630             pcode = (uint8*) & (TotZero1[(temp>>2)+5][0]);
    631         }
    632         else
    633         {
    634             pcode = (uint8*) & (TotZero1[temp-1][0]);
    635         }
    636 
    637     }
    638     else if (TotalCoeff == 2 || TotalCoeff == 3)
    639     {
    640         BitstreamShowBits(stream, 6, &temp);
    641 
    642         if (temp >= 32)
    643         {
    644             pcode = (uint8*) & (TotZero2n3[TotalCoeff-2][(temp>>3)+10][0]);
    645         }
    646         else if (temp >= 8)
    647         {
    648             pcode = (uint8*) & (TotZero2n3[TotalCoeff-2][(temp>>2)+6][0]);
    649         }
    650         else
    651         {
    652             pcode = (uint8*) & (TotZero2n3[TotalCoeff-2][temp][0]);
    653         }
    654     }
    655     else if (TotalCoeff == 4)
    656     {
    657         BitstreamShowBits(stream, 5, &temp);
    658 
    659         if (temp >= 12)
    660         {
    661             pcode = (uint8*) & (TotZero4[(temp>>2)+9][0]);
    662         }
    663         else
    664         {
    665             pcode = (uint8*) & (TotZero4[temp][0]);
    666         }
    667     }
    668     else if (TotalCoeff == 5)
    669     {
    670         BitstreamShowBits(stream, 5, &temp);
    671 
    672         if (temp >= 16)
    673         {
    674             pcode = (uint8*) & (TotZero5[(temp>>2)+5][0]);
    675         }
    676         else if (temp >= 2)
    677         {
    678             pcode = (uint8*) & (TotZero5[(temp>>1)+1][0]);
    679         }
    680         else
    681         {
    682             pcode = (uint8*) & (TotZero5[temp][0]);
    683         }
    684     }
    685     else if (TotalCoeff >= 6 && TotalCoeff <= 10)
    686     {
    687         if (TotalCoeff == 10)
    688         {
    689             BitstreamShowBits(stream, 5, &temp);
    690         }
    691         else
    692         {
    693             BitstreamShowBits(stream, 6, &temp);
    694         }
    695 
    696 
    697         if (temp >= 8)
    698         {
    699             pcode = (uint8*) & (TotZero6to10[TotalCoeff-6][(temp>>3)+7][0]);
    700         }
    701         else
    702         {
    703             pcode = (uint8*) & (TotZero6to10[TotalCoeff-6][temp][0]);
    704         }
    705     }
    706     else if (TotalCoeff == 11)
    707     {
    708         BitstreamShowBits(stream, 4, &temp);
    709 
    710 
    711         if (temp >= 8)
    712         {
    713             pcode = (uint8*) & (TotZero11[6][0]);
    714         }
    715         else if (temp >= 4)
    716         {
    717             pcode = (uint8*) & (TotZero11[(temp>>1)+2][0]);
    718         }
    719         else
    720         {
    721             pcode = (uint8*) & (TotZero11[temp][0]);
    722         }
    723     }
    724     else
    725     {
    726         BitstreamShowBits(stream, (16 - TotalCoeff), &temp);
    727         mask = 1 << (15 - TotalCoeff);
    728         indx = 0;
    729         while ((temp&mask) == 0 && indx < (16 - TotalCoeff)) /* search location of 1 bit */
    730         {
    731             mask >>= 1;
    732             indx++;
    733         }
    734 
    735         pcode = (uint8*) & (TotZero12to15[TotalCoeff-12][indx]);
    736     }
    737 
    738     *code = pcode[0];
    739     BitstreamFlushBits(stream, pcode[1]);
    740 
    741     return AVCDEC_SUCCESS;
    742 }
    743 
    744 /* see Table 9-9 */
    745 AVCDec_Status ce_TotalZerosChromaDC(AVCDecBitstream *stream, int *code, int TotalCoeff)
    746 {
    747     const static uint8 TotZeroChrom1to3[3][8][2] =
    748     {
    749         {{3, 3}, {2, 3}, {1, 2}, {1, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}},
    750         {{2, 2}, {2, 2}, {1, 2}, {1, 2}, {0, 1}, {0, 1}, {0, 1}, {0, 1}},
    751         {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}},
    752     };
    753 
    754 
    755     uint temp;
    756     uint8 *pcode;
    757 
    758     BitstreamShowBits(stream, 3, &temp);
    759     pcode = (uint8*) & (TotZeroChrom1to3[TotalCoeff-1][temp]);
    760 
    761     *code = pcode[0];
    762 
    763     BitstreamFlushBits(stream, pcode[1]);
    764 
    765     return AVCDEC_SUCCESS;
    766 }
    767 
    768 /* see Table 9-10 */
    769 AVCDec_Status ce_RunBefore(AVCDecBitstream *stream, int *code, int zerosLeft)
    770 {
    771     const static int codlen[6] = {1, 2, 2, 3, 3, 3}; /* num bits to read */
    772     const static uint8 RunBeforeTab[6][8][2] = {{{1, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
    773         /*const static int RunBefore2[4][2]=*/{{2, 2}, {1, 2}, {0, 1}, {0, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
    774         /*const static int RunBefore3[4][2]=*/{{3, 2}, {2, 2}, {1, 2}, {0, 2}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
    775         /*const static int RunBefore4[7][2]=*/{{4, 3}, {3, 3}, {2, 2}, {2, 2}, {1, 2}, {1, 2}, {0, 2}, {0, 2}},
    776         /*const static int RunBefore5[7][2]=*/{{5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 2}, {1, 2}, {0, 2}, {0, 2}},
    777         /*const static int RunBefore6[7][2]=*/{{1, 3}, {2, 3}, {4, 3}, {3, 3}, {6, 3}, {5, 3}, {0, 2}, {0, 2}}
    778     };
    779 
    780     uint temp;
    781     uint8 *pcode;
    782     int indx;
    783 
    784     if (zerosLeft <= 6)
    785     {
    786         BitstreamShowBits(stream, codlen[zerosLeft-1], &temp);
    787 
    788         pcode = (uint8*) & (RunBeforeTab[zerosLeft-1][temp][0]);
    789 
    790         *code = pcode[0];
    791 
    792         BitstreamFlushBits(stream, pcode[1]);
    793     }
    794     else
    795     {
    796         BitstreamReadBits(stream, 3, &temp);
    797         if (temp)
    798         {
    799             *code = 7 - temp;
    800         }
    801         else
    802         {
    803             BitstreamShowBits(stream, 9, &temp);
    804             temp <<= 7;
    805             temp |= 1;
    806             indx = 0;
    807             PV_CLZ(indx, temp)
    808             *code = 7 + indx;
    809             BitstreamFlushBits(stream, indx + 1);
    810         }
    811     }
    812 
    813 
    814     return AVCDEC_SUCCESS;
    815 }
    816