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