Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 /*!
     21  ***************************************************************************
     22  * \file ih264d_parse_cavlc.c
     23  *
     24  * \brief
     25  *    This file contains UVLC related functions.
     26  *
     27  * \date
     28  *    20/11/2002
     29  *
     30  * \author  NS
     31  ***************************************************************************
     32  */
     33 
     34 #include <string.h>
     35 #include <stdio.h>
     36 
     37 #include "ih264d_bitstrm.h"
     38 #include "ih264d_parse_cavlc.h"
     39 #include "ih264d_error_handler.h"
     40 #include "ih264d_defs.h"
     41 #include "ih264d_debug.h"
     42 #include "ih264d_cabac.h"
     43 #include "ih264d_structs.h"
     44 #include "ih264d_tables.h"
     45 #include "ih264d_tables.h"
     46 #include "ih264d_mb_utils.h"
     47 
     48 void ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t *ps_tu_4x4,
     49                                       WORD16 *pi2_out_coeff_data,
     50                                       UWORD8 *pu1_inv_scan);
     51 
     52 /*****************************************************************************/
     53 /*                                                                           */
     54 /*  Function Name : ih264d_uev                                                  */
     55 /*                                                                           */
     56 /*  Description   : Reads the unsigned Exp Golomb codec syntax from the      */
     57 /*                  ps_bitstrm as specified in section 9.1 of H264 standard      */
     58 /*                  It also increases bitstream u4_ofst by the number of bits */
     59 /*                  parsed for UEV decode operation                          */
     60 /*                                                                           */
     61 /*  Inputs        : bitstream base pointer and bitsream u4_ofst in bits       */
     62 /*  Globals       : None                                                     */
     63 /*  Processing    :                                                          */
     64 /*  Outputs       : UEV decoded syntax element and incremented ps_bitstrm u4_ofst */
     65 /*  Returns       : UEV decoded syntax element                               */
     66 /*                                                                           */
     67 /*  Issues        : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size  */
     68 /*                  for performamce. Caller might have to do error resilence */
     69 /*                  check for bitstream overflow                             */
     70 /*                                                                           */
     71 /*  Revision History:                                                        */
     72 /*                                                                           */
     73 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
     74 /*         19 09 2008   Jay          Draft                                   */
     75 /*                                                                           */
     76 /*****************************************************************************/
     77 UWORD32 ih264d_uev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
     78 {
     79     UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
     80     UWORD32 u4_word, u4_ldz;
     81 
     82     /***************************************************************/
     83     /* Find leading zeros in next 32 bits                          */
     84     /***************************************************************/
     85     NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
     86     u4_ldz = CLZ(u4_word);
     87     /* Flush the ps_bitstrm */
     88     u4_bitstream_offset += (u4_ldz + 1);
     89     /* Read the suffix from the ps_bitstrm */
     90     u4_word = 0;
     91     if(u4_ldz)
     92         GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
     93     *pu4_bitstrm_ofst = u4_bitstream_offset;
     94     return ((1 << u4_ldz) + u4_word - 1);
     95 }
     96 
     97 /*****************************************************************************/
     98 /*                                                                           */
     99 /*  Function Name : ih264d_sev                                                  */
    100 /*                                                                           */
    101 /*  Description   : Reads the signed Exp Golomb codec syntax from the ps_bitstrm */
    102 /*                  as specified in section 9.1 of H264 standard.            */
    103 /*                  It also increases bitstream u4_ofst by the number of bits */
    104 /*                  parsed for SEV decode operation                          */
    105 /*                                                                           */
    106 /*  Inputs        : bitstream base pointer and bitsream u4_ofst in bits       */
    107 /*  Globals       : None                                                     */
    108 /*  Processing    :                                                          */
    109 /*  Outputs       : SEV decoded syntax element and incremented ps_bitstrm u4_ofst */
    110 /*  Returns       : SEV decoded syntax element                               */
    111 /*                                                                           */
    112 /*  Issues        : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size  */
    113 /*                  for performamce. Caller might have to do error resilence */
    114 /*                  check for bitstream overflow                             */
    115 /*                                                                           */
    116 /*  Revision History:                                                        */
    117 /*                                                                           */
    118 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    119 /*         19 09 2008   Jay          Draft                                   */
    120 /*                                                                           */
    121 /*****************************************************************************/
    122 WORD32 ih264d_sev(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
    123 {
    124     UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    125     UWORD32 u4_word, u4_ldz, u4_abs_val;
    126 
    127     /***************************************************************/
    128     /* Find leading zeros in next 32 bits                          */
    129     /***************************************************************/
    130     NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    131     u4_ldz = CLZ(u4_word);
    132 
    133     /* Flush the ps_bitstrm */
    134     u4_bitstream_offset += (u4_ldz + 1);
    135 
    136     /* Read the suffix from the ps_bitstrm */
    137     u4_word = 0;
    138     if(u4_ldz)
    139         GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
    140 
    141     *pu4_bitstrm_ofst = u4_bitstream_offset;
    142     u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
    143 
    144     if(u4_word & 0x1)
    145         return (-(WORD32)u4_abs_val);
    146     else
    147         return (u4_abs_val);
    148 }
    149 
    150 /*****************************************************************************/
    151 /*                                                                           */
    152 /*  Function Name : get_tev_range_1                                          */
    153 /*                                                                           */
    154 /*  Description   : Reads the TEV Exp Golomb codec syntax from the ps_bitstrm    */
    155 /*                  as specified in section 9.1 of H264 standard. This will  */
    156 /*                  called only when the input range is 1 for TEV decode.    */
    157 /*                  If range is more than 1, then UEV decode is done         */
    158 /*                                                                           */
    159 /*  Inputs        : bitstream base pointer and bitsream u4_ofst in bits       */
    160 /*  Globals       : None                                                     */
    161 /*  Processing    :                                                          */
    162 /*  Outputs       : TEV decoded syntax element and incremented ps_bitstrm u4_ofst */
    163 /*  Returns       : TEV decoded syntax element                               */
    164 /*                                                                           */
    165 /*  Issues        : Does not check if ps_bitstrm u4_ofst exceeds max ps_bitstrm i4_size  */
    166 /*                  for performamce. Caller might have to do error resilence */
    167 /*                  check for bitstream overflow                             */
    168 /*                                                                           */
    169 /*  Revision History:                                                        */
    170 /*                                                                           */
    171 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    172 /*         19 09 2008   Jay          Draft                                   */
    173 /*                                                                           */
    174 /*****************************************************************************/
    175 UWORD32 ih264d_tev_range1(UWORD32 *pu4_bitstrm_ofst, UWORD32 *pu4_bitstrm_buf)
    176 {
    177     UWORD32 u4_code;
    178     GETBIT(u4_code, *pu4_bitstrm_ofst, pu4_bitstrm_buf);
    179     return (!u4_code);
    180 }
    181 
    182 /*!
    183  **************************************************************************
    184  * \if Function name : ih264d_uvlc \endif
    185  *
    186  * \brief
    187  *
    188  *    Reads the unsigned/signed/truncated integer Exp-Golomb-coded syntax element
    189  *    with the left bit first. The parsing process for this descriptor is specified
    190  *    in subclause 9.1.
    191  *
    192  * \param ps_bitstrm       : Pointer to Bitstream Structure .
    193  * \param u4_range           : Range value in case of Truncated Exp-Golomb-code
    194  * \param pi_bitstrm_ofst : Pointer to the local copy of Bitstream u4_ofst
    195  * \param u1_flag            : Flag indicating the case of UEV,SEV or TEV
    196  * \param u4_bitstrm_ofst : Local copy of Bitstream u4_ofst
    197  * \param pu4_bitstrm_buf : Pointer to the Bitstream buffer
    198  *
    199  * \return
    200  *    Returns Code Value.
    201  *
    202  **************************************************************************
    203  */
    204 
    205 WORD32 ih264d_uvlc(dec_bit_stream_t *ps_bitstrm,
    206                    UWORD32 u4_range,
    207                    UWORD32 *pi_bitstrm_ofst,
    208                    UWORD8 u1_flag,
    209                    UWORD32 u4_bitstrm_ofst,
    210                    UWORD32 *pu4_bitstrm_buf)
    211 {
    212     UWORD32 word, word2, cur_bit, cur_word, code_val, code_num, clz;
    213 
    214     SWITCHOFFTRACE;
    215     cur_bit = u4_bitstrm_ofst & 0x1F;
    216     cur_word = u4_bitstrm_ofst >> 5;
    217     word = pu4_bitstrm_buf[cur_word];
    218     word2 = pu4_bitstrm_buf[cur_word + 1];
    219 
    220     if(cur_bit != 0)
    221     {
    222         word <<= cur_bit;
    223         word2 >>= (32 - cur_bit);
    224         word |= word2;
    225     }
    226 
    227     if(u1_flag == TEV && u4_range == 1)
    228     {
    229         word >>= 31;
    230         word = 1 - word;
    231         (*pi_bitstrm_ofst)++;
    232         ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
    233         return (WORD32)word;
    234     }
    235 
    236     //finding clz
    237     {
    238         UWORD32 ui32_code, ui32_mask;
    239 
    240         ui32_code = word;
    241         ui32_mask = 0x80000000;
    242         clz = 0;
    243 
    244         /* DSP implements this with LMBD instruction */
    245         /* so there we don't need to break the loop */
    246         while(!(ui32_code & ui32_mask))
    247         {
    248             clz++;
    249             ui32_mask >>= 1;
    250             if(0 == ui32_mask)
    251                 break;
    252         }
    253     }
    254 
    255     if(clz == 0)
    256     {
    257         *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1;
    258         ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
    259         return 0;
    260     }
    261 
    262     word <<= (clz + 1);
    263     word >>= (32 - clz);
    264     code_num = (1 << clz) + word - 1;
    265     *pi_bitstrm_ofst = *pi_bitstrm_ofst + (2 * clz) + 1;
    266     ps_bitstrm->u4_ofst = *pi_bitstrm_ofst;
    267 
    268     if(u1_flag == TEV || u1_flag == UEV)
    269         return (WORD32)code_num;
    270 
    271     code_val = (code_num + 1) >> 1;
    272     if(!(code_num & 0x01))
    273         return -((WORD32)code_val);
    274     return (WORD32)code_val;
    275 
    276 }
    277 
    278 /*****************************************************************************/
    279 /*                                                                           */
    280 /*  Function Name : ih264d_cavlc_4x4res_block_totalcoeff_1                          */
    281 /*                                                                           */
    282 /*  Description   : This function does cavlc decoding of 4x4 block residual  */
    283 /*                  coefficient when total coeff is equal to 1. The parsing  */
    284 /*                  is done as defined in section 9.2.2 and 9.2.3 of the     */
    285 /*                  H264 standard.                                           */
    286 /*                                                                           */
    287 /*  Inputs        : <What inputs does the function take?>                    */
    288 /*  Globals       : <Does it use any global variables?>                      */
    289 /*  Processing    : <Describe how the function operates - include algorithm  */
    290 /*                  description>                                             */
    291 /*  Outputs       : <What does the function produce?>                        */
    292 /*  Returns       : <What does the function return?>                         */
    293 /*                                                                           */
    294 /*  Issues        : <List any issues or problems with this function>         */
    295 /*                                                                           */
    296 /*  Revision History:                                                        */
    297 /*                                                                           */
    298 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    299 /*         25 09 2008   Jay          Draft                                   */
    300 /*                                                                           */
    301 /*****************************************************************************/
    302 WORD32 ih264d_cavlc_4x4res_block_totalcoeff_1(UWORD32 u4_isdc,
    303                                            UWORD32 u4_total_coeff_trail_one,
    304                                            dec_bit_stream_t *ps_bitstrm)
    305 {
    306 
    307     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    308     UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    309     UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
    310     WORD32 i2_level;
    311     UWORD32 u4_tot_zero, u4_ldz, u4_scan_pos;
    312 
    313     tu_sblk4x4_coeff_data_t *ps_tu_4x4;
    314     WORD16 *pi2_coeff_data;
    315     dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
    316 
    317     ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    318     ps_tu_4x4->u2_sig_coeff_map = 0;
    319     pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
    320 
    321 
    322     if(u4_trailing_ones)
    323     {
    324         UWORD32 u4_sign;
    325         /****************************************************************/
    326         /* Decode Trailing One as in section 9.2.2                      */
    327         /****************************************************************/
    328         GETBIT(u4_sign, u4_bitstream_offset, pu4_bitstrm_buf);
    329         i2_level = u4_sign ? -1 : 1;
    330     }
    331     else
    332     {
    333         /****************************************************************/
    334         /* Decoding Level based on prefix and suffix  as in 9.2.2       */
    335         /****************************************************************/
    336         UWORD32 u4_lev_suffix, u4_lev_suffix_size;
    337         WORD32 u2_lev_code, u2_abs_value;
    338         UWORD32 u4_lev_prefix;
    339         /***************************************************************/
    340         /* Find leading zeros in next 32 bits                          */
    341         /***************************************************************/
    342         FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
    343                               pu4_bitstrm_buf);
    344         u2_lev_code = (2 + MIN(u4_lev_prefix, 15));
    345 
    346         if(14 == u4_lev_prefix)
    347             u4_lev_suffix_size = 4;
    348         else if(15 <= u4_lev_prefix)
    349         {
    350             u2_lev_code += 15;
    351             u4_lev_suffix_size = u4_lev_prefix - 3;
    352         }
    353         else
    354             u4_lev_suffix_size = 0;
    355 
    356         //HP_LEVEL_PREFIX
    357         if(16 <= u4_lev_prefix)
    358         {
    359             u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
    360         }
    361         if(u4_lev_suffix_size)
    362         {
    363             GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
    364                     u4_lev_suffix_size);
    365             u2_lev_code += u4_lev_suffix;
    366         }
    367 
    368         u2_abs_value = (u2_lev_code + 2) >> 1;
    369         /*********************************************************/
    370         /* If Level code is odd, level is negative else positive */
    371         /*********************************************************/
    372         i2_level = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
    373 
    374     }
    375 
    376     /****************************************************************/
    377     /* Decoding total zeros as in section 9.2.3, table 9.7          */
    378     /****************************************************************/
    379     FIND_ONE_IN_STREAM_LEN(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf, 8);
    380 
    381     if(u4_ldz)
    382     {
    383         GETBIT(u4_tot_zero, u4_bitstream_offset, pu4_bitstrm_buf);
    384         u4_tot_zero = (u4_ldz << 1) - u4_tot_zero;
    385     }
    386     else
    387         u4_tot_zero = 0;
    388 
    389     /***********************************************************************/
    390     /* Inverse scan and store  residual coeff. Update the bitstream u4_ofst */
    391     /***********************************************************************/
    392     u4_scan_pos = u4_tot_zero + u4_isdc;
    393     if(u4_scan_pos > 15)
    394         return -1;
    395 
    396     SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
    397     *pi2_coeff_data++ = i2_level;
    398 
    399 
    400     {
    401         WORD32 offset;
    402         offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
    403         offset = ALIGN4(offset);
    404         ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
    405     }
    406 
    407     ps_bitstrm->u4_ofst = u4_bitstream_offset;
    408     return 0;
    409 }
    410 
    411 /*****************************************************************************/
    412 /*                                                                           */
    413 /*  Function Name : ih264d_cavlc_4x4res_block_totalcoeff_2to10                      */
    414 /*                                                                           */
    415 /*  Description   : This function does cavlc decoding of 4x4 block residual  */
    416 /*                  coefficient when total coeffs are between two and ten    */
    417 /*                  inclusive. Parsing is done as defined in section 9.2.2   */
    418 /*                  and 9.2.3 the H264 standard.                             */
    419 /*                                                                           */
    420 /*  Inputs        : <What inputs does the function take?>                    */
    421 /*  Globals       : <Does it use any global variables?>                      */
    422 /*  Processing    : <Describe how the function operates - include algorithm  */
    423 /*                  description>                                             */
    424 /*  Outputs       : <What does the function produce?>                        */
    425 /*  Returns       : <What does the function return?>                         */
    426 /*                                                                           */
    427 /*  Issues        : <List any issues or problems with this function>         */
    428 /*                                                                           */
    429 /*  Revision History:                                                        */
    430 /*                                                                           */
    431 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    432 /*         25 09 2008   Jay          Draft                                   */
    433 /*                                                                           */
    434 /*****************************************************************************/
    435 
    436 WORD32 ih264d_cavlc_4x4res_block_totalcoeff_2to10(UWORD32 u4_isdc,
    437                                                UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/
    438                                                dec_bit_stream_t *ps_bitstrm)
    439 {
    440     UWORD32 u4_total_zeroes;
    441     WORD32 i;
    442     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    443     UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    444     UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
    445     UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
    446     // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3)
    447     // since u4_trailing_ones can at the max be 3. This will be required when
    448     // u4_total_coeff is less than u4_trailing_ones
    449     WORD16 ai2_level_arr[19];
    450     WORD16 *i2_level_arr = &ai2_level_arr[3];
    451 
    452     tu_sblk4x4_coeff_data_t *ps_tu_4x4;
    453     WORD16 *pi2_coeff_data;
    454     dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
    455 
    456     ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    457     ps_tu_4x4->u2_sig_coeff_map = 0;
    458     pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
    459 
    460     i = u4_total_coeff - 1;
    461 
    462     if(u4_trailing_ones)
    463     {
    464         /*********************************************************************/
    465         /* Decode Trailing Ones                                              */
    466         /* read the sign of T1's and put them in level array                 */
    467         /*********************************************************************/
    468         UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
    469         WORD16 (*ppi2_trlone_lkup)[3] =
    470                         (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
    471         WORD16 *pi2_trlone_lkup;
    472 
    473         GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);
    474 
    475         pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];
    476 
    477         while(u4_cnt)
    478         {
    479             i2_level_arr[i--] = *pi2_trlone_lkup++;
    480             u4_cnt--;
    481         }
    482     }
    483 
    484     /****************************************************************/
    485     /* Decoding Levels Begins                                       */
    486     /****************************************************************/
    487     if(i >= 0)
    488     {
    489         /****************************************************************/
    490         /* First level is decoded outside the loop as it has lot of     */
    491         /* special cases.                                               */
    492         /****************************************************************/
    493         UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
    494         WORD32 u2_lev_code, u2_abs_value;
    495         UWORD32 u4_lev_prefix;
    496 
    497         /***************************************************************/
    498         /* u4_suffix_len = 0,  Find leading zeros in next 32 bits      */
    499         /***************************************************************/
    500         FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
    501                               pu4_bitstrm_buf);
    502 
    503         /*********************************************************/
    504         /* Special decoding case when trailing ones are 3        */
    505         /*********************************************************/
    506         u2_lev_code = MIN(15, u4_lev_prefix);
    507 
    508         u2_lev_code += (3 == u4_trailing_ones) ? 0 : 2;
    509 
    510         if(14 == u4_lev_prefix)
    511             u4_lev_suffix_size = 4;
    512         else if(15 <= u4_lev_prefix)
    513         {
    514             u2_lev_code += 15;
    515             u4_lev_suffix_size = u4_lev_prefix - 3;
    516         }
    517         else
    518             u4_lev_suffix_size = 0;
    519 
    520         //HP_LEVEL_PREFIX
    521         if(16 <= u4_lev_prefix)
    522         {
    523             u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
    524         }
    525         if(u4_lev_suffix_size)
    526         {
    527             GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
    528                     u4_lev_suffix_size);
    529             u2_lev_code += u4_lev_suffix;
    530         }
    531 
    532         u2_abs_value = (u2_lev_code + 2) >> 1;
    533         /*********************************************************/
    534         /* If Level code is odd, level is negative else positive */
    535         /*********************************************************/
    536         i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
    537 
    538         u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;
    539 
    540         /*********************************************************/
    541         /* Now loop over the remaining levels                    */
    542         /*********************************************************/
    543         while(i >= 0)
    544         {
    545 
    546             /***************************************************************/
    547             /* Find leading zeros in next 32 bits                          */
    548             /***************************************************************/
    549             FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
    550                                   pu4_bitstrm_buf);
    551 
    552             u4_lev_suffix_size =
    553                             (15 <= u4_lev_prefix) ?
    554                                             (u4_lev_prefix - 3) : u4_suffix_len;
    555 
    556             /*********************************************************/
    557             /* Compute level code using prefix and suffix            */
    558             /*********************************************************/
    559             GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
    560                     u4_lev_suffix_size);
    561             u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len)
    562                             + u4_lev_suffix;
    563 
    564             //HP_LEVEL_PREFIX
    565             if(16 <= u4_lev_prefix)
    566             {
    567                 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
    568             }
    569             u2_abs_value = (u2_lev_code + 2) >> 1;
    570 
    571             /*********************************************************/
    572             /* If Level code is odd, level is negative else positive */
    573             /*********************************************************/
    574             i2_level_arr[i--] =
    575                             (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
    576 
    577             /*********************************************************/
    578             /* Increment suffix length if required                   */
    579             /*********************************************************/
    580             u4_suffix_len +=
    581                             (u4_suffix_len < 6) ?
    582                                             (u2_abs_value
    583                                                             > (3
    584                                                                             << (u4_suffix_len
    585                                                                                             - 1))) :
    586                                             0;
    587         }
    588 
    589         /****************************************************************/
    590         /* Decoding Levels Ends                                         */
    591         /****************************************************************/
    592     }
    593 
    594     /****************************************************************/
    595     /* Decoding total zeros as in section 9.2.3, table 9.7          */
    596     /****************************************************************/
    597     {
    598         UWORD32 u4_index;
    599         const UWORD8 (*ppu1_total_zero_lkup)[64] =
    600                         (const UWORD8 (*)[64])gau1_ih264d_table_total_zero_2to10;
    601 
    602         NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 6);
    603         u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 2][u4_index];
    604 
    605         FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4));
    606         u4_total_zeroes &= 0xf;
    607     }
    608 
    609     /**************************************************************/
    610     /* Decode the runs and form the coefficient buffer            */
    611     /**************************************************************/
    612     {
    613         const UWORD8 *pu1_table_runbefore;
    614         UWORD32 u4_run;
    615         WORD32 k;
    616         WORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc;
    617         WORD32 u4_zeroes_left = u4_total_zeroes;
    618         k = u4_total_coeff - 1;
    619 
    620         /**************************************************************/
    621         /* Decoding Runs Begin for zeros left > 6                     */
    622         /**************************************************************/
    623         while((u4_zeroes_left > 6) && k)
    624         {
    625             UWORD32 u4_code;
    626 
    627             NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
    628 
    629             if(u4_code != 0)
    630             {
    631                 FLUSHBITS(u4_bitstream_offset, 3);
    632                 u4_run = (7 - u4_code);
    633             }
    634             else
    635             {
    636 
    637                 FIND_ONE_IN_STREAM_LEN(u4_code, u4_bitstream_offset,
    638                                        pu4_bitstrm_buf, 11);
    639                 u4_run = (4 + u4_code);
    640             }
    641 
    642             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
    643             *pi2_coeff_data++ = i2_level_arr[k--];
    644             u4_zeroes_left -= (WORD32)u4_run;
    645             u4_scan_pos -= (WORD32)(u4_run + 1);
    646         }
    647 
    648         if (u4_zeroes_left < 0 || u4_scan_pos < 0)
    649             return -1;
    650 
    651         /**************************************************************/
    652         /* Decoding Runs for 0 < zeros left <=6                       */
    653         /**************************************************************/
    654         pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
    655         while((u4_zeroes_left > 0) && k)
    656         {
    657             UWORD32 u4_code;
    658             NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
    659 
    660             u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
    661             u4_run = u4_code >> 2;
    662 
    663             FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
    664 
    665             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
    666             *pi2_coeff_data++ = i2_level_arr[k--];
    667             u4_zeroes_left -= (WORD32)u4_run;
    668             u4_scan_pos -= (WORD32)(u4_run + 1);
    669         }
    670         if (u4_zeroes_left < 0 || u4_scan_pos < 0)
    671             return -1;
    672         /**************************************************************/
    673         /* Decoding Runs End                                          */
    674         /**************************************************************/
    675 
    676         /**************************************************************/
    677         /* Copy the remaining coefficients                            */
    678         /**************************************************************/
    679         while(k >= 0)
    680         {
    681 
    682             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
    683             *pi2_coeff_data++ = i2_level_arr[k--];
    684             u4_scan_pos--;
    685         }
    686     }
    687 
    688     {
    689         WORD32 offset;
    690         offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
    691         offset = ALIGN4(offset);
    692         ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
    693     }
    694 
    695     ps_bitstrm->u4_ofst = u4_bitstream_offset;
    696     return 0;
    697 }
    698 
    699 /*****************************************************************************/
    700 /*                                                                           */
    701 /*  Function Name : ih264d_cavlc_4x4res_block_totalcoeff_11to16                     */
    702 /*                                                                           */
    703 /*  Description   : This function does cavlc decoding of 4x4 block residual  */
    704 /*                  coefficient when total coeffs are greater than ten.      */
    705 /*                  Parsing is done as defined in section 9.2.2 and 9.2.3 of */
    706 /*                  the H264 standard.                                       */
    707 /*                                                                           */
    708 /*  Inputs        : <What inputs does the function take?>                    */
    709 /*  Globals       : <Does it use any global variables?>                      */
    710 /*  Processing    : <Describe how the function operates - include algorithm  */
    711 /*                  description>                                             */
    712 /*  Outputs       : <What does the function produce?>                        */
    713 /*  Returns       : <What does the function return?>                         */
    714 /*                                                                           */
    715 /*  Issues        : <List any issues or problems with this function>         */
    716 /*                                                                           */
    717 /*  Revision History:                                                        */
    718 /*                                                                           */
    719 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    720 /*         25 09 2008   Jay          Draft                                   */
    721 /*                                                                           */
    722 /*****************************************************************************/
    723 
    724 WORD32 ih264d_cavlc_4x4res_block_totalcoeff_11to16(UWORD32 u4_isdc,
    725                                                 UWORD32 u4_total_coeff_trail_one, /*!<TotalCoefficients<<16+trailingones*/
    726                                                 dec_bit_stream_t *ps_bitstrm )
    727 {
    728     UWORD32 u4_total_zeroes;
    729     WORD32 i;
    730     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
    731     UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
    732     UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
    733     UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
    734     // To avoid error check at 4x4 level, allocating for 3 extra levels(16+3)
    735     // since u4_trailing_ones can at the max be 3. This will be required when
    736     // u4_total_coeff is less than u4_trailing_ones
    737     WORD16 ai2_level_arr[19];//
    738     WORD16 *i2_level_arr = &ai2_level_arr[3];
    739 
    740     tu_sblk4x4_coeff_data_t *ps_tu_4x4;
    741     WORD16 *pi2_coeff_data;
    742     dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
    743 
    744     ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
    745     ps_tu_4x4->u2_sig_coeff_map = 0;
    746     pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
    747 
    748     i = u4_total_coeff - 1;
    749     if(u4_trailing_ones)
    750     {
    751         /*********************************************************************/
    752         /* Decode Trailing Ones                                              */
    753         /* read the sign of T1's and put them in level array                 */
    754         /*********************************************************************/
    755         UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
    756         WORD16 (*ppi2_trlone_lkup)[3] =
    757                         (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
    758         WORD16 *pi2_trlone_lkup;
    759 
    760         GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);
    761 
    762         pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];
    763 
    764         while(u4_cnt)
    765         {
    766             i2_level_arr[i--] = *pi2_trlone_lkup++;
    767             u4_cnt--;
    768         }
    769     }
    770 
    771     /****************************************************************/
    772     /* Decoding Levels Begins                                       */
    773     /****************************************************************/
    774     if(i >= 0)
    775     {
    776         /****************************************************************/
    777         /* First level is decoded outside the loop as it has lot of     */
    778         /* special cases.                                               */
    779         /****************************************************************/
    780         UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
    781         UWORD16 u2_lev_code, u2_abs_value;
    782         UWORD32 u4_lev_prefix;
    783 
    784         if(u4_trailing_ones < 3)
    785         {
    786             /*********************************************************/
    787             /* u4_suffix_len = 1                                     */
    788             /*********************************************************/
    789             /***************************************************************/
    790             /* Find leading zeros in next 32 bits                          */
    791             /***************************************************************/
    792             FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
    793                                   pu4_bitstrm_buf);
    794 
    795             u4_lev_suffix_size =
    796                             (15 <= u4_lev_prefix) ? (u4_lev_prefix - 3) : 1;
    797 
    798             GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
    799                     u4_lev_suffix_size);
    800             u2_lev_code = 2 + (MIN(u4_lev_prefix,15) << 1) + u4_lev_suffix;
    801 
    802             //HP_LEVEL_PREFIX
    803             if(16 <= u4_lev_prefix)
    804             {
    805                 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
    806             }
    807         }
    808         else
    809         {
    810             /*********************************************************/
    811             /*u4_suffix_len = 0                                      */
    812             /*********************************************************/
    813             /***************************************************************/
    814             /* Find leading zeros in next 32 bits                          */
    815             /***************************************************************/
    816             FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
    817                                   pu4_bitstrm_buf);
    818 
    819             /*********************************************************/
    820             /* Special decoding case when trailing ones are 3        */
    821             /*********************************************************/
    822             u2_lev_code = MIN(15, u4_lev_prefix);
    823 
    824             u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2);
    825 
    826             if(14 == u4_lev_prefix)
    827                 u4_lev_suffix_size = 4;
    828             else if(15 <= u4_lev_prefix)
    829             {
    830                 u2_lev_code += 15;
    831                 u4_lev_suffix_size = (u4_lev_prefix - 3);
    832             }
    833             else
    834                 u4_lev_suffix_size = 0;
    835 
    836             //HP_LEVEL_PREFIX
    837             if(16 <= u4_lev_prefix)
    838             {
    839                 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
    840             }
    841             if(u4_lev_suffix_size)
    842             {
    843                 GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
    844                         u4_lev_suffix_size);
    845                 u2_lev_code += u4_lev_suffix;
    846             }
    847         }
    848 
    849         u2_abs_value = (u2_lev_code + 2) >> 1;
    850         /*********************************************************/
    851         /* If Level code is odd, level is negative else positive */
    852         /*********************************************************/
    853         i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
    854 
    855         u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;
    856 
    857         /*********************************************************/
    858         /* Now loop over the remaining levels                    */
    859         /*********************************************************/
    860         while(i >= 0)
    861         {
    862 
    863             /***************************************************************/
    864             /* Find leading zeros in next 32 bits                          */
    865             /***************************************************************/
    866             FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
    867                                   pu4_bitstrm_buf);
    868 
    869             u4_lev_suffix_size =
    870                             (15 <= u4_lev_prefix) ?
    871                                             (u4_lev_prefix - 3) : u4_suffix_len;
    872 
    873             /*********************************************************/
    874             /* Compute level code using prefix and suffix            */
    875             /*********************************************************/
    876             GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
    877                     u4_lev_suffix_size);
    878             u2_lev_code = (MIN(15,u4_lev_prefix) << u4_suffix_len)
    879                             + u4_lev_suffix;
    880 
    881             //HP_LEVEL_PREFIX
    882             if(16 <= u4_lev_prefix)
    883             {
    884                 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
    885             }
    886             u2_abs_value = (u2_lev_code + 2) >> 1;
    887 
    888             /*********************************************************/
    889             /* If Level code is odd, level is negative else positive */
    890             /*********************************************************/
    891             i2_level_arr[i--] =
    892                             (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
    893 
    894             /*********************************************************/
    895             /* Increment suffix length if required                   */
    896             /*********************************************************/
    897             u4_suffix_len +=
    898                             (u4_suffix_len < 6) ?
    899                                             (u2_abs_value
    900                                                             > (3
    901                                                                             << (u4_suffix_len
    902                                                                                             - 1))) :
    903                                             0;
    904         }
    905 
    906         /****************************************************************/
    907         /* Decoding Levels Ends                                         */
    908         /****************************************************************/
    909     }
    910 
    911     if(u4_total_coeff < (16 - u4_isdc))
    912     {
    913         UWORD32 u4_index;
    914         const UWORD8 (*ppu1_total_zero_lkup)[16] =
    915                         (const UWORD8 (*)[16])gau1_ih264d_table_total_zero_11to15;
    916 
    917         NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 4);
    918         u4_total_zeroes = ppu1_total_zero_lkup[u4_total_coeff - 11][u4_index];
    919 
    920         FLUSHBITS(u4_bitstream_offset, (u4_total_zeroes >> 4));
    921         u4_total_zeroes &= 0xf;
    922     }
    923     else
    924         u4_total_zeroes = 0;
    925 
    926     /**************************************************************/
    927     /* Decode the runs and form the coefficient buffer            */
    928     /**************************************************************/
    929     {
    930         const UWORD8 *pu1_table_runbefore;
    931         UWORD32 u4_run;
    932         WORD32 k;
    933         WORD32 u4_scan_pos = u4_total_coeff + u4_total_zeroes - 1 + u4_isdc;
    934         WORD32 u4_zeroes_left = u4_total_zeroes;
    935         k = u4_total_coeff - 1;
    936 
    937         /**************************************************************/
    938         /* Decoding Runs for 0 < zeros left <=6                       */
    939         /**************************************************************/
    940         pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
    941         while((u4_zeroes_left > 0) && k)
    942         {
    943             UWORD32 u4_code;
    944             NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
    945 
    946             u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
    947             u4_run = u4_code >> 2;
    948 
    949             FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
    950             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
    951             *pi2_coeff_data++ = i2_level_arr[k--];
    952             u4_zeroes_left -= (WORD32)u4_run;
    953             u4_scan_pos -= (WORD32)(u4_run + 1);
    954         }
    955         if (u4_zeroes_left < 0 || u4_scan_pos < 0)
    956           return -1;
    957 
    958         /**************************************************************/
    959         /* Decoding Runs End                                          */
    960         /**************************************************************/
    961 
    962         /**************************************************************/
    963         /* Copy the remaining coefficients                            */
    964         /**************************************************************/
    965         while(k >= 0)
    966         {
    967             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
    968             *pi2_coeff_data++ = i2_level_arr[k--];
    969             u4_scan_pos--;
    970         }
    971     }
    972 
    973     {
    974         WORD32 offset;
    975         offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
    976         offset = ALIGN4(offset);
    977         ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
    978     }
    979 
    980     ps_bitstrm->u4_ofst = u4_bitstream_offset;
    981     return 0;
    982 }
    983 
    984 /*****************************************************************************/
    985 /*                                                                           */
    986 /*  Function Name : ih264d_rest_of_residual_cav_chroma_dc_block              */
    987 /*                                                                           */
    988 /*  Description   : This function does the Cavlc parsing of the bitstream    */
    989 /*                  for chroma dc coefficients                               */
    990 /*  Inputs        : <What inputs does the function take?>                    */
    991 /*  Globals       : <Does it use any global variables?>                      */
    992 /*  Processing    : <Describe how the function operates - include algorithm  */
    993 /*                  description>                                             */
    994 /*  Outputs       : <What does the function produce?>                        */
    995 /*  Returns       : <What does the function return?>                         */
    996 /*                                                                           */
    997 /*  Issues        : <List any issues or problems with this function>         */
    998 /*                                                                           */
    999 /*  Revision History:                                                        */
   1000 /*                                                                           */
   1001 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1002 /*         15 09 2008   Jay          Draft                                   */
   1003 /*                                                                           */
   1004 /*****************************************************************************/
   1005 void ih264d_rest_of_residual_cav_chroma_dc_block(UWORD32 u4_total_coeff_trail_one,
   1006                                                  dec_bit_stream_t *ps_bitstrm)
   1007 {
   1008     UWORD32 u4_total_zeroes;
   1009     WORD16 i;
   1010     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1011     UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
   1012     UWORD32 u4_trailing_ones = u4_total_coeff_trail_one & 0xFFFF;
   1013     UWORD32 u4_total_coeff = u4_total_coeff_trail_one >> 16;
   1014     // To avoid error check at 4x4 level, allocating for 3 extra levels(4+3)
   1015     // since u4_trailing_ones can at the max be 3. This will be required when
   1016     // u4_total_coeff is less than u4_trailing_ones
   1017     WORD16 ai2_level_arr[7];//
   1018     WORD16 *i2_level_arr = &ai2_level_arr[3];
   1019 
   1020     tu_sblk4x4_coeff_data_t *ps_tu_4x4;
   1021     WORD16 *pi2_coeff_data;
   1022     dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
   1023 
   1024     ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
   1025     ps_tu_4x4->u2_sig_coeff_map = 0;
   1026     pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
   1027 
   1028     i = u4_total_coeff - 1;
   1029     if(u4_trailing_ones)
   1030     {
   1031         /*********************************************************************/
   1032         /* Decode Trailing Ones                                              */
   1033         /* read the sign of T1's and put them in level array                 */
   1034         /*********************************************************************/
   1035         UWORD32 u4_signs, u4_cnt = u4_trailing_ones;
   1036         WORD16 (*ppi2_trlone_lkup)[3] =
   1037                         (WORD16 (*)[3])gai2_ih264d_trailing_one_level;
   1038         WORD16 *pi2_trlone_lkup;
   1039 
   1040         GETBITS(u4_signs, u4_bitstream_offset, pu4_bitstrm_buf, u4_cnt);
   1041 
   1042         pi2_trlone_lkup = ppi2_trlone_lkup[(1 << u4_cnt) - 2 + u4_signs];
   1043 
   1044         while(u4_cnt)
   1045         {
   1046             i2_level_arr[i--] = *pi2_trlone_lkup++;
   1047             u4_cnt--;
   1048         }
   1049     }
   1050 
   1051     /****************************************************************/
   1052     /* Decoding Levels Begins                                       */
   1053     /****************************************************************/
   1054     if(i >= 0)
   1055     {
   1056         /****************************************************************/
   1057         /* First level is decoded outside the loop as it has lot of     */
   1058         /* special cases.                                               */
   1059         /****************************************************************/
   1060         UWORD32 u4_lev_suffix, u4_suffix_len, u4_lev_suffix_size;
   1061         UWORD16 u2_lev_code, u2_abs_value;
   1062         UWORD32 u4_lev_prefix;
   1063 
   1064         /***************************************************************/
   1065         /* u4_suffix_len = 0,  Find leading zeros in next 32 bits      */
   1066         /***************************************************************/
   1067         FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
   1068                               pu4_bitstrm_buf);
   1069 
   1070         /*********************************************************/
   1071         /* Special decoding case when trailing ones are 3        */
   1072         /*********************************************************/
   1073         u2_lev_code = MIN(15, u4_lev_prefix);
   1074 
   1075         u2_lev_code += (3 == u4_trailing_ones) ? 0 : (2);
   1076 
   1077         if(14 == u4_lev_prefix)
   1078             u4_lev_suffix_size = 4;
   1079         else if(15 <= u4_lev_prefix)
   1080         {
   1081             u2_lev_code += 15;
   1082             u4_lev_suffix_size = u4_lev_prefix - 3;
   1083         }
   1084         else
   1085             u4_lev_suffix_size = 0;
   1086 
   1087         //HP_LEVEL_PREFIX
   1088         if(16 <= u4_lev_prefix)
   1089         {
   1090             u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
   1091         }
   1092         if(u4_lev_suffix_size)
   1093         {
   1094             GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
   1095                     u4_lev_suffix_size);
   1096             u2_lev_code += u4_lev_suffix;
   1097         }
   1098 
   1099         u2_abs_value = (u2_lev_code + 2) >> 1;
   1100         /*********************************************************/
   1101         /* If Level code is odd, level is negative else positive */
   1102         /*********************************************************/
   1103         i2_level_arr[i--] = (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
   1104 
   1105         u4_suffix_len = (u2_abs_value > 3) ? 2 : 1;
   1106 
   1107         /*********************************************************/
   1108         /* Now loop over the remaining levels                    */
   1109         /*********************************************************/
   1110         while(i >= 0)
   1111         {
   1112 
   1113             /***************************************************************/
   1114             /* Find leading zeros in next 32 bits                          */
   1115             /***************************************************************/
   1116             FIND_ONE_IN_STREAM_32(u4_lev_prefix, u4_bitstream_offset,
   1117                                   pu4_bitstrm_buf);
   1118 
   1119             u4_lev_suffix_size =
   1120                             (15 <= u4_lev_prefix) ?
   1121                                             (u4_lev_prefix - 3) : u4_suffix_len;
   1122 
   1123             /*********************************************************/
   1124             /* Compute level code using prefix and suffix            */
   1125             /*********************************************************/
   1126             GETBITS(u4_lev_suffix, u4_bitstream_offset, pu4_bitstrm_buf,
   1127                     u4_lev_suffix_size);
   1128             u2_lev_code = (MIN(u4_lev_prefix,15) << u4_suffix_len)
   1129                             + u4_lev_suffix;
   1130 
   1131             //HP_LEVEL_PREFIX
   1132             if(16 <= u4_lev_prefix)
   1133             {
   1134                 u2_lev_code += ((1 << (u4_lev_prefix - 3)) - 4096);
   1135             }
   1136             u2_abs_value = (u2_lev_code + 2) >> 1;
   1137 
   1138             /*********************************************************/
   1139             /* If Level code is odd, level is negative else positive */
   1140             /*********************************************************/
   1141             i2_level_arr[i--] =
   1142                             (u2_lev_code & 1) ? -u2_abs_value : u2_abs_value;
   1143 
   1144             /*********************************************************/
   1145             /* Increment suffix length if required                   */
   1146             /*********************************************************/
   1147             u4_suffix_len += (u2_abs_value > (3 << (u4_suffix_len - 1)));
   1148         }
   1149 
   1150         /****************************************************************/
   1151         /* Decoding Levels Ends                                         */
   1152         /****************************************************************/
   1153     }
   1154 
   1155     if(u4_total_coeff < 4)
   1156     {
   1157         UWORD32 u4_max_ldz = (4 - u4_total_coeff);
   1158         FIND_ONE_IN_STREAM_LEN(u4_total_zeroes, u4_bitstream_offset,
   1159                                pu4_bitstrm_buf, u4_max_ldz);
   1160     }
   1161     else
   1162         u4_total_zeroes = 0;
   1163 
   1164     /**************************************************************/
   1165     /* Decode the runs and form the coefficient buffer            */
   1166     /**************************************************************/
   1167     {
   1168         const UWORD8 *pu1_table_runbefore;
   1169         UWORD32 u4_run;
   1170         WORD32 u4_scan_pos = (u4_total_coeff + u4_total_zeroes - 1);
   1171         UWORD32 u4_zeroes_left = u4_total_zeroes;
   1172         i = u4_total_coeff - 1;
   1173 
   1174         /**************************************************************/
   1175         /* Decoding Runs for 0 < zeros left <=6                       */
   1176         /**************************************************************/
   1177         pu1_table_runbefore = (UWORD8 *)gau1_ih264d_table_run_before;
   1178         while(u4_zeroes_left && i)
   1179         {
   1180             UWORD32 u4_code;
   1181             NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 3);
   1182 
   1183             u4_code = pu1_table_runbefore[u4_code + (u4_zeroes_left << 3)];
   1184             u4_run = u4_code >> 2;
   1185 
   1186             FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
   1187             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
   1188             *pi2_coeff_data++ = i2_level_arr[i--];
   1189             u4_zeroes_left -= (WORD32)u4_run;
   1190             u4_scan_pos -= (WORD32)(u4_run + 1);
   1191         }
   1192         /**************************************************************/
   1193         /* Decoding Runs End                                          */
   1194         /**************************************************************/
   1195 
   1196         /**************************************************************/
   1197         /* Copy the remaining coefficients                            */
   1198         /**************************************************************/
   1199         while(i >= 0)
   1200         {
   1201             SET_BIT(ps_tu_4x4->u2_sig_coeff_map, u4_scan_pos);
   1202             *pi2_coeff_data++ = i2_level_arr[i--];
   1203             u4_scan_pos--;
   1204         }
   1205     }
   1206 
   1207     {
   1208         WORD32 offset;
   1209         offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
   1210         offset = ALIGN4(offset);
   1211         ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset);
   1212     }
   1213 
   1214     ps_bitstrm->u4_ofst = u4_bitstream_offset;
   1215 }
   1216 
   1217 /*!
   1218  **************************************************************************
   1219  * \if Function name : CavlcParsingInvScanInvQuant \endif
   1220  *
   1221  * \brief
   1222  *    This function do cavlc parsing of coefficient tokens for any block
   1223  *    type except chromDc and depending
   1224  *    on whenther any coefficients to be parsed calls module
   1225  *    RestOfResidualBlockCavlc.
   1226  *
   1227  * \return
   1228  *    Returns total number of non-zero coefficients.
   1229  *
   1230  **************************************************************************
   1231  */
   1232 
   1233 WORD32 ih264d_cavlc_parse4x4coeff_n0to7(WORD16 *pi2_coeff_block,
   1234                                         UWORD32 u4_isdc, /* is it a DC block */
   1235                                         WORD32 u4_n,
   1236                                         dec_struct_t *ps_dec,
   1237                                         UWORD32 *pu4_total_coeff)
   1238 {
   1239     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
   1240     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1241     UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
   1242     UWORD32 u4_code, u4_index, u4_ldz;
   1243     const UWORD16 *pu2_code = (const UWORD16*)gau2_ih264d_code_gx;
   1244     const UWORD16 *pu2_offset_num_vlc =
   1245                     (const UWORD16 *)gau2_ih264d_offset_num_vlc_tab;
   1246     UWORD32 u4_offset_num_vlc = pu2_offset_num_vlc[u4_n];
   1247 
   1248 
   1249     UNUSED(pi2_coeff_block);
   1250     *pu4_total_coeff = 0;
   1251     FIND_ONE_IN_STREAM_32(u4_ldz, u4_bitstream_offset, pu4_bitstrm_buf);
   1252     NEXTBITS(u4_index, u4_bitstream_offset, pu4_bitstrm_buf, 3);
   1253     u4_index += (u4_ldz << 3);
   1254     u4_index += u4_offset_num_vlc;
   1255 
   1256     u4_index = MIN(u4_index, 303);
   1257     u4_code = pu2_code[u4_index];
   1258 
   1259     FLUSHBITS(u4_bitstream_offset, (u4_code & 0x03));
   1260     ps_bitstrm->u4_ofst = u4_bitstream_offset;
   1261     *pu4_total_coeff = (u4_code >> 4);
   1262 
   1263     if(*pu4_total_coeff)
   1264     {
   1265         UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone;
   1266         const UWORD8 *pu1_offset =
   1267                         (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset;
   1268         WORD32 ret;
   1269         u4_trailing_ones = ((u4_code >> 2) & 0x03);
   1270         u4_offset = pu1_offset[*pu4_total_coeff - 1];
   1271         u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones;
   1272 
   1273         ret = ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc,
   1274                                                        u4_total_coeff_tone,
   1275                                                        ps_bitstrm);
   1276         if(ret != 0)
   1277             return ERROR_CAVLC_NUM_COEFF_T;
   1278     }
   1279 
   1280     return OK;
   1281 }
   1282 
   1283 WORD32 ih264d_cavlc_parse4x4coeff_n8(WORD16 *pi2_coeff_block,
   1284                                      UWORD32 u4_isdc, /* is it a DC block */
   1285                                      WORD32 u4_n,
   1286                                      dec_struct_t *ps_dec,
   1287                                      UWORD32 *pu4_total_coeff)
   1288 {
   1289 
   1290     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
   1291     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1292     UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
   1293     UWORD32 u4_code;
   1294     UNUSED(u4_n);
   1295     UNUSED(pi2_coeff_block);
   1296     GETBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 6);
   1297     ps_bitstrm->u4_ofst = u4_bitstream_offset;
   1298     *pu4_total_coeff = 0;
   1299 
   1300     if(u4_code != 3)
   1301     {
   1302         UWORD8 *pu1_offset = (UWORD8 *)gau1_ih264d_total_coeff_fn_ptr_offset;
   1303         UWORD32 u4_trailing_ones, u4_offset, u4_total_coeff_tone;
   1304 
   1305         *pu4_total_coeff = (u4_code >> 2) + 1;
   1306         u4_trailing_ones = u4_code & 0x03;
   1307         u4_offset = pu1_offset[*pu4_total_coeff - 1];
   1308         u4_total_coeff_tone = (*pu4_total_coeff << 16) | u4_trailing_ones;
   1309 
   1310         ps_dec->pf_cavlc_4x4res_block[u4_offset](u4_isdc,
   1311                                                  u4_total_coeff_tone,
   1312                                                  ps_bitstrm);
   1313     }
   1314 
   1315     return OK;
   1316 }
   1317 
   1318 /*!
   1319  **************************************************************************
   1320  * \if Function name : ih264d_cavlc_parse_chroma_dc \endif
   1321  *
   1322  * \brief
   1323  *    This function do cavlc parsing of coefficient tokens chromDc block
   1324  *    and depending  on whenther any coefficients to be parsed calls module
   1325  *    ih264d_rest_of_residual_cav_chroma_dc_block.
   1326  *
   1327  * \return
   1328  *    Returns total number of non-zero coefficients.
   1329  *
   1330  **************************************************************************
   1331  */
   1332 
   1333 void ih264d_cavlc_parse_chroma_dc(dec_mb_info_t *ps_cur_mb_info,
   1334                                   WORD16 *pi2_coeff_block,
   1335                                   dec_bit_stream_t *ps_bitstrm,
   1336                                   UWORD32 u4_scale_u,
   1337                                   UWORD32 u4_scale_v,
   1338                                   WORD32 i4_mb_inter_inc)
   1339 {
   1340     UWORD32 u4_total_coeff, u4_trailing_ones, u4_total_coeff_tone, u4_code;
   1341     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1342     UWORD32 u4_bitstream_offset = ps_bitstrm->u4_ofst;
   1343     const UWORD8 *pu1_cav_chromdc = (const UWORD8*)gau1_ih264d_cav_chromdc_vld;
   1344     UNUSED(i4_mb_inter_inc);
   1345     /******************************************************************/
   1346     /*  Chroma DC Block for U component                               */
   1347     /******************************************************************/
   1348     NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8);
   1349 
   1350     u4_code = pu1_cav_chromdc[u4_code];
   1351 
   1352     FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1));
   1353     ps_bitstrm->u4_ofst = u4_bitstream_offset;
   1354 
   1355     u4_total_coeff = (u4_code >> 5);
   1356 
   1357     if(u4_total_coeff)
   1358     {
   1359         WORD32 i_z0, i_z1, i_z2, i_z3;
   1360         tu_sblk4x4_coeff_data_t *ps_tu_4x4;
   1361         dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
   1362         WORD16 ai2_dc_coef[4];
   1363         UWORD8 pu1_inv_scan[4] =
   1364                         { 0, 1, 2, 3 };
   1365         WORD16 *pi2_coeff_data =
   1366                                     (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
   1367 
   1368         ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
   1369 
   1370         u4_trailing_ones = ((u4_code >> 3) & 0x3);
   1371         u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones;
   1372         ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone,
   1373                                                     ps_bitstrm);
   1374 
   1375         ai2_dc_coef[0] = 0;
   1376         ai2_dc_coef[1] = 0;
   1377         ai2_dc_coef[2] = 0;
   1378         ai2_dc_coef[3] = 0;
   1379 
   1380         ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
   1381                                          ai2_dc_coef,
   1382                                          pu1_inv_scan);
   1383         /*-------------------------------------------------------------------*/
   1384         /* Inverse 2x2 transform and scaling  of chroma DC                   */
   1385         /*-------------------------------------------------------------------*/
   1386         i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
   1387         i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
   1388         i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
   1389         i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);
   1390 
   1391         /*-----------------------------------------------------------*/
   1392         /* Scaling and storing the values back                       */
   1393         /*-----------------------------------------------------------*/
   1394         *pi2_coeff_data++ = (WORD16)(((i_z0 + i_z3) * (WORD32)u4_scale_u) >> 5);
   1395         *pi2_coeff_data++ = (WORD16)(((i_z0 - i_z3) * (WORD32)u4_scale_u) >> 5);
   1396         *pi2_coeff_data++ = (WORD16)(((i_z1 + i_z2) * (WORD32)u4_scale_u) >> 5);
   1397         *pi2_coeff_data++ = (WORD16)(((i_z1 - i_z2) * (WORD32)u4_scale_u) >> 5);
   1398 
   1399         ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;
   1400 
   1401         SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,1);
   1402     }
   1403 
   1404     /******************************************************************/
   1405     /*  Chroma DC Block for V component                               */
   1406     /******************************************************************/
   1407     pi2_coeff_block += 64;
   1408     u4_bitstream_offset = ps_bitstrm->u4_ofst;
   1409 
   1410     NEXTBITS(u4_code, u4_bitstream_offset, pu4_bitstrm_buf, 8);
   1411 
   1412     u4_code = pu1_cav_chromdc[u4_code];
   1413 
   1414     FLUSHBITS(u4_bitstream_offset, ((u4_code & 0x7) + 1));
   1415     ps_bitstrm->u4_ofst = u4_bitstream_offset;
   1416 
   1417     u4_total_coeff = (u4_code >> 5);
   1418 
   1419     if(u4_total_coeff)
   1420     {
   1421         WORD32 i_z0, i_z1, i_z2, i_z3;
   1422         tu_sblk4x4_coeff_data_t *ps_tu_4x4;
   1423         dec_struct_t *ps_dec = (dec_struct_t *)ps_bitstrm->pv_codec_handle;
   1424         WORD16 ai2_dc_coef[4];
   1425         UWORD8 pu1_inv_scan[4] =
   1426                         { 0, 1, 2, 3 };
   1427         WORD16 *pi2_coeff_data =
   1428                                     (WORD16 *)ps_dec->pv_parse_tu_coeff_data;
   1429 
   1430         ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data;
   1431 
   1432         u4_trailing_ones = ((u4_code >> 3) & 0x3);
   1433         u4_total_coeff_tone = (u4_total_coeff << 16) | u4_trailing_ones;
   1434         ih264d_rest_of_residual_cav_chroma_dc_block(u4_total_coeff_tone,
   1435                                                     ps_bitstrm);
   1436 
   1437         ai2_dc_coef[0] = 0;
   1438         ai2_dc_coef[1] = 0;
   1439         ai2_dc_coef[2] = 0;
   1440         ai2_dc_coef[3] = 0;
   1441 
   1442         ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4,
   1443                                          ai2_dc_coef,
   1444                                          pu1_inv_scan);
   1445 
   1446         /*-------------------------------------------------------------------*/
   1447         /* Inverse 2x2 transform and scaling  of chroma DC                   */
   1448         /*-------------------------------------------------------------------*/
   1449         i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]);
   1450         i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]);
   1451         i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]);
   1452         i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]);
   1453 
   1454         /*-----------------------------------------------------------*/
   1455         /* Scaling and storing the values back                       */
   1456         /*-----------------------------------------------------------*/
   1457         *pi2_coeff_data++ = (WORD16)(((i_z0 + i_z3) * (WORD32)u4_scale_v) >> 5);
   1458         *pi2_coeff_data++ = (WORD16)(((i_z0 - i_z3) * (WORD32)u4_scale_v) >> 5);
   1459         *pi2_coeff_data++ = (WORD16)(((i_z1 + i_z2) * (WORD32)u4_scale_v) >> 5);
   1460         *pi2_coeff_data++ = (WORD16)(((i_z1 - i_z2) * (WORD32)u4_scale_v) >> 5);
   1461 
   1462         ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data;
   1463 
   1464         SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,2);
   1465     }
   1466 }
   1467 
   1468 /*****************************************************************************/
   1469 /*                                                                           */
   1470 /*  Function Name : ih264d_parse_pmb_ref_index_cavlc_range1                         */
   1471 /*                                                                           */
   1472 /*  Description   : This function does the Cavlc  TEV range =1 parsing of    */
   1473 /*                  reference index  for a P MB. Range is 1 when             */
   1474 /*                  num_ref_idx_active_minus1 is 0                           */
   1475 /*                                                                           */
   1476 /*  Inputs        : <What inputs does the function take?>                    */
   1477 /*  Globals       : <Does it use any global variables?>                      */
   1478 /*  Processing    : <Describe how the function operates - include algorithm  */
   1479 /*                  description>                                             */
   1480 /*  Outputs       : <What does the function produce?>                        */
   1481 /*  Returns       : <What does the function return?>                         */
   1482 /*                                                                           */
   1483 /*  Issues        : <List any issues or problems with this function>         */
   1484 /*                                                                           */
   1485 /*  Revision History:                                                        */
   1486 /*                                                                           */
   1487 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1488 /*         19 09 2008   Jay          Draft                                   */
   1489 /*                                                                           */
   1490 /*****************************************************************************/
   1491 void ih264d_parse_pmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB      */
   1492                                              dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
   1493                                              WORD8 *pi1_ref_idx, /* pointer to reference index array */
   1494                                              UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1    */
   1495                                              )
   1496 {
   1497     UWORD32 u4_i;
   1498     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1499     UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
   1500     UNUSED(u4_num_ref_idx_active_minus1);
   1501     for(u4_i = 0; u4_i < u4_num_part; u4_i++)
   1502     {
   1503         UWORD32 u4_ref_idx;
   1504         u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf);
   1505 
   1506         /* Storing Reference Idx Information */
   1507         pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
   1508     }
   1509 }
   1510 
   1511 /*****************************************************************************/
   1512 /*                                                                           */
   1513 /*  Function Name : ih264d_parse_pmb_ref_index_cavlc                                */
   1514 /*                                                                           */
   1515 /*  Description   : This function does the Cavlc  TEV range > 1 parsing of   */
   1516 /*                  reference index  for a P MB.                             */
   1517 /*                  Range > 1 when num_ref_idx_active_minus1 > 0             */
   1518 /*                                                                           */
   1519 /*  Inputs        : <What inputs does the function take?>                    */
   1520 /*  Globals       : <Does it use any global variables?>                      */
   1521 /*  Processing    : <Describe how the function operates - include algorithm  */
   1522 /*                  description>                                             */
   1523 /*  Outputs       : <What does the function produce?>                        */
   1524 /*  Returns       : <What does the function return?>                         */
   1525 /*                                                                           */
   1526 /*  Issues        : <List any issues or problems with this function>         */
   1527 /*                                                                           */
   1528 /*  Revision History:                                                        */
   1529 /*                                                                           */
   1530 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1531 /*         19 09 2008   Jay          Draft                                   */
   1532 /*                                                                           */
   1533 /*****************************************************************************/
   1534 
   1535 WORD32 ih264d_parse_pmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB      */
   1536                                       dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
   1537                                       WORD8 *pi1_ref_idx, /* pointer to reference index array */
   1538                                       UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1  */
   1539                                       )
   1540 {
   1541     UWORD32 u4_i;
   1542     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1543     UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
   1544 
   1545     for(u4_i = 0; u4_i < u4_num_part; u4_i++)
   1546     {
   1547         UWORD32 u4_ref_idx;
   1548 //Inlined ih264d_uev
   1549         UWORD32 u4_bitstream_offset = *pu4_bitstream_off;
   1550         UWORD32 u4_word, u4_ldz;
   1551 
   1552         /***************************************************************/
   1553         /* Find leading zeros in next 32 bits                          */
   1554         /***************************************************************/
   1555         NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
   1556         u4_ldz = CLZ(u4_word);
   1557         /* Flush the ps_bitstrm */
   1558         u4_bitstream_offset += (u4_ldz + 1);
   1559         /* Read the suffix from the ps_bitstrm */
   1560         u4_word = 0;
   1561         if(u4_ldz)
   1562             GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
   1563         *pu4_bitstream_off = u4_bitstream_offset;
   1564         u4_ref_idx = ((1 << u4_ldz) + u4_word - 1);
   1565 //Inlined ih264d_uev
   1566 
   1567         if(u4_ref_idx > u4_num_ref_idx_active_minus1)
   1568             return ERROR_REF_IDX;
   1569 
   1570         /* Storing Reference Idx Information */
   1571         pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
   1572     }
   1573     return OK;
   1574 }
   1575 
   1576 /*****************************************************************************/
   1577 /*                                                                           */
   1578 /*  Function Name : ih264d_parse_bmb_ref_index_cavlc_range1                         */
   1579 /*                                                                           */
   1580 /*  Description   : This function does the Cavlc  TEV range =1 parsing of    */
   1581 /*                  reference index  for a B MB. Range is 1 when             */
   1582 /*                  num_ref_idx_active_minus1 is 0                           */
   1583 /*                                                                           */
   1584 /*  Inputs        : <What inputs does the function take?>                    */
   1585 /*  Globals       : <Does it use any global variables?>                      */
   1586 /*  Processing    : <Describe how the function operates - include algorithm  */
   1587 /*                  description>                                             */
   1588 /*  Outputs       : <What does the function produce?>                        */
   1589 /*  Returns       : <What does the function return?>                         */
   1590 /*                                                                           */
   1591 /*  Issues        : <List any issues or problems with this function>         */
   1592 /*                                                                           */
   1593 /*  Revision History:                                                        */
   1594 /*                                                                           */
   1595 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1596 /*         19 09 2008   Jay          Draft                                   */
   1597 /*                                                                           */
   1598 /*****************************************************************************/
   1599 void ih264d_parse_bmb_ref_index_cavlc_range1(UWORD32 u4_num_part, /* Number of partitions in MB      */
   1600                                              dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
   1601                                              WORD8 *pi1_ref_idx, /* pointer to reference index array */
   1602                                              UWORD32 u4_num_ref_idx_active_minus1 /* Not used for range 1    */
   1603                                              )
   1604 {
   1605     UWORD32 u4_i;
   1606     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1607     UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
   1608     UNUSED(u4_num_ref_idx_active_minus1);
   1609     for(u4_i = 0; u4_i < u4_num_part; u4_i++)
   1610     {
   1611         if(pi1_ref_idx[u4_i] > -1)
   1612         {
   1613             UWORD32 u4_ref_idx;
   1614 
   1615             u4_ref_idx = ih264d_tev_range1(pu4_bitstream_off, pu4_bitstrm_buf);
   1616 
   1617             /* Storing Reference Idx Information */
   1618             pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
   1619         }
   1620     }
   1621 }
   1622 
   1623 /*****************************************************************************/
   1624 /*                                                                           */
   1625 /*  Function Name : ih264d_parse_bmb_ref_index_cavlc                                */
   1626 /*                                                                           */
   1627 /*  Description   : This function does the Cavlc  TEV range > 1 parsing of   */
   1628 /*                  reference index  for a B MB.                             */
   1629 /*                  Range > 1 when num_ref_idx_active_minus1 > 0             */
   1630 /*                                                                           */
   1631 /*  Inputs        : <What inputs does the function take?>                    */
   1632 /*  Globals       : <Does it use any global variables?>                      */
   1633 /*  Processing    : <Describe how the function operates - include algorithm  */
   1634 /*                  description>                                             */
   1635 /*  Outputs       : <What does the function produce?>                        */
   1636 /*  Returns       : <What does the function return?>                         */
   1637 /*                                                                           */
   1638 /*  Issues        : <List any issues or problems with this function>         */
   1639 /*                                                                           */
   1640 /*  Revision History:                                                        */
   1641 /*                                                                           */
   1642 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1643 /*         19 09 2008   Jay          Draft                                   */
   1644 /*                                                                           */
   1645 /*****************************************************************************/
   1646 WORD32 ih264d_parse_bmb_ref_index_cavlc(UWORD32 u4_num_part, /* Number of partitions in MB      */
   1647                                       dec_bit_stream_t *ps_bitstrm, /* Pointer to bitstream Structure. */
   1648                                       WORD8 *pi1_ref_idx, /* pointer to reference index array */
   1649                                       UWORD32 u4_num_ref_idx_active_minus1 /* Number of active references - 1  */
   1650                                       )
   1651 {
   1652     UWORD32 u4_i;
   1653     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1654     UWORD32 *pu4_bitstream_off = &ps_bitstrm->u4_ofst;
   1655 
   1656     for(u4_i = 0; u4_i < u4_num_part; u4_i++)
   1657     {
   1658         if(pi1_ref_idx[u4_i] > -1)
   1659         {
   1660             UWORD32 u4_ref_idx;
   1661 //inlining ih264d_uev
   1662             UWORD32 u4_bitstream_offset = *pu4_bitstream_off;
   1663             UWORD32 u4_word, u4_ldz;
   1664 
   1665             /***************************************************************/
   1666             /* Find leading zeros in next 32 bits                          */
   1667             /***************************************************************/
   1668             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
   1669             u4_ldz = CLZ(u4_word);
   1670             /* Flush the ps_bitstrm */
   1671             u4_bitstream_offset += (u4_ldz + 1);
   1672             /* Read the suffix from the ps_bitstrm */
   1673             u4_word = 0;
   1674             if(u4_ldz)
   1675                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
   1676             *pu4_bitstream_off = u4_bitstream_offset;
   1677             u4_ref_idx = ((1 << u4_ldz) + u4_word - 1);
   1678 //inlining ih264d_uev
   1679             if(u4_ref_idx > u4_num_ref_idx_active_minus1)
   1680                 return ERROR_REF_IDX;
   1681 
   1682             /* Storing Reference Idx Information */
   1683             pi1_ref_idx[u4_i] = (WORD8)u4_ref_idx;
   1684         }
   1685     }
   1686     return OK;
   1687 }
   1688 /*****************************************************************************/
   1689 /*                                                                           */
   1690 /*  Function Name : ih264d_cavlc_parse_8x8block_both_available                      */
   1691 /*                                                                           */
   1692 /*  Description   : This function does the residual parsing of 4 subblocks   */
   1693 /*                  in a 8x8 block when both top and left are available      */
   1694 /*                                                                           */
   1695 /*  Inputs        : pi2_coeff_block : pointer to residual block where        */
   1696 /*                  decoded and inverse scan coefficients are updated        */
   1697 /*                                                                           */
   1698 /*                  u4_sub_block_strd : indicates the number of sublocks    */
   1699 /*                  in a row. It is 4 for luma and 2 for chroma.             */
   1700 /*                                                                           */
   1701 /*                  u4_isdc : required to indicate 4x4 parse modules if the  */
   1702 /*                  current  Mb is I_16x16/chroma DC coded.                  */
   1703 /*                                                                           */
   1704 /*                  ps_dec : pointer to Decstruct (decoder context)          */
   1705 /*                                                                           */
   1706 /*                  pu1_top_nnz : top nnz pointer                            */
   1707 /*                                                                           */
   1708 /*                  pu1_left_nnz : left nnz pointer                          */
   1709 /*                                                                           */
   1710 /*  Globals       : No                                                       */
   1711 /*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
   1712 /*                  are updated on the fly. csbp is set in accordance to     */
   1713 /*                  decoded numcoeff for the subblock index in raster order  */
   1714 /*                                                                           */
   1715 /*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
   1716 /*                                                                           */
   1717 /*  Returns       : Returns the coded sub block pattern csbp for the block   */
   1718 /*                                                                           */
   1719 /*  Issues        : <List any issues or problems with this function>         */
   1720 /*                                                                           */
   1721 /*  Revision History:                                                        */
   1722 /*                                                                           */
   1723 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1724 /*         09 10 2008   Jay          Draft                                   */
   1725 /*                                                                           */
   1726 /*****************************************************************************/
   1727 WORD32 ih264d_cavlc_parse_8x8block_both_available(WORD16 *pi2_coeff_block,
   1728                                                   UWORD32 u4_sub_block_strd,
   1729                                                   UWORD32 u4_isdc,
   1730                                                   dec_struct_t * ps_dec,
   1731                                                   UWORD8 *pu1_top_nnz,
   1732                                                   UWORD8 *pu1_left_nnz,
   1733                                                   UWORD8 u1_tran_form8x8,
   1734                                                   UWORD8 u1_mb_field_decodingflag,
   1735                                                   UWORD32 *pu4_csbp)
   1736 {
   1737     UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
   1738     UWORD32 u4_top0, u4_top1;
   1739     UWORD32 *pu4_dummy;
   1740     WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
   1741                                       UWORD32 u4_isdc,
   1742                                       WORD32 u4_n,
   1743                                       struct _DecStruct *ps_dec,
   1744                                       UWORD32 *pu4_dummy) =
   1745                                       ps_dec->pf_cavlc_parse4x4coeff;
   1746     UWORD32 u4_idx = 0;
   1747     UWORD8 *puc_temp;
   1748     WORD32 ret;
   1749 
   1750     *pu4_csbp = 0;
   1751     /* need to change the inverse scan matrices here */
   1752     puc_temp = ps_dec->pu1_inv_scan;
   1753 
   1754     /*------------------------------------------------------*/
   1755     /* Residual 4x4 decoding: SubBlock 0                    */
   1756     /*------------------------------------------------------*/
   1757     if(u1_tran_form8x8)
   1758     {
   1759         if(!u1_mb_field_decodingflag)
   1760         {
   1761             ps_dec->pu1_inv_scan =
   1762                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
   1763         }
   1764         else
   1765         {
   1766             ps_dec->pu1_inv_scan =
   1767                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
   1768         }
   1769     }
   1770     u4_n = (pu1_top_nnz[0] + pu1_left_nnz[0] + 1) >> 1;
   1771     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   1772                                              u4_n, ps_dec, &u4_num_coeff);
   1773     if(ret != OK)
   1774         return ret;
   1775 
   1776     u4_top0 = u4_num_coeff;
   1777     u4_subblock_coded = (u4_num_coeff != 0);
   1778     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   1779 
   1780     /*------------------------------------------------------*/
   1781     /* Residual 4x4 decoding: SubBlock 1                    */
   1782     /*------------------------------------------------------*/
   1783     u4_idx++;
   1784     if(u1_tran_form8x8)
   1785     {
   1786         if(!u1_mb_field_decodingflag)
   1787         {
   1788             ps_dec->pu1_inv_scan =
   1789                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
   1790         }
   1791         else
   1792         {
   1793             ps_dec->pu1_inv_scan =
   1794                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
   1795         }
   1796     }
   1797     else
   1798     {
   1799         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   1800     }
   1801     u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1;
   1802     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   1803                                              u4_n, ps_dec, &u4_num_coeff);
   1804     if(ret != OK)
   1805         return ret;
   1806 
   1807     u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
   1808     u4_subblock_coded = (u4_num_coeff != 0);
   1809     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   1810 
   1811     /*------------------------------------------------------*/
   1812     /* Residual 4x4 decoding: SubBlock 2                    */
   1813     /*------------------------------------------------------*/
   1814     u4_idx += (u4_sub_block_strd - 1);
   1815     if(u1_tran_form8x8)
   1816     {
   1817         if(!u1_mb_field_decodingflag)
   1818         {
   1819             ps_dec->pu1_inv_scan =
   1820                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
   1821         }
   1822         else
   1823         {
   1824             ps_dec->pu1_inv_scan =
   1825                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
   1826         }
   1827     }
   1828     else
   1829     {
   1830         pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
   1831     }
   1832     u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1;
   1833     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   1834                                              u4_n, ps_dec, &u4_num_coeff);
   1835     if(ret != OK)
   1836         return ret;
   1837 
   1838     pu1_top_nnz[0] = u4_num_coeff;
   1839     u4_subblock_coded = (u4_num_coeff != 0);
   1840     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   1841 
   1842     /*------------------------------------------------------*/
   1843     /* Residual 4x4 decoding: SubBlock 3                    */
   1844     /*------------------------------------------------------*/
   1845     u4_idx++;
   1846     if(u1_tran_form8x8)
   1847     {
   1848         if(!u1_mb_field_decodingflag)
   1849         {
   1850             ps_dec->pu1_inv_scan =
   1851                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
   1852         }
   1853         else
   1854         {
   1855             ps_dec->pu1_inv_scan =
   1856                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
   1857         }
   1858     }
   1859     else
   1860     {
   1861         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   1862     }
   1863     u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
   1864     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   1865                                              u4_n, ps_dec, &u4_num_coeff);
   1866     if(ret != OK)
   1867         return ret;
   1868 
   1869     pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
   1870     u4_subblock_coded = (u4_num_coeff != 0);
   1871     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   1872 
   1873     ps_dec->pu1_inv_scan = puc_temp;
   1874 
   1875     return OK;
   1876 }
   1877 
   1878 /*****************************************************************************/
   1879 /*                                                                           */
   1880 /*  Function Name : ih264d_cavlc_parse_8x8block_left_available                      */
   1881 /*                                                                           */
   1882 /*  Description   : This function does the residual parsing of 4 subblocks   */
   1883 /*                  in a 8x8 block when only left is available for block     */
   1884 /*                                                                           */
   1885 /*  Inputs        : pi2_coeff_block : pointer to residual block where        */
   1886 /*                  decoded and inverse scan coefficients are updated        */
   1887 /*                                                                           */
   1888 /*                  u4_sub_block_strd : indicates the number of sublocks    */
   1889 /*                  in a row. It is 4 for luma and 2 for chroma.             */
   1890 /*                                                                           */
   1891 /*                  u4_isdc : required to indicate 4x4 parse modules if the  */
   1892 /*                  current  Mb is I_16x16/chroma DC coded.                  */
   1893 /*                                                                           */
   1894 /*                  ps_dec : pointer to Decstruct (decoder context)          */
   1895 /*                                                                           */
   1896 /*                  pu1_top_nnz : top nnz pointer                            */
   1897 /*                                                                           */
   1898 /*                  pu1_left_nnz : left nnz pointer                          */
   1899 /*                                                                           */
   1900 /*  Globals       : No                                                       */
   1901 /*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
   1902 /*                  are updated on the fly. csbp is set in accordance to     */
   1903 /*                  decoded numcoeff for the subblock index in raster order  */
   1904 /*                                                                           */
   1905 /*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
   1906 /*                                                                           */
   1907 /*  Returns       : Returns the coded sub block pattern csbp for the block   */
   1908 /*                                                                           */
   1909 /*  Issues        : <List any issues or problems with this function>         */
   1910 /*                                                                           */
   1911 /*  Revision History:                                                        */
   1912 /*                                                                           */
   1913 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1914 /*         09 10 2008   Jay          Draft                                   */
   1915 /*                                                                           */
   1916 /*****************************************************************************/
   1917 WORD32 ih264d_cavlc_parse_8x8block_left_available(WORD16 *pi2_coeff_block,
   1918                                                   UWORD32 u4_sub_block_strd,
   1919                                                   UWORD32 u4_isdc,
   1920                                                   dec_struct_t * ps_dec,
   1921                                                   UWORD8 *pu1_top_nnz,
   1922                                                   UWORD8 *pu1_left_nnz,
   1923                                                   UWORD8 u1_tran_form8x8,
   1924                                                   UWORD8 u1_mb_field_decodingflag,
   1925                                                   UWORD32 *pu4_csbp)
   1926 {
   1927     UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
   1928     UWORD32 u4_top0, u4_top1;
   1929     UWORD32 *pu4_dummy;
   1930     WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
   1931                                       UWORD32 u4_isdc,
   1932                                       WORD32 u4_n,
   1933                                       struct _DecStruct *ps_dec,
   1934                                       UWORD32 *pu4_dummy) =
   1935                                       ps_dec->pf_cavlc_parse4x4coeff;
   1936     UWORD32 u4_idx = 0;
   1937     UWORD8 *puc_temp;
   1938     WORD32 ret;
   1939 
   1940     *pu4_csbp = 0;
   1941     puc_temp = ps_dec->pu1_inv_scan;
   1942 
   1943     /*------------------------------------------------------*/
   1944     /* Residual 4x4 decoding: SubBlock 0                    */
   1945     /*------------------------------------------------------*/
   1946     if(u1_tran_form8x8)
   1947     {
   1948         if(!u1_mb_field_decodingflag)
   1949         {
   1950             ps_dec->pu1_inv_scan =
   1951                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
   1952         }
   1953         else
   1954         {
   1955             ps_dec->pu1_inv_scan =
   1956                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
   1957         }
   1958     }
   1959     u4_n = pu1_left_nnz[0];
   1960     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   1961                                              u4_n, ps_dec, &u4_num_coeff);
   1962     if(ret != OK)
   1963         return ret;
   1964 
   1965     u4_top0 = u4_num_coeff;
   1966     u4_subblock_coded = (u4_num_coeff != 0);
   1967     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   1968 
   1969     /*------------------------------------------------------*/
   1970     /* Residual 4x4 decoding: SubBlock 1                    */
   1971     /*------------------------------------------------------*/
   1972     u4_idx++;
   1973     if(u1_tran_form8x8)
   1974     {
   1975         if(!u1_mb_field_decodingflag)
   1976         {
   1977             ps_dec->pu1_inv_scan =
   1978                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
   1979         }
   1980         else
   1981         {
   1982             ps_dec->pu1_inv_scan =
   1983                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
   1984         }
   1985     }
   1986     else
   1987     {
   1988         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   1989     }
   1990     u4_n = u4_num_coeff;
   1991     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   1992                                              u4_n, ps_dec, &u4_num_coeff);
   1993     if(ret != OK)
   1994         return ret;
   1995 
   1996     u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
   1997     u4_subblock_coded = (u4_num_coeff != 0);
   1998     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   1999 
   2000     /*------------------------------------------------------*/
   2001     /* Residual 4x4 decoding: SubBlock 2                    */
   2002     /*------------------------------------------------------*/
   2003     u4_idx += (u4_sub_block_strd - 1);
   2004     if(u1_tran_form8x8)
   2005     {
   2006         if(!u1_mb_field_decodingflag)
   2007         {
   2008             ps_dec->pu1_inv_scan =
   2009                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
   2010         }
   2011         else
   2012         {
   2013             ps_dec->pu1_inv_scan =
   2014                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
   2015         }
   2016     }
   2017     else
   2018     {
   2019         pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
   2020     }
   2021     u4_n = (u4_top0 + pu1_left_nnz[1] + 1) >> 1;
   2022     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2023                                              u4_n, ps_dec, &u4_num_coeff);
   2024     if(ret != OK)
   2025         return ret;
   2026 
   2027     pu1_top_nnz[0] = u4_num_coeff;
   2028     u4_subblock_coded = (u4_num_coeff != 0);
   2029     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2030 
   2031     /*------------------------------------------------------*/
   2032     /* Residual 4x4 decoding: SubBlock 3                    */
   2033     /*------------------------------------------------------*/
   2034     u4_idx++;
   2035     if(u1_tran_form8x8)
   2036     {
   2037         if(!u1_mb_field_decodingflag)
   2038         {
   2039             ps_dec->pu1_inv_scan =
   2040                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
   2041         }
   2042         else
   2043         {
   2044             ps_dec->pu1_inv_scan =
   2045                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
   2046         }
   2047     }
   2048     else
   2049     {
   2050         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   2051     }
   2052     u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
   2053     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2054                                              u4_n, ps_dec, &u4_num_coeff);
   2055     if(ret != OK)
   2056         return ret;
   2057 
   2058     pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
   2059     u4_subblock_coded = (u4_num_coeff != 0);
   2060     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2061 
   2062     ps_dec->pu1_inv_scan = puc_temp;
   2063 
   2064     return OK;
   2065 }
   2066 
   2067 /*****************************************************************************/
   2068 /*                                                                           */
   2069 /*  Function Name : ih264d_cavlc_parse_8x8block_top_available                       */
   2070 /*                                                                           */
   2071 /*  Description   : This function does the residual parsing of 4 subblocks   */
   2072 /*                  in a 8x8 block when only top is available for block      */
   2073 /*                                                                           */
   2074 /*  Inputs        : pi2_coeff_block : pointer to residual block where        */
   2075 /*                  decoded and inverse scan coefficients are updated        */
   2076 /*                                                                           */
   2077 /*                  u4_sub_block_strd : indicates the number of sublocks    */
   2078 /*                  in a row. It is 4 for luma and 2 for chroma.             */
   2079 /*                                                                           */
   2080 /*                  u4_isdc : required to indicate 4x4 parse modules if the  */
   2081 /*                  current  Mb is I_16x16/chroma DC coded.                  */
   2082 /*                                                                           */
   2083 /*                  ps_dec : pointer to Decstruct (decoder context)          */
   2084 /*                                                                           */
   2085 /*                  pu1_top_nnz : top nnz pointer                            */
   2086 /*                                                                           */
   2087 /*                  pu1_left_nnz : left nnz pointer                          */
   2088 /*                                                                           */
   2089 /*  Globals       : No                                                       */
   2090 /*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
   2091 /*                  are updated on the fly. csbp is set in accordance to     */
   2092 /*                  decoded numcoeff for the subblock index in raster order  */
   2093 /*                                                                           */
   2094 /*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
   2095 /*                                                                           */
   2096 /*  Returns       : Returns the coded sub block pattern csbp for the block   */
   2097 /*                                                                           */
   2098 /*  Issues        : <List any issues or problems with this function>         */
   2099 /*                                                                           */
   2100 /*  Revision History:                                                        */
   2101 /*                                                                           */
   2102 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   2103 /*         09 10 2008   Jay          Draft                                   */
   2104 /*                                                                           */
   2105 /*****************************************************************************/
   2106 WORD32 ih264d_cavlc_parse_8x8block_top_available(WORD16 *pi2_coeff_block,
   2107                                                  UWORD32 u4_sub_block_strd,
   2108                                                  UWORD32 u4_isdc,
   2109                                                  dec_struct_t * ps_dec,
   2110                                                  UWORD8 *pu1_top_nnz,
   2111                                                  UWORD8 *pu1_left_nnz,
   2112                                                  UWORD8 u1_tran_form8x8,
   2113                                                  UWORD8 u1_mb_field_decodingflag,
   2114                                                  UWORD32 *pu4_csbp)
   2115 {
   2116     UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
   2117     UWORD32 u4_top0, u4_top1;
   2118     UWORD32 *pu4_dummy;
   2119     WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
   2120                                       UWORD32 u4_isdc,
   2121                                       WORD32 u4_n,
   2122                                       struct _DecStruct *ps_dec,
   2123                                       UWORD32 *pu4_dummy) =
   2124                                       ps_dec->pf_cavlc_parse4x4coeff;
   2125     UWORD32 u4_idx = 0;
   2126     UWORD8 *puc_temp;
   2127     WORD32 ret;
   2128 
   2129     *pu4_csbp = 0;
   2130     puc_temp = ps_dec->pu1_inv_scan;
   2131 
   2132     /*------------------------------------------------------*/
   2133     /* Residual 4x4 decoding: SubBlock 0                    */
   2134     /*------------------------------------------------------*/
   2135     if(u1_tran_form8x8)
   2136     {
   2137         if(!u1_mb_field_decodingflag)
   2138         {
   2139             ps_dec->pu1_inv_scan =
   2140                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
   2141         }
   2142         else
   2143         {
   2144             ps_dec->pu1_inv_scan =
   2145                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
   2146         }
   2147     }
   2148     u4_n = pu1_top_nnz[0];
   2149     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2150                                              u4_n, ps_dec, &u4_num_coeff);
   2151     if(ret != OK)
   2152         return ret;
   2153 
   2154     u4_top0 = u4_num_coeff;
   2155     u4_subblock_coded = (u4_num_coeff != 0);
   2156     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2157 
   2158     /*------------------------------------------------------*/
   2159     /* Residual 4x4 decoding: SubBlock 1                    */
   2160     /*------------------------------------------------------*/
   2161     u4_idx++;
   2162     if(u1_tran_form8x8)
   2163     {
   2164         if(!u1_mb_field_decodingflag)
   2165         {
   2166             ps_dec->pu1_inv_scan =
   2167                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
   2168         }
   2169         else
   2170         {
   2171             ps_dec->pu1_inv_scan =
   2172                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
   2173         }
   2174     }
   2175     else
   2176     {
   2177         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   2178     }
   2179     u4_n = (pu1_top_nnz[1] + u4_num_coeff + 1) >> 1;
   2180     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2181                                              u4_n, ps_dec, &u4_num_coeff);
   2182     if(ret != OK)
   2183         return ret;
   2184 
   2185     u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
   2186     u4_subblock_coded = (u4_num_coeff != 0);
   2187     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2188 
   2189     /*------------------------------------------------------*/
   2190     /* Residual 4x4 decoding: SubBlock 2                    */
   2191     /*------------------------------------------------------*/
   2192     u4_idx += (u4_sub_block_strd - 1);
   2193     if(u1_tran_form8x8)
   2194     {
   2195         if(!u1_mb_field_decodingflag)
   2196         {
   2197             ps_dec->pu1_inv_scan =
   2198                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
   2199         }
   2200         else
   2201         {
   2202             ps_dec->pu1_inv_scan =
   2203                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
   2204         }
   2205     }
   2206     else
   2207     {
   2208         pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
   2209     }
   2210     u4_n = u4_top0;
   2211     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2212                                              u4_n, ps_dec, &u4_num_coeff);
   2213     if(ret != OK)
   2214         return ret;
   2215 
   2216     pu1_top_nnz[0] = u4_num_coeff;
   2217     u4_subblock_coded = (u4_num_coeff != 0);
   2218     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2219 
   2220     /*------------------------------------------------------*/
   2221     /* Residual 4x4 decoding: SubBlock 3                    */
   2222     /*------------------------------------------------------*/
   2223     u4_idx++;
   2224     if(u1_tran_form8x8)
   2225     {
   2226         if(!u1_mb_field_decodingflag)
   2227         {
   2228             ps_dec->pu1_inv_scan =
   2229                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
   2230         }
   2231         else
   2232         {
   2233             ps_dec->pu1_inv_scan =
   2234                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
   2235         }
   2236     }
   2237     else
   2238     {
   2239         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   2240     }
   2241     u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
   2242     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2243                                              u4_n, ps_dec, &u4_num_coeff);
   2244     if(ret != OK)
   2245         return ret;
   2246 
   2247     pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
   2248     u4_subblock_coded = (u4_num_coeff != 0);
   2249     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2250 
   2251     ps_dec->pu1_inv_scan = puc_temp;
   2252 
   2253     return OK;
   2254 }
   2255 
   2256 /*****************************************************************************/
   2257 /*                                                                           */
   2258 /*  Function Name : ih264d_cavlc_parse_8x8block_none_available                      */
   2259 /*                                                                           */
   2260 /*  Description   : This function does the residual parsing of 4 subblocks   */
   2261 /*                  in a 8x8 block when none of the neigbours are available  */
   2262 /*                                                                           */
   2263 /*  Inputs        : pi2_coeff_block : pointer to residual block where        */
   2264 /*                  decoded and inverse scan coefficients are updated        */
   2265 /*                                                                           */
   2266 /*                  u4_sub_block_strd : indicates the number of sublocks    */
   2267 /*                  in a row. It is 4 for luma and 2 for chroma.             */
   2268 /*                                                                           */
   2269 /*                  u4_isdc : required to indicate 4x4 parse modules if the  */
   2270 /*                  current  Mb is I_16x16/chroma DC coded.                  */
   2271 /*                                                                           */
   2272 /*                  ps_dec : pointer to Decstruct (decoder context)          */
   2273 /*                                                                           */
   2274 /*                  pu1_top_nnz : top nnz pointer                            */
   2275 /*                                                                           */
   2276 /*                  pu1_left_nnz : left nnz pointer                          */
   2277 /*                                                                           */
   2278 /*  Globals       : No                                                       */
   2279 /*  Processing    : Parsing for four subblocks in unrolled, top and left nnz */
   2280 /*                  are updated on the fly. csbp is set in accordance to     */
   2281 /*                  decoded numcoeff for the subblock index in raster order  */
   2282 /*                                                                           */
   2283 /*  Outputs       : The updated residue buffer, nnzs and csbp current block  */
   2284 /*                                                                           */
   2285 /*  Returns       : Returns the coded sub block pattern csbp for the block   */
   2286 /*                                                                           */
   2287 /*  Issues        : <List any issues or problems with this function>         */
   2288 /*                                                                           */
   2289 /*  Revision History:                                                        */
   2290 /*                                                                           */
   2291 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   2292 /*         09 10 2008   Jay          Draft                                   */
   2293 /*                                                                           */
   2294 /*****************************************************************************/
   2295 WORD32 ih264d_cavlc_parse_8x8block_none_available(WORD16 *pi2_coeff_block,
   2296                                                   UWORD32 u4_sub_block_strd,
   2297                                                   UWORD32 u4_isdc,
   2298                                                   dec_struct_t * ps_dec,
   2299                                                   UWORD8 *pu1_top_nnz,
   2300                                                   UWORD8 *pu1_left_nnz,
   2301                                                   UWORD8 u1_tran_form8x8,
   2302                                                   UWORD8 u1_mb_field_decodingflag,
   2303                                                   UWORD32 *pu4_csbp)
   2304 {
   2305     UWORD32 u4_num_coeff, u4_n, u4_subblock_coded;
   2306     UWORD32 u4_top0, u4_top1;
   2307     UWORD32 *pu4_dummy;
   2308     WORD32 (**pf_cavlc_parse4x4coeff)(WORD16 *pi2_coeff_block,
   2309                                       UWORD32 u4_isdc,
   2310                                       WORD32 u4_n,
   2311                                       struct _DecStruct *ps_dec,
   2312                                       UWORD32 *pu4_dummy) =
   2313                                       ps_dec->pf_cavlc_parse4x4coeff;
   2314     UWORD32 u4_idx = 0;
   2315     UWORD8 *puc_temp;
   2316     WORD32 ret;
   2317 
   2318     *pu4_csbp = 0;
   2319     puc_temp = ps_dec->pu1_inv_scan;
   2320 
   2321     /*------------------------------------------------------*/
   2322     /* Residual 4x4 decoding: SubBlock 0                    */
   2323     /*------------------------------------------------------*/
   2324     if(u1_tran_form8x8)
   2325     {
   2326         if(!u1_mb_field_decodingflag)
   2327         {
   2328             ps_dec->pu1_inv_scan =
   2329                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
   2330         }
   2331         else
   2332         {
   2333             ps_dec->pu1_inv_scan =
   2334                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
   2335         }
   2336     }
   2337     ret = pf_cavlc_parse4x4coeff[0](pi2_coeff_block, u4_isdc, 0,
   2338                                     ps_dec, &u4_num_coeff);
   2339     if(ret != OK)
   2340         return ret;
   2341 
   2342     u4_top0 = u4_num_coeff;
   2343     u4_subblock_coded = (u4_num_coeff != 0);
   2344     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2345 
   2346     /*------------------------------------------------------*/
   2347     /* Residual 4x4 decoding: SubBlock 1                    */
   2348     /*------------------------------------------------------*/
   2349     u4_idx++;
   2350     if(u1_tran_form8x8)
   2351     {
   2352         if(!u1_mb_field_decodingflag)
   2353         {
   2354             ps_dec->pu1_inv_scan =
   2355                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
   2356         }
   2357         else
   2358         {
   2359             ps_dec->pu1_inv_scan =
   2360                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
   2361         }
   2362     }
   2363     else
   2364     {
   2365         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   2366     }
   2367     u4_n = u4_num_coeff;
   2368     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2369                                              u4_n, ps_dec, &u4_num_coeff);
   2370     if(ret != OK)
   2371         return ret;
   2372 
   2373     u4_top1 = pu1_left_nnz[0] = u4_num_coeff;
   2374     u4_subblock_coded = (u4_num_coeff != 0);
   2375     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2376 
   2377     /*------------------------------------------------------*/
   2378     /* Residual 4x4 decoding: SubBlock 2                    */
   2379     /*------------------------------------------------------*/
   2380     u4_idx += (u4_sub_block_strd - 1);
   2381     if(u1_tran_form8x8)
   2382     {
   2383         if(!u1_mb_field_decodingflag)
   2384         {
   2385             ps_dec->pu1_inv_scan =
   2386                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
   2387         }
   2388         else
   2389         {
   2390             ps_dec->pu1_inv_scan =
   2391                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
   2392         }
   2393     }
   2394     else
   2395     {
   2396         pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK);
   2397     }
   2398     u4_n = u4_top0;
   2399     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2400                                              u4_n, ps_dec, &u4_num_coeff);
   2401     if(ret != OK)
   2402         return ret;
   2403 
   2404     pu1_top_nnz[0] = u4_num_coeff;
   2405     u4_subblock_coded = (u4_num_coeff != 0);
   2406     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2407 
   2408     /*------------------------------------------------------*/
   2409     /* Residual 4x4 decoding: SubBlock 3                    */
   2410     /*------------------------------------------------------*/
   2411     u4_idx++;
   2412     if(u1_tran_form8x8)
   2413     {
   2414         if(!u1_mb_field_decodingflag)
   2415         {
   2416             ps_dec->pu1_inv_scan =
   2417                             (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
   2418         }
   2419         else
   2420         {
   2421             ps_dec->pu1_inv_scan =
   2422                             (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
   2423         }
   2424     }
   2425     else
   2426     {
   2427         pi2_coeff_block += NUM_COEFFS_IN_4x4BLK;
   2428     }
   2429     u4_n = (u4_top1 + u4_num_coeff + 1) >> 1;
   2430     ret = pf_cavlc_parse4x4coeff[(u4_n > 7)](pi2_coeff_block, u4_isdc,
   2431                                              u4_n, ps_dec, &u4_num_coeff);
   2432     if(ret != OK)
   2433         return ret;
   2434 
   2435     pu1_top_nnz[1] = pu1_left_nnz[1] = u4_num_coeff;
   2436     u4_subblock_coded = (u4_num_coeff != 0);
   2437     INSERT_BIT(*pu4_csbp, u4_idx, u4_subblock_coded);
   2438 
   2439     ps_dec->pu1_inv_scan = puc_temp;
   2440 
   2441     return OK;
   2442 }
   2443 
   2444 /*!
   2445  **************************************************************************
   2446  * \if Function name : ih264d_parse_residual4x4_cavlc \endif
   2447  *
   2448  * \brief
   2449  *    This function parses CAVLC syntax of a Luma and Chroma AC Residuals.
   2450  *
   2451  * \return
   2452  *    0 on Success and Error code otherwise
   2453  **************************************************************************
   2454  */
   2455 
   2456 WORD32 ih264d_parse_residual4x4_cavlc(dec_struct_t * ps_dec,
   2457                                       dec_mb_info_t *ps_cur_mb_info,
   2458                                       UWORD8 u1_offset)
   2459 {
   2460     UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp;
   2461     UWORD16 ui16_csbp = 0;
   2462     UWORD32 u4_nbr_avl;
   2463     WORD16 *pi2_residual_buf;
   2464 
   2465     UWORD8 u1_is_top_mb_avail;
   2466     UWORD8 u1_is_left_mb_avail;
   2467 
   2468     UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
   2469     UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y;
   2470     WORD16 *pi2_coeff_block = NULL;
   2471     UWORD32 *pu4_dummy;
   2472     WORD32 ret;
   2473 
   2474     WORD32 (**pf_cavlc_parse_8x8block)(WORD16 *pi2_coeff_block,
   2475                                        UWORD32 u4_sub_block_strd,
   2476                                        UWORD32 u4_isdc,
   2477                                        struct _DecStruct *ps_dec,
   2478                                        UWORD8 *pu1_top_nnz,
   2479                                        UWORD8 *pu1_left_nnz,
   2480                                        UWORD8 u1_tran_form8x8,
   2481                                        UWORD8 u1_mb_field_decodingflag,
   2482                                        UWORD32 *pu4_dummy) = ps_dec->pf_cavlc_parse_8x8block;
   2483 
   2484 
   2485     {
   2486         UWORD8 uc_temp = ps_dec->u1_mb_ngbr_availablity;
   2487         u1_is_top_mb_avail = BOOLEAN(uc_temp & TOP_MB_AVAILABLE_MASK);
   2488         u1_is_left_mb_avail = BOOLEAN(uc_temp & LEFT_MB_AVAILABLE_MASK);
   2489         u4_nbr_avl = (u1_is_top_mb_avail << 1) | u1_is_left_mb_avail;
   2490     }
   2491 
   2492     ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6;
   2493     ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6;
   2494     ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6;
   2495     ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6;
   2496     ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6;
   2497     ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6;
   2498 
   2499     if(u1_cbp & 0xf)
   2500     {
   2501         pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0];
   2502         pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[1];
   2503         pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[2];
   2504         pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[3];
   2505 
   2506         /*******************************************************************/
   2507         /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */
   2508         /*******************************************************************/
   2509         if(!(u1_cbp & 0x1))
   2510         {
   2511             *(UWORD16 *)(pu1_top_nnz) = 0;
   2512             *(UWORD16 *)(pu1_left_nnz) = 0;
   2513 
   2514         }
   2515         else
   2516         {
   2517             UWORD32 u4_temp;
   2518             ret = pf_cavlc_parse_8x8block[u4_nbr_avl](
   2519                         pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz,
   2520                         pu1_left_nnz, ps_cur_mb_info->u1_tran_form8x8,
   2521                         ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
   2522             if(ret != OK)
   2523                 return ret;
   2524             ui16_csbp = u4_temp;
   2525         }
   2526 
   2527         /*******************************************************************/
   2528         /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */
   2529         /*******************************************************************/
   2530         if(ps_cur_mb_info->u1_tran_form8x8)
   2531         {
   2532             pi2_coeff_block += 64;
   2533         }
   2534         else
   2535         {
   2536             pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
   2537         }
   2538 
   2539         if(!(u1_cbp & 0x2))
   2540         {
   2541             *(UWORD16 *)(pu1_top_nnz + 2) = 0;
   2542             *(UWORD16 *)(pu1_left_nnz) = 0;
   2543         }
   2544         else
   2545         {
   2546             UWORD32 u4_temp = (u4_nbr_avl | 0x1);
   2547             ret = pf_cavlc_parse_8x8block[u4_temp](
   2548                         pi2_coeff_block, 4, u1_offset, ps_dec,
   2549                         (pu1_top_nnz + 2), pu1_left_nnz,
   2550                         ps_cur_mb_info->u1_tran_form8x8,
   2551                         ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
   2552             if(ret != OK)
   2553                 return ret;
   2554             ui16_csbp |= (u4_temp << 2);
   2555         }
   2556 
   2557         /*******************************************************************/
   2558         /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */
   2559         /*******************************************************************/
   2560         if(ps_cur_mb_info->u1_tran_form8x8)
   2561         {
   2562             pi2_coeff_block += 64;
   2563         }
   2564         else
   2565         {
   2566             pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK);
   2567         }
   2568 
   2569         if(!(u1_cbp & 0x4))
   2570         {
   2571             *(UWORD16 *)(pu1_top_nnz) = 0;
   2572             *(UWORD16 *)(pu1_left_nnz + 2) = 0;
   2573         }
   2574         else
   2575         {
   2576             UWORD32 u4_temp = (u4_nbr_avl | 0x2);
   2577             ret = pf_cavlc_parse_8x8block[u4_temp](
   2578                         pi2_coeff_block, 4, u1_offset, ps_dec, pu1_top_nnz,
   2579                         (pu1_left_nnz + 2), ps_cur_mb_info->u1_tran_form8x8,
   2580                         ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
   2581             if(ret != OK)
   2582                 return ret;
   2583             ui16_csbp |= (u4_temp << 8);
   2584         }
   2585 
   2586         /*******************************************************************/
   2587         /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/
   2588         /*******************************************************************/
   2589         if(ps_cur_mb_info->u1_tran_form8x8)
   2590         {
   2591             pi2_coeff_block += 64;
   2592         }
   2593         else
   2594         {
   2595             pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK);
   2596         }
   2597 
   2598         if(!(u1_cbp & 0x8))
   2599         {
   2600             *(UWORD16 *)(pu1_top_nnz + 2) = 0;
   2601             *(UWORD16 *)(pu1_left_nnz + 2) = 0;
   2602         }
   2603         else
   2604         {
   2605             UWORD32 u4_temp;
   2606             ret = pf_cavlc_parse_8x8block[0x3](
   2607                         pi2_coeff_block, 4, u1_offset, ps_dec,
   2608                         (pu1_top_nnz + 2), (pu1_left_nnz + 2),
   2609                         ps_cur_mb_info->u1_tran_form8x8,
   2610                         ps_cur_mb_info->u1_mb_field_decodingflag, &u4_temp);
   2611             if(ret != OK)
   2612                 return ret;
   2613             ui16_csbp |= (u4_temp << 10);
   2614         }
   2615     }
   2616     else
   2617     {
   2618         *(UWORD32 *)(pu1_top_nnz) = 0;
   2619         *(UWORD32 *)(pu1_left_nnz) = 0;
   2620     }
   2621 
   2622     ps_cur_mb_info->u2_luma_csbp = ui16_csbp;
   2623     ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp;
   2624 
   2625     {
   2626         UWORD16 u2_chroma_csbp = 0;
   2627         ps_cur_mb_info->u2_chroma_csbp = 0;
   2628         pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
   2629         pu1_left_nnz = ps_dec->pu1_left_nnz_uv;
   2630 
   2631         u1_cbp >>= 4;
   2632         /*--------------------------------------------------------------------*/
   2633         /* if Chroma Component not present OR no ac values present            */
   2634         /* Set the values of N to zero                                        */
   2635         /*--------------------------------------------------------------------*/
   2636         if(u1_cbp == CBPC_ALLZERO || u1_cbp == CBPC_ACZERO)
   2637         {
   2638             *(UWORD32 *)(pu1_top_nnz) = 0;
   2639             *(UWORD32 *)(pu1_left_nnz) = 0;
   2640         }
   2641 
   2642         if(u1_cbp == CBPC_ALLZERO)
   2643         {
   2644             return (0);
   2645         }
   2646         /*--------------------------------------------------------------------*/
   2647         /* Decode Chroma DC values                                            */
   2648         /*--------------------------------------------------------------------*/
   2649         {
   2650             WORD32 u4_scale_u;
   2651             WORD32 u4_scale_v;
   2652             WORD32 i4_mb_inter_inc;
   2653             u4_scale_u = ps_dec->pu2_quant_scale_u[0] << ps_dec->u1_qp_u_div6;
   2654             u4_scale_v = ps_dec->pu2_quant_scale_v[0] << ps_dec->u1_qp_v_div6;
   2655             i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB)
   2656                             || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB)))
   2657                             * 3;
   2658 
   2659             if(ps_dec->s_high_profile.u1_scaling_present)
   2660             {
   2661                 u4_scale_u *=
   2662                                 ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
   2663                                                 + 1][0];
   2664                 u4_scale_v *=
   2665                                 ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc
   2666                                                 + 2][0];
   2667 
   2668             }
   2669             else
   2670             {
   2671                 u4_scale_u <<= 4;
   2672                 u4_scale_v <<= 4;
   2673             }
   2674 
   2675             ih264d_cavlc_parse_chroma_dc(ps_cur_mb_info,pi2_coeff_block, ps_dec->ps_bitstrm,
   2676                                          u4_scale_u, u4_scale_v,
   2677                                          i4_mb_inter_inc);
   2678         }
   2679 
   2680         if(u1_cbp == CBPC_ACZERO)
   2681             return (0);
   2682 
   2683         pu1_top_nnz[0] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[0];
   2684         pu1_top_nnz[1] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[1];
   2685         pu1_top_nnz[2] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[2];
   2686         pu1_top_nnz[3] = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv[3];
   2687         /*--------------------------------------------------------------------*/
   2688         /* Decode Chroma AC values                                            */
   2689         /*--------------------------------------------------------------------*/
   2690         {
   2691             UWORD32 u4_temp;
   2692             /*****************************************************************/
   2693             /* U Block  residual decoding, check cbp and proceed (subblock=0)*/
   2694             /*****************************************************************/
   2695             ret = pf_cavlc_parse_8x8block[u4_nbr_avl](
   2696                         pi2_coeff_block, 2, 1, ps_dec, pu1_top_nnz,
   2697                         pu1_left_nnz, 0, 0, &u4_temp);
   2698             if(ret != OK)
   2699                 return ret;
   2700             u2_chroma_csbp = u4_temp;
   2701 
   2702             pi2_coeff_block += MB_CHROM_SIZE;
   2703             /*****************************************************************/
   2704             /* V Block  residual decoding, check cbp and proceed (subblock=1)*/
   2705             /*****************************************************************/
   2706             ret = pf_cavlc_parse_8x8block[u4_nbr_avl](pi2_coeff_block, 2, 1,
   2707                                                       ps_dec,
   2708                                                       (pu1_top_nnz + 2),
   2709                                                       (pu1_left_nnz + 2), 0,
   2710                                                       0, &u4_temp);
   2711             if(ret != OK)
   2712                 return ret;
   2713             u2_chroma_csbp |= (u4_temp << 4);
   2714         }
   2715 
   2716         ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp;
   2717     }
   2718     return OK;
   2719 }
   2720