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  **************************************************************************
     23  * \file ih264d_parse_pslice.c
     24  *
     25  * \brief
     26  *    Contains routines that decode a I slice type
     27  *
     28  * Detailed_description
     29  *
     30  * \date
     31  *    07/07/2003
     32  *
     33  * \author  NS
     34  **************************************************************************
     35  */
     36 
     37 #include <string.h>
     38 #include "ih264d_bitstrm.h"
     39 #include "ih264d_defs.h"
     40 #include "ih264d_debug.h"
     41 #include "ih264d_tables.h"
     42 #include "ih264d_structs.h"
     43 #include "ih264d_defs.h"
     44 #include "ih264d_parse_cavlc.h"
     45 #include "ih264d_mb_utils.h"
     46 #include "ih264d_parse_slice.h"
     47 #include "ih264d_mvpred.h"
     48 #include "ih264d_parse_islice.h"
     49 #include "ih264d_process_intra_mb.h"
     50 #include "ih264d_inter_pred.h"
     51 #include "ih264d_process_pslice.h"
     52 #include "ih264d_deblocking.h"
     53 #include "ih264d_cabac.h"
     54 #include "ih264d_parse_mb_header.h"
     55 #include "ih264d_error_handler.h"
     56 #include "ih264d_defs.h"
     57 #include "ih264d_format_conv.h"
     58 #include "ih264d_quant_scaling.h"
     59 #include "ih264d_thread_parse_decode.h"
     60 #include "ih264d_thread_compute_bs.h"
     61 #include "ih264d_process_bslice.h"
     62 #include "ithread.h"
     63 #include "ih264d_utils.h"
     64 #include "ih264d_format_conv.h"
     65 
     66 void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
     67 void ih264d_deblock_mb_level(dec_struct_t *ps_dec,
     68                              dec_mb_info_t *ps_cur_mb_info,
     69                              UWORD32 nmb_index);
     70 
     71 /*!
     72  **************************************************************************
     73  * \if Function name : ih264d_parse_pmb_cavlc \endif
     74  *
     75  * \brief
     76  *    This function parses CAVLC syntax of a P MB.
     77  *
     78  * \return
     79  *    0 on Success and Error code otherwise
     80  **************************************************************************
     81  */
     82 WORD32 ih264d_parse_pmb_cavlc(dec_struct_t * ps_dec,
     83                               dec_mb_info_t * ps_cur_mb_info,
     84                               UWORD8 u1_mb_num,
     85                               UWORD8 u1_num_mbsNby2)
     86 {
     87     UWORD32 u1_num_mb_part;
     88     UWORD32 uc_sub_mb;
     89     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
     90     UWORD32 * const pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
     91     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
     92 
     93     parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
     94                     + u1_num_mbsNby2;
     95     WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
     96     const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
     97     const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
     98     UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
     99 
    100     UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
    101     UWORD32 u4_sum_mb_mode_pack = 0;
    102     WORD32 ret;
    103 
    104     UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
    105     ps_cur_mb_info->u1_tran_form8x8 = 0;
    106     ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    107 
    108     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
    109 
    110     ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
    111     uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
    112 
    113     /* Reading the subMB type */
    114     if(uc_sub_mb)
    115     {
    116         WORD32 i;
    117         UWORD8 u1_colz = (PRED_8x8 << 6);
    118 
    119         for(i = 0; i < 4; i++)
    120         {
    121             UWORD32 ui_sub_mb_mode;
    122 
    123             //Inlined ih264d_uev
    124             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    125             UWORD32 u4_word, u4_ldz;
    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             /* Flush the ps_bitstrm */
    133             u4_bitstream_offset += (u4_ldz + 1);
    134             /* Read the suffix from the ps_bitstrm */
    135             u4_word = 0;
    136             if(u4_ldz)
    137                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    138                         u4_ldz);
    139             *pu4_bitstrm_ofst = u4_bitstream_offset;
    140             ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1);
    141             //Inlined ih264d_uev
    142 
    143             if(ui_sub_mb_mode > 3)
    144             {
    145                 return ERROR_SUB_MB_TYPE;
    146             }
    147             else
    148             {
    149                 u4_sum_mb_mode_pack = (u4_sum_mb_mode_pack << 8) | ui_sub_mb_mode;
    150                 /* Storing collocated information */
    151                 *pu1_col_info++ = u1_colz | (UWORD8)(ui_sub_mb_mode << 4);
    152 
    153                 COPYTHECONTEXT("sub_mb_type", ui_sub_mb_mode);
    154             }
    155 
    156             /* check if Motion compensation is done below 8x8 */
    157             if(ui_sub_mb_mode != P_L0_8x8)
    158             {
    159                 u1_no_submb_part_size_lt8x8_flag = 0;
    160             }
    161         }
    162 
    163         //
    164         u1_num_mb_part = 4;
    165     }
    166     else
    167     {
    168         *pu1_col_info++ = (u1_mb_type << 6);
    169         if(u1_mb_type)
    170             *pu1_col_info++ = (u1_mb_type << 6);
    171         u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
    172 
    173     }
    174 
    175     /* Decoding reference index 0: For simple profile the following   */
    176     /* conditions are always true (mb_field_decoding_flag == 0);      */
    177     /* (MbPartPredMode != PredL1)                                     */
    178 
    179     {
    180 
    181         UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
    182         UWORD8 uc_num_ref_idx_l0_active_minus1 =
    183                         (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
    184                                         << (u1_mbaff & uc_field)) - 1;
    185 
    186         if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
    187         {
    188             if(1 == uc_num_ref_idx_l0_active_minus1)
    189                 ih264d_parse_pmb_ref_index_cavlc_range1(
    190                                 u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
    191                                 uc_num_ref_idx_l0_active_minus1);
    192             else
    193             {
    194                 ret = ih264d_parse_pmb_ref_index_cavlc(
    195                                 u1_num_mb_part, ps_bitstrm, pi1_ref_idx,
    196                                 uc_num_ref_idx_l0_active_minus1);
    197                 if(ret != OK)
    198                     return ret;
    199             }
    200         }
    201         else
    202         {
    203             /* When there exists only a single frame to predict from */
    204             UWORD8 uc_i;
    205             for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++)
    206                 /* Storing Reference Idx Information */
    207                 pi1_ref_idx[uc_i] = 0;
    208         }
    209     }
    210 
    211     {
    212         UWORD8 u1_p_idx, uc_i;
    213         parse_part_params_t * ps_part = ps_dec->ps_part;
    214         UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
    215         UWORD8 u1_sub_mb_num;
    216         const UWORD8 * pu1_top_left_sub_mb_indx;
    217         mv_pred_t * ps_mv, *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
    218         /* Loading the table pointers */
    219         const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
    220         const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
    221         const UWORD8 * pu1_sub_mb_indx_mod =
    222                         (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
    223                                         + (uc_sub_mb * 6);
    224         const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
    225         const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
    226         const UWORD8 * pu1_num_sub_mb_part =
    227                         (const UWORD8 *)gau1_ih264d_num_submb_part;
    228 
    229         UWORD16 u2_sub_mb_num = 0x028A;
    230 
    231         /*********************************************************/
    232         /* default initialisations for condition (uc_sub_mb == 0) */
    233         /* i.e. all are subpartitions of 8x8                     */
    234         /*********************************************************/
    235         u1_sub_mb_mode = 0;
    236         u1_num_subpart = 1;
    237         u1_mb_part_width = pu1_mb_partw[u1_mb_type];
    238         u1_mb_part_height = pu1_mb_parth[u1_mb_type];
    239         pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
    240         u1_sub_mb_num = 0;
    241 
    242         /* Loop on number of partitions */
    243         for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
    244         {
    245             UWORD8 uc_j;
    246             if(uc_sub_mb)
    247             {
    248                 u1_sub_mb_mode = u4_sum_mb_mode_pack >> 24;
    249                 u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
    250                 u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
    251                 u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
    252                 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
    253                 u1_sub_mb_num = u2_sub_mb_num >> 12;
    254                 u4_sum_mb_mode_pack <<= 8;
    255                 u2_sub_mb_num <<= 4;
    256             }
    257 
    258             /* Loop on Number of sub-partitions */
    259             for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
    260             {
    261                 WORD16 i2_mvx, i2_mvy;
    262                 u1_sub_mb_num += *pu1_top_left_sub_mb_indx;
    263                 ps_mv = ps_mv_start + u1_sub_mb_num;
    264 
    265                 /* Reading the differential Mv from the bitstream */
    266                 //i2_mvx = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
    267                 //inlining ih264d_sev
    268                 {
    269                     UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    270                     UWORD32 u4_word, u4_ldz, u4_abs_val;
    271 
    272                     /***************************************************************/
    273                     /* Find leading zeros in next 32 bits                          */
    274                     /***************************************************************/
    275                     NEXTBITS_32(u4_word, u4_bitstream_offset,
    276                                 pu4_bitstrm_buf);
    277                     u4_ldz = CLZ(u4_word);
    278 
    279                     /* Flush the ps_bitstrm */
    280                     u4_bitstream_offset += (u4_ldz + 1);
    281 
    282                     /* Read the suffix from the ps_bitstrm */
    283                     u4_word = 0;
    284                     if(u4_ldz)
    285                         GETBITS(u4_word, u4_bitstream_offset,
    286                                 pu4_bitstrm_buf, u4_ldz);
    287 
    288                     *pu4_bitstrm_ofst = u4_bitstream_offset;
    289                     u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
    290 
    291                     if(u4_word & 0x1)
    292                         i2_mvx = (-(WORD32)u4_abs_val);
    293                     else
    294                         i2_mvx = (u4_abs_val);
    295                 }
    296                 //inlinined ih264d_sev
    297                 COPYTHECONTEXT("MVD", i2_mvx);
    298                 i2_mvy = ih264d_sev(pu4_bitstrm_ofst,
    299                                      pu4_bitstrm_buf);
    300                 COPYTHECONTEXT("MVD", i2_mvy);
    301 
    302                 /* Storing Info for partitions */
    303                 ps_part->u1_is_direct = PART_NOT_DIRECT;
    304                 ps_part->u1_sub_mb_num = u1_sub_mb_num;
    305                 ps_part->u1_partheight = u1_mb_part_height;
    306                 ps_part->u1_partwidth = u1_mb_part_width;
    307 
    308                 /* Storing Mv residuals */
    309                 ps_mv->i2_mv[0] = i2_mvx;
    310                 ps_mv->i2_mv[1] = i2_mvy;
    311 
    312                 /* Increment partition Index */
    313                 u1_p_idx++;
    314                 ps_part++;
    315             }
    316         }
    317         ps_parse_mb_data->u1_num_part = u1_p_idx;
    318         ps_dec->ps_part = ps_part;
    319     }
    320 
    321     {
    322         UWORD32 u4_cbp;
    323 
    324         /* Read the Coded block pattern */
    325         UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    326         UWORD32 u4_word, u4_ldz;
    327 
    328         /***************************************************************/
    329         /* Find leading zeros in next 32 bits                          */
    330         /***************************************************************/
    331         NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    332         u4_ldz = CLZ(u4_word);
    333         /* Flush the ps_bitstrm */
    334         u4_bitstream_offset += (u4_ldz + 1);
    335         /* Read the suffix from the ps_bitstrm */
    336         u4_word = 0;
    337         if(u4_ldz)
    338             GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz);
    339         *pu4_bitstrm_ofst = u4_bitstream_offset;
    340         u4_cbp = ((1 << u4_ldz) + u4_word - 1);
    341 
    342         if(u4_cbp > 47)
    343             return ERROR_CBP;
    344 
    345         u4_cbp = *((UWORD8*)gau1_ih264d_cbp_inter + u4_cbp);
    346         COPYTHECONTEXT("coded_block_pattern", u4_cbp);
    347         ps_cur_mb_info->u1_cbp = u4_cbp;
    348 
    349         /* Read the transform8x8 u4_flag if present */
    350         if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & 0xf)
    351                         && u1_no_submb_part_size_lt8x8_flag)
    352         {
    353             ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm);
    354             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
    355             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
    356         }
    357 
    358         /* Read mb_qp_delta */
    359         if(u4_cbp)
    360         {
    361             WORD32 i_temp;
    362 
    363             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
    364             UWORD32 u4_word, u4_ldz, u4_abs_val;
    365 
    366             /***************************************************************/
    367             /* Find leading zeros in next 32 bits                          */
    368             /***************************************************************/
    369             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
    370             u4_ldz = CLZ(u4_word);
    371 
    372             /* Flush the ps_bitstrm */
    373             u4_bitstream_offset += (u4_ldz + 1);
    374 
    375             /* Read the suffix from the ps_bitstrm */
    376             u4_word = 0;
    377             if(u4_ldz)
    378                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
    379                         u4_ldz);
    380 
    381             *pu4_bitstrm_ofst = u4_bitstream_offset;
    382             u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1;
    383 
    384             if(u4_word & 0x1)
    385                 i_temp = (-(WORD32)u4_abs_val);
    386             else
    387                 i_temp = (u4_abs_val);
    388 
    389             if((i_temp < -26) || (i_temp > 25))
    390                 return ERROR_INV_RANGE_QP_T;
    391             //inlinined ih264d_sev
    392 
    393             COPYTHECONTEXT("mb_qp_delta", i_temp);
    394             if(i_temp)
    395             {
    396                 ret = ih264d_update_qp(ps_dec, (WORD8)i_temp);
    397                 if(ret != OK)
    398                     return ret;
    399             }
    400 
    401             ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0);
    402             if(ret != OK)
    403                 return ret;
    404             if(EXCEED_OFFSET(ps_bitstrm))
    405                 return ERROR_EOB_TERMINATE_T;
    406         }
    407         else
    408         {
    409             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
    410         }
    411 
    412 
    413 
    414     }
    415 
    416     return OK;
    417 }
    418 
    419 /*!
    420  **************************************************************************
    421  * \if Function name : ih264d_parse_pmb_cabac \endif
    422  *
    423  * \brief
    424  *    This function parses CABAC syntax of a P MB.
    425  *
    426  * \return
    427  *    0 on Success and Error code otherwise
    428  **************************************************************************
    429  */
    430 WORD32 ih264d_parse_pmb_cabac(dec_struct_t * ps_dec,
    431                               dec_mb_info_t * ps_cur_mb_info,
    432                               UWORD8 u1_mb_num,
    433                               UWORD8 u1_num_mbsNby2)
    434 {
    435     UWORD32 u1_num_mb_part;
    436     UWORD32 uc_sub_mb;
    437     parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data
    438                     + u1_num_mbsNby2;
    439     WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0];
    440     const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part;
    441     const UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type;
    442     UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info;
    443     UWORD32 u1_mb_mc_mode = u1_mb_type;
    444     ctxt_inc_mb_info_t * p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info;
    445     decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env;
    446     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
    447     UWORD32 u4_sub_mb_pack = 0;
    448     WORD32 ret;
    449 
    450     UWORD8 u1_no_submb_part_size_lt8x8_flag = 1;
    451     ps_cur_mb_info->u1_tran_form8x8 = 0;
    452     ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    453 
    454     ps_cur_mb_info->u1_yuv_dc_block_flag = 0;
    455 
    456     p_curr_ctxt->u1_mb_type = CAB_P;
    457     ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type;
    458     uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0));
    459 
    460     /* Reading the subMB type */
    461     if(uc_sub_mb)
    462     {
    463 
    464         UWORD8 u1_colz = (PRED_8x8 << 6);
    465         u1_mb_mc_mode = 0;
    466 
    467         {
    468             UWORD8 u1_sub_mb_mode;
    469             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
    470                             0, ps_cab_env, ps_bitstrm,
    471                             ps_dec->p_sub_mb_type_t);
    472             if(u1_sub_mb_mode > 3)
    473                 return ERROR_SUB_MB_TYPE;
    474 
    475             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
    476             /* Storing collocated information */
    477             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
    478             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
    479             /* check if Motion compensation is done below 8x8 */
    480             if(u1_sub_mb_mode != P_L0_8x8)
    481             {
    482                 u1_no_submb_part_size_lt8x8_flag = 0;
    483             }
    484         }
    485         {
    486             UWORD8 u1_sub_mb_mode;
    487             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
    488                             0, ps_cab_env, ps_bitstrm,
    489                             ps_dec->p_sub_mb_type_t);
    490             if(u1_sub_mb_mode > 3)
    491                 return ERROR_SUB_MB_TYPE;
    492 
    493             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
    494             /* Storing collocated information */
    495             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
    496             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
    497             /* check if Motion compensation is done below 8x8 */
    498             if(u1_sub_mb_mode != P_L0_8x8)
    499             {
    500                 u1_no_submb_part_size_lt8x8_flag = 0;
    501             }
    502         }
    503         {
    504             UWORD8 u1_sub_mb_mode;
    505             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
    506                             0, ps_cab_env, ps_bitstrm,
    507                             ps_dec->p_sub_mb_type_t);
    508             if(u1_sub_mb_mode > 3)
    509                 return ERROR_SUB_MB_TYPE;
    510 
    511             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
    512             /* Storing collocated information */
    513             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
    514             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
    515             /* check if Motion compensation is done below 8x8 */
    516             if(u1_sub_mb_mode != P_L0_8x8)
    517             {
    518                 u1_no_submb_part_size_lt8x8_flag = 0;
    519             }
    520         }
    521         {
    522             UWORD8 u1_sub_mb_mode;
    523             u1_sub_mb_mode = ih264d_parse_submb_type_cabac(
    524                             0, ps_cab_env, ps_bitstrm,
    525                             ps_dec->p_sub_mb_type_t);
    526             if(u1_sub_mb_mode > 3)
    527                 return ERROR_SUB_MB_TYPE;
    528 
    529             u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode;
    530             /* Storing collocated information */
    531             *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4));
    532             COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode);
    533             /* check if Motion compensation is done below 8x8 */
    534             if(u1_sub_mb_mode != P_L0_8x8)
    535             {
    536                 u1_no_submb_part_size_lt8x8_flag = 0;
    537             }
    538         }
    539         u1_num_mb_part = 4;
    540     }
    541     else
    542     {
    543         u1_num_mb_part = pu1_num_mb_part[u1_mb_type];
    544         /* Storing collocated Mb and SubMb mode information */
    545         *pu1_col_info++ = (u1_mb_type << 6);
    546         if(u1_mb_type)
    547             *pu1_col_info++ = (u1_mb_type << 6);
    548     }
    549     /* Decoding reference index 0: For simple profile the following   */
    550     /* conditions are always true (mb_field_decoding_flag == 0);      */
    551     /* (MbPartPredMode != PredL1)                                     */
    552     {
    553         WORD8 * pi1_top_ref_idx_ctx_inc_arr = p_curr_ctxt->i1_ref_idx;
    554         WORD8 * pi1_left_ref_idx_ctxt_inc = ps_dec->pi1_left_ref_idx_ctxt_inc;
    555         UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
    556         UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag;
    557         UWORD8 uc_num_ref_idx_l0_active_minus1 =
    558                         (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
    559                                         << (u1_mbaff & uc_field)) - 1;
    560 
    561         if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0))
    562         {
    563             /* force the routine to decode ref idx for each partition */
    564             *((UWORD32 *)pi1_ref_idx) = 0x01010101;
    565             ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0,
    566                                              uc_num_ref_idx_l0_active_minus1,
    567                                              u1_mb_mc_mode, pi1_ref_idx,
    568                                              pi1_left_ref_idx_ctxt_inc,
    569                                              pi1_top_ref_idx_ctx_inc_arr, ps_cab_env,
    570                                              ps_bitstrm, ps_dec->p_ref_idx_t);
    571             if(ret != OK)
    572                 return ret;
    573         }
    574         else
    575         {
    576             /* When there exists only a single frame to predict from */
    577             pi1_left_ref_idx_ctxt_inc[0] = 0;
    578             pi1_left_ref_idx_ctxt_inc[1] = 0;
    579             pi1_top_ref_idx_ctx_inc_arr[0] = 0;
    580             pi1_top_ref_idx_ctx_inc_arr[1] = 0;
    581             *((UWORD32 *)pi1_ref_idx) = 0;
    582         }
    583     }
    584 
    585     {
    586         UWORD8 u1_p_idx, uc_i;
    587         parse_part_params_t * ps_part = ps_dec->ps_part;
    588         UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height;
    589         UWORD8 u1_sub_mb_num;
    590         const UWORD8 * pu1_top_left_sub_mb_indx;
    591         mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
    592         UWORD16 u2_sub_mb_num_pack = 0x028A;
    593 
    594         /* Loading the table pointers */
    595         const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
    596         const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
    597         const UWORD8 * pu1_sub_mb_indx_mod =
    598                         (const UWORD8 *)(gau1_ih264d_submb_indx_mod)
    599                                         + (uc_sub_mb * 6);
    600         const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw;
    601         const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth;
    602         const UWORD8 * pu1_num_sub_mb_part =
    603                         (const UWORD8 *)gau1_ih264d_num_submb_part;
    604 
    605         /*********************************************************/
    606         /* default initialisations for condition (uc_sub_mb == 0) */
    607         /* i.e. all are subpartitions of 8x8                     */
    608         /*********************************************************/
    609         u1_sub_mb_mode = 0;
    610         u1_num_subpart = 1;
    611         u1_mb_part_width = pu1_mb_partw[u1_mb_type];
    612         u1_mb_part_height = pu1_mb_parth[u1_mb_type];
    613         pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1);
    614         u1_sub_mb_num = 0;
    615 
    616         /* Loop on number of partitions */
    617         for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++)
    618         {
    619             UWORD8 uc_j;
    620             if(uc_sub_mb)
    621             {
    622                 u1_sub_mb_mode = u4_sub_mb_pack >> 24;
    623                 u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode];
    624                 u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode];
    625                 u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode];
    626                 pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1);
    627                 u1_sub_mb_num = u2_sub_mb_num_pack >> 12;
    628                 u4_sub_mb_pack <<= 8;
    629                 u2_sub_mb_num_pack <<= 4;
    630             }
    631             /* Loop on Number of sub-partitions */
    632             for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++)
    633             {
    634                 mv_pred_t * ps_mv;
    635 
    636                 u1_sub_mb_num += *pu1_top_left_sub_mb_indx;
    637                 ps_mv = ps_mv_start + u1_sub_mb_num;
    638 
    639                 /* Storing Info for partitions */
    640                 ps_part->u1_is_direct = PART_NOT_DIRECT;
    641                 ps_part->u1_sub_mb_num = u1_sub_mb_num;
    642                 ps_part->u1_partheight = u1_mb_part_height;
    643                 ps_part->u1_partwidth = u1_mb_part_width;
    644 
    645                 /* Increment partition Index */
    646                 u1_p_idx++;
    647                 ps_part++;
    648 
    649                 ih264d_get_mvd_cabac(u1_sub_mb_num, 0, u1_mb_part_width,
    650                                      u1_mb_part_height, 1, ps_dec, ps_mv);
    651             }
    652         }
    653         ps_parse_mb_data->u1_num_part = u1_p_idx;
    654         ps_dec->ps_part = ps_part;
    655     }
    656     {
    657         UWORD8 u1_cbp;
    658 
    659         /* Read the Coded block pattern */
    660         u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec);
    661         COPYTHECONTEXT("coded_block_pattern", u1_cbp);
    662         ps_cur_mb_info->u1_cbp = u1_cbp;
    663         p_curr_ctxt->u1_cbp = u1_cbp;
    664         p_curr_ctxt->u1_intra_chroma_pred_mode = 0;
    665         p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE;
    666         ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6;
    667 
    668         if(u1_cbp > 47)
    669             return ERROR_CBP;
    670 
    671         ps_cur_mb_info->u1_tran_form8x8 = 0;
    672         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    673 
    674         /* Read the transform8x8 u4_flag if present */
    675         if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & 0xf)
    676                         && u1_no_submb_part_size_lt8x8_flag)
    677         {
    678             ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac(
    679                             ps_dec, ps_cur_mb_info);
    680             COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8);
    681             p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8;
    682             ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8;
    683 
    684         }
    685         else
    686         {
    687             p_curr_ctxt->u1_transform8x8_ctxt = 0;
    688         }
    689 
    690         /* Read mb_qp_delta */
    691         if(u1_cbp)
    692         {
    693             WORD8 c_temp;
    694             ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp);
    695             if(ret != OK)
    696                 return ret;
    697             COPYTHECONTEXT("mb_qp_delta", c_temp);
    698             if(c_temp != 0)
    699             {
    700                 ret = ih264d_update_qp(ps_dec, c_temp);
    701                 if(ret != OK)
    702                     return ret;
    703             }
    704         }
    705         else
    706             ps_dec->i1_prev_mb_qp_delta = 0;
    707 
    708 
    709 
    710         ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0);
    711         if(EXCEED_OFFSET(ps_dec->ps_bitstrm))
    712             return ERROR_EOB_TERMINATE_T;
    713     }
    714     return OK;
    715 }
    716 
    717 /*!
    718  **************************************************************************
    719  * \if Function name : parsePSliceData \endif
    720  *
    721  * \brief
    722  *    This function parses CAVLC syntax of N MB's of a P slice.
    723  *    1. After parsing syntax of N MB's, for those N MB's (less than N, incase
    724  *       of end of slice or end of row), MB is decoded. This process is carried
    725  *       for one complete MB row or till end of slice.
    726  *    2. Bottom one row of current MB is copied to IntraPredLine buffers.
    727  *       IntraPredLine buffers are used for Intra prediction of next row.
    728  *    3. Current MB row along with previous 4 rows of Luma (and 2 of Chroma) are
    729  *       deblocked.
    730  *    4. 4 rows (2 for Chroma) previous row and 12 rows (6 for Chroma) are
    731  *       DMA'ed to picture buffers.
    732  *
    733  * \return
    734  *    0 on Success and Error code otherwise
    735  **************************************************************************
    736  */
    737 
    738 /*!
    739  **************************************************************************
    740  * \if Function name : ih264d_update_nnz_for_skipmb \endif
    741  *
    742  * \brief
    743  *
    744  * \return
    745  *    None
    746  *
    747  **************************************************************************
    748  */
    749 void ih264d_update_nnz_for_skipmb(dec_struct_t * ps_dec,
    750                                   dec_mb_info_t * ps_cur_mb_info,
    751                                   UWORD8 u1_entrpy)
    752 {
    753     UWORD32 *pu4_buf;
    754     UWORD8 *pu1_buf;
    755     UNUSED(u1_entrpy);
    756     pu1_buf = ps_dec->pu1_left_nnz_y;
    757     pu4_buf = (UWORD32 *)pu1_buf;
    758     *pu4_buf = 0;
    759     pu1_buf = ps_dec->pu1_left_nnz_uv;
    760     pu4_buf = (UWORD32 *)pu1_buf;
    761     *pu4_buf = 0;
    762     pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y;
    763     pu4_buf = (UWORD32 *)pu1_buf;
    764     *pu4_buf = 0;
    765     pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv;
    766     pu4_buf = (UWORD32 *)pu1_buf;
    767     *pu4_buf = 0;
    768     ps_cur_mb_info->ps_curmb->u2_luma_csbp = 0;
    769     ps_cur_mb_info->u2_luma_csbp = 0;
    770     ps_cur_mb_info->u2_chroma_csbp = 0;
    771 }
    772 
    773 
    774 
    775 /*****************************************************************************/
    776 /*                                                                           */
    777 /*  Function Name : ih264d_parse_inter_slice_data_cabac                             */
    778 /*                                                                           */
    779 /*  Description   : This function parses cabac syntax of a inter slice on    */
    780 /*                  N MB basis.                                              */
    781 /*                                                                           */
    782 /*  Inputs        : ps_dec                                                   */
    783 /*                  sliceparams                                              */
    784 /*                  firstMbInSlice                                           */
    785 /*                                                                           */
    786 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
    787 /*                     decoded till the end of slice.                        */
    788 /*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
    789 /*                                                                           */
    790 /*  Returns       : 0                                                        */
    791 /*                                                                           */
    792 /*  Issues        : <List any issues or problems with this function>         */
    793 /*                                                                           */
    794 /*  Revision History:                                                        */
    795 /*                                                                           */
    796 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
    797 /*         13 07 2002   Jay             Draft                                */
    798 /*                                                                           */
    799 /*****************************************************************************/
    800 WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec,
    801                                            dec_slice_params_t * ps_slice,
    802                                            UWORD16 u2_first_mb_in_slice)
    803 {
    804     UWORD32 uc_more_data_flag;
    805     WORD32 i2_cur_mb_addr;
    806     UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
    807     UWORD32 u1_mbaff;
    808     UWORD32 u1_num_mbs_next, u1_end_of_row;
    809     const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
    810     UWORD32 u1_slice_end = 0;
    811     UWORD32 u1_tfr_n_mb = 0;
    812     UWORD32 u1_decode_nmb = 0;
    813 
    814 
    815     deblk_mb_t *ps_cur_deblk_mb;
    816     dec_mb_info_t *ps_cur_mb_info;
    817 
    818     parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
    819     UWORD32 u1_inter_mb_skip_type;
    820     UWORD32 u1_inter_mb_type;
    821     UWORD32 u1_deblk_mb_type;
    822     UWORD32 u1_mb_threshold;
    823     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
    824     WORD32 ret = OK;
    825 
    826     /******************************************************/
    827     /* Initialisations specific to B or P slice           */
    828     /******************************************************/
    829     if(ps_slice->u1_slice_type == P_SLICE)
    830     {
    831         u1_inter_mb_skip_type = CAB_P_SKIP;
    832         u1_inter_mb_type = P_MB;
    833         u1_deblk_mb_type = D_INTER_MB;
    834         u1_mb_threshold = 5;
    835     }
    836     else // B_SLICE
    837     {
    838         u1_inter_mb_skip_type = CAB_B_SKIP;
    839         u1_inter_mb_type = B_MB;
    840         u1_deblk_mb_type = D_B_SLICE;
    841         u1_mb_threshold = 23;
    842     }
    843 
    844     /******************************************************/
    845     /* Slice Level Initialisations                        */
    846     /******************************************************/
    847     i2_cur_mb_addr = u2_first_mb_in_slice;
    848     ps_dec->u1_qp = ps_slice->u1_slice_qp;
    849     ih264d_update_qp(ps_dec, 0);
    850     u1_mb_idx = ps_dec->u1_mb_idx;
    851     u1_num_mbs = u1_mb_idx;
    852     u1_num_mbsNby2 = 0;
    853     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
    854     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
    855     uc_more_data_flag = 1;
    856 
    857     /* Initialisations specific to cabac */
    858     if(ps_bitstrm->u4_ofst & 0x07)
    859     {
    860         ps_bitstrm->u4_ofst += 8;
    861         ps_bitstrm->u4_ofst &= 0xFFFFFFF8;
    862     }
    863 
    864     ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm);
    865     if(ret != OK)
    866         return ret;
    867 
    868     ps_dec->i1_prev_mb_qp_delta = 0;
    869 
    870     while(!u1_slice_end)
    871     {
    872         UWORD8 u1_mb_type;
    873         UWORD32 u4_mb_skip;
    874 
    875         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
    876 
    877         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
    878         {
    879             break;
    880         }
    881 
    882         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
    883         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
    884 
    885         ps_cur_mb_info->u1_Mux = 0;
    886         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
    887         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
    888 
    889         ps_cur_mb_info->u1_end_of_slice = 0;
    890 
    891         /* Storing Default partition info */
    892         ps_parse_mb_data->u1_num_part = 1;
    893         ps_parse_mb_data->u1_isI_mb = 0;
    894 
    895         /***************************************************************/
    896         /* Get the required information for decoding of MB             */
    897         /* mb_x, mb_y , neighbour availablity,                         */
    898         /***************************************************************/
    899         u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1);
    900 
    901         /*********************************************************************/
    902         /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
    903         /*********************************************************************/
    904         ps_cur_mb_info->u1_tran_form8x8 = 0;
    905         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    906 
    907         /***************************************************************/
    908         /* Set the deblocking parameters for this MB                   */
    909         /***************************************************************/
    910         if(ps_dec->u4_app_disable_deblk_frm == 0)
    911             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
    912                                              ps_dec->u1_mb_ngbr_availablity,
    913                                              ps_dec->u1_cur_mb_fld_dec_flag);
    914 
    915         if(u4_mb_skip)
    916         {
    917 
    918             /* Set appropriate flags in ps_cur_mb_info and ps_dec */
    919             memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
    920             ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
    921 
    922             MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
    923 
    924             *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
    925             *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
    926 
    927             ps_dec->i1_prev_mb_qp_delta = 0;
    928             ps_cur_mb_info->u1_mb_type = MB_SKIP;
    929             ps_cur_mb_info->u1_cbp = 0;
    930 
    931             {
    932                 /* Storing Skip partition info */
    933                 parse_part_params_t *ps_part_info = ps_dec->ps_part;
    934                 ps_part_info->u1_is_direct = PART_DIRECT_16x16;
    935                 ps_part_info->u1_sub_mb_num = 0;
    936                 ps_dec->ps_part++;
    937             }
    938 
    939             /* Update Nnzs */
    940             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
    941 
    942             ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
    943             ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
    944             ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
    945 
    946         }
    947         else
    948         {
    949 
    950             /* Macroblock Layer Begins */
    951             /* Decode the u1_mb_type */
    952             u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
    953             ps_cur_mb_info->u1_mb_type = u1_mb_type;
    954             if(u1_mb_type > (25 + u1_mb_threshold))
    955                 return ERROR_MB_TYPE;
    956 
    957             /* Parse Macroblock Data */
    958             if(u1_mb_type < u1_mb_threshold)
    959             {
    960                 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
    961                 *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
    962 
    963                 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
    964                                           u1_num_mbsNby2);
    965                 if(ret != OK)
    966                     return ret;
    967                 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
    968                 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
    969             }
    970             else
    971             {
    972                 /* Storing Intra partition info */
    973                 ps_parse_mb_data->u1_num_part = 0;
    974                 ps_parse_mb_data->u1_isI_mb = 1;
    975 
    976                 if((25 + u1_mb_threshold) == u1_mb_type)
    977                 {
    978                     /* I_PCM_MB */
    979                     ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
    980                     ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
    981                     if(ret != OK)
    982                         return ret;
    983                     ps_cur_deblk_mb->u1_mb_qp = 0;
    984                 }
    985                 else
    986                 {
    987                     if(u1_mb_type == u1_mb_threshold)
    988                         ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
    989                     else
    990                         ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
    991 
    992                     ret = ih264d_parse_imb_cabac(
    993                                     ps_dec, ps_cur_mb_info,
    994                                     (UWORD8)(u1_mb_type - u1_mb_threshold));
    995                     if(ret != OK)
    996                         return ret;
    997                     ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
    998                 }
    999                 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
   1000 
   1001             }
   1002 
   1003         }
   1004 
   1005         if(u1_mbaff)
   1006         {
   1007             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1008         }
   1009         /* Next macroblock information */
   1010         i2_cur_mb_addr++;
   1011 
   1012         if(ps_cur_mb_info->u1_topmb && u1_mbaff)
   1013             uc_more_data_flag = 1;
   1014         else
   1015         {
   1016             uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env,
   1017                                                       ps_bitstrm);
   1018             uc_more_data_flag = !uc_more_data_flag;
   1019             COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag);
   1020         }
   1021 
   1022         u1_num_mbs++;
   1023         u1_num_mbsNby2++;
   1024         ps_parse_mb_data++;
   1025 
   1026         /****************************************************************/
   1027         /* Check for End Of Row and other flags that determine when to  */
   1028         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
   1029         /* N-Mb                                                         */
   1030         /****************************************************************/
   1031         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1032         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1033         u1_slice_end = !uc_more_data_flag;
   1034         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1035                         || u1_slice_end;
   1036         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
   1037         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1038         /*u1_dma_nby2mb   = u1_decode_nmb ||
   1039          (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
   1040 
   1041 //if(u1_dma_nby2mb)
   1042         if(u1_decode_nmb)
   1043         {
   1044 
   1045             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
   1046             u1_num_mbsNby2 = 0;
   1047 
   1048             {
   1049                 ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1050                 ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1051             }
   1052         }
   1053 
   1054         /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
   1055          ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
   1056          ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
   1057          H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d, u1_num_mbs: %d", u1_decode_nmb, u1_num_mbs);*/
   1058         if(u1_decode_nmb)
   1059         {
   1060 
   1061             if(ps_dec->u1_separate_parse)
   1062             {
   1063                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1064                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1065                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1066             }
   1067             else
   1068             {
   1069                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1070                                             u1_num_mbs_next, u1_tfr_n_mb,
   1071                                             u1_end_of_row);
   1072             }
   1073             ps_dec->u2_total_mbs_coded += u1_num_mbs;
   1074             if(u1_tfr_n_mb)
   1075                 u1_num_mbs = 0;
   1076             u1_mb_idx = u1_num_mbs;
   1077             ps_dec->u1_mb_idx = u1_num_mbs;
   1078 
   1079         }
   1080     }
   1081 
   1082 
   1083     ps_dec->u4_num_mbs_cur_nmb = 0;
   1084     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1085 
   1086                         - (u2_first_mb_in_slice << u1_mbaff);
   1087 
   1088     return ret;
   1089 }
   1090 
   1091 /*****************************************************************************/
   1092 /*                                                                           */
   1093 /*  Function Name : ih264d_parse_inter_slice_data_cavlc                             */
   1094 /*                                                                           */
   1095 /*  Description   : This function parses cavlc syntax of a inter slice on    */
   1096 /*                  N MB basis.                                              */
   1097 /*                                                                           */
   1098 /*  Inputs        : ps_dec                                                   */
   1099 /*                  sliceparams                                              */
   1100 /*                  firstMbInSlice                                           */
   1101 /*                                                                           */
   1102 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
   1103 /*                     decoded till the end of slice.                        */
   1104 /*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
   1105 /*                                                                           */
   1106 /*  Returns       : 0                                                        */
   1107 /*                                                                           */
   1108 /*  Issues        : <List any issues or problems with this function>         */
   1109 /*                                                                           */
   1110 /*  Revision History:                                                        */
   1111 /*                                                                           */
   1112 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1113 /*         13 07 2002   Jay             Draft                                */
   1114 /*                                                                           */
   1115 /*****************************************************************************/
   1116 
   1117 WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec,
   1118                                            dec_slice_params_t * ps_slice,
   1119                                            UWORD16 u2_first_mb_in_slice)
   1120 {
   1121     UWORD32 uc_more_data_flag;
   1122     WORD32 i2_cur_mb_addr;
   1123     UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
   1124     UWORD32 i2_mb_skip_run;
   1125     UWORD32 u1_read_mb_type;
   1126 
   1127     UWORD32 u1_mbaff;
   1128     UWORD32 u1_num_mbs_next, u1_end_of_row;
   1129     const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
   1130     UWORD32 u1_slice_end = 0;
   1131     UWORD32 u1_tfr_n_mb = 0;
   1132     UWORD32 u1_decode_nmb = 0;
   1133 
   1134     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
   1135     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1136     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1137     deblk_mb_t *ps_cur_deblk_mb;
   1138     dec_mb_info_t *ps_cur_mb_info;
   1139     parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1140     UWORD32 u1_inter_mb_type;
   1141     UWORD32 u1_deblk_mb_type;
   1142     UWORD32 u1_mb_threshold;
   1143     WORD32 ret = OK;
   1144 
   1145     /******************************************************/
   1146     /* Initialisations specific to B or P slice           */
   1147     /******************************************************/
   1148 
   1149     if(ps_slice->u1_slice_type == P_SLICE)
   1150     {
   1151         u1_inter_mb_type = P_MB;
   1152         u1_deblk_mb_type = D_INTER_MB;
   1153         u1_mb_threshold = 5;
   1154     }
   1155     else // B_SLICE
   1156     {
   1157         u1_inter_mb_type = B_MB;
   1158         u1_deblk_mb_type = D_B_SLICE;
   1159         u1_mb_threshold = 23;
   1160     }
   1161     /******************************************************/
   1162     /* Slice Level Initialisations                        */
   1163     /******************************************************/
   1164     ps_dec->u1_qp = ps_slice->u1_slice_qp;
   1165     ih264d_update_qp(ps_dec, 0);
   1166     u1_mb_idx = ps_dec->u1_mb_idx;
   1167     u1_num_mbs = u1_mb_idx;
   1168 
   1169     u1_num_mbsNby2 = 0;
   1170     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
   1171     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
   1172     i2_mb_skip_run = 0;
   1173     uc_more_data_flag = 1;
   1174     u1_read_mb_type = 0;
   1175 
   1176     while(!u1_slice_end)
   1177     {
   1178         UWORD8 u1_mb_type;
   1179 
   1180         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
   1181 
   1182         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
   1183         {
   1184             break;
   1185         }
   1186 
   1187 
   1188         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
   1189         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
   1190 
   1191         ps_cur_mb_info->u1_Mux = 0;
   1192         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
   1193         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
   1194 
   1195         ps_cur_mb_info->u1_end_of_slice = 0;
   1196 
   1197         /* Storing Default partition info */
   1198         ps_parse_mb_data->u1_num_part = 1;
   1199         ps_parse_mb_data->u1_isI_mb = 0;
   1200 
   1201         if((!i2_mb_skip_run) && (!u1_read_mb_type))
   1202         {
   1203 
   1204             //Inlined ih264d_uev
   1205             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
   1206             UWORD32 u4_word, u4_ldz;
   1207 
   1208             /***************************************************************/
   1209             /* Find leading zeros in next 32 bits                          */
   1210             /***************************************************************/
   1211             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
   1212 
   1213             u4_ldz = CLZ(u4_word);
   1214 
   1215             /* Flush the ps_bitstrm */
   1216             u4_bitstream_offset += (u4_ldz + 1);
   1217             /* Read the suffix from the ps_bitstrm */
   1218             u4_word = 0;
   1219             if(u4_ldz)
   1220             {
   1221                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
   1222                         u4_ldz);
   1223             }
   1224             *pu4_bitstrm_ofst = u4_bitstream_offset;
   1225             i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
   1226             //Inlined ih264d_uev
   1227             COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
   1228             uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
   1229             u1_read_mb_type = uc_more_data_flag;
   1230         }
   1231 
   1232         /***************************************************************/
   1233         /* Get the required information for decoding of MB                  */
   1234         /* mb_x, mb_y , neighbour availablity,                              */
   1235         /***************************************************************/
   1236         ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1237 
   1238         /***************************************************************/
   1239         /* Set the deblocking parameters for this MB                   */
   1240         /***************************************************************/
   1241         if(ps_dec->u4_app_disable_deblk_frm == 0)
   1242             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
   1243                                              ps_dec->u1_mb_ngbr_availablity,
   1244                                              ps_dec->u1_cur_mb_fld_dec_flag);
   1245 
   1246         if(i2_mb_skip_run)
   1247         {
   1248             /* Set appropriate flags in ps_cur_mb_info and ps_dec */
   1249             ps_dec->i1_prev_mb_qp_delta = 0;
   1250             ps_dec->u1_sub_mb_num = 0;
   1251             ps_cur_mb_info->u1_mb_type = MB_SKIP;
   1252             ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
   1253             ps_cur_mb_info->u1_cbp = 0;
   1254 
   1255             {
   1256                 /* Storing Skip partition info */
   1257                 parse_part_params_t *ps_part_info = ps_dec->ps_part;
   1258                 ps_part_info->u1_is_direct = PART_DIRECT_16x16;
   1259                 ps_part_info->u1_sub_mb_num = 0;
   1260                 ps_dec->ps_part++;
   1261             }
   1262 
   1263             /* Update Nnzs */
   1264             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
   1265 
   1266             ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
   1267             ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
   1268 
   1269             i2_mb_skip_run--;
   1270         }
   1271         else
   1272         {
   1273             u1_read_mb_type = 0;
   1274             /**************************************************************/
   1275             /* Macroblock Layer Begins, Decode the u1_mb_type                */
   1276             /**************************************************************/
   1277             {
   1278                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
   1279                 UWORD32 u4_word, u4_ldz, u4_temp;
   1280 
   1281 
   1282                 //Inlined ih264d_uev
   1283                 /***************************************************************/
   1284                 /* Find leading zeros in next 32 bits                          */
   1285                 /***************************************************************/
   1286                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
   1287                 u4_ldz = CLZ(u4_word);
   1288                 /* Flush the ps_bitstrm */
   1289                 u4_bitstream_offset += (u4_ldz + 1);
   1290                 /* Read the suffix from the ps_bitstrm */
   1291                 u4_word = 0;
   1292                 if(u4_ldz)
   1293                     GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
   1294                             u4_ldz);
   1295                 *pu4_bitstrm_ofst = u4_bitstream_offset;
   1296                 u4_temp = ((1 << u4_ldz) + u4_word - 1);
   1297                 //Inlined ih264d_uev
   1298                 if(u4_temp > (UWORD32)(25 + u1_mb_threshold))
   1299                     return ERROR_MB_TYPE;
   1300                 u1_mb_type = u4_temp;
   1301                 COPYTHECONTEXT("u1_mb_type", u1_mb_type);
   1302             }
   1303             ps_cur_mb_info->u1_mb_type = u1_mb_type;
   1304 
   1305             /**************************************************************/
   1306             /* Parse Macroblock data                                      */
   1307             /**************************************************************/
   1308             if(u1_mb_type < u1_mb_threshold)
   1309             {
   1310                 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
   1311 
   1312                 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
   1313                                           u1_num_mbsNby2);
   1314                 if(ret != OK)
   1315                     return ret;
   1316                 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
   1317             }
   1318             else
   1319             {
   1320                 /* Storing Intra partition info */
   1321                 ps_parse_mb_data->u1_num_part = 0;
   1322                 ps_parse_mb_data->u1_isI_mb = 1;
   1323 
   1324                 if((25 + u1_mb_threshold) == u1_mb_type)
   1325                 {
   1326                     /* I_PCM_MB */
   1327                     ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
   1328                     ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
   1329                     if(ret != OK)
   1330                          return ret;
   1331                     ps_dec->u1_qp = 0;
   1332                 }
   1333                 else
   1334                 {
   1335                     ret = ih264d_parse_imb_cavlc(
   1336                                     ps_dec, ps_cur_mb_info, u1_num_mbs,
   1337                                     (UWORD8)(u1_mb_type - u1_mb_threshold));
   1338                     if(ret != OK)
   1339                         return ret;
   1340                 }
   1341 
   1342                 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
   1343             }
   1344             uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
   1345         }
   1346         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
   1347 
   1348         if(u1_mbaff)
   1349         {
   1350             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1351         }
   1352         /**************************************************************/
   1353         /* Get next Macroblock address                                */
   1354         /**************************************************************/
   1355         i2_cur_mb_addr++;
   1356 
   1357         u1_num_mbs++;
   1358         u1_num_mbsNby2++;
   1359         ps_parse_mb_data++;
   1360 
   1361         /****************************************************************/
   1362         /* Check for End Of Row and other flags that determine when to  */
   1363         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
   1364         /* N-Mb                                                         */
   1365         /****************************************************************/
   1366         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1367         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1368         u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
   1369         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1370                         || u1_slice_end;
   1371         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
   1372         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1373 
   1374         /*u1_dma_nby2mb   = u1_decode_nmb ||
   1375          (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
   1376 
   1377 //if(u1_dma_nby2mb)
   1378         if(u1_decode_nmb)
   1379         {
   1380             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
   1381             u1_num_mbsNby2 = 0;
   1382 
   1383             {
   1384                 ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1385                 ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1386             }
   1387         }
   1388 
   1389         /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
   1390          ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
   1391          ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
   1392          H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d", u1_decode_nmb);*/
   1393         if(u1_decode_nmb)
   1394         {
   1395 
   1396 
   1397 
   1398             if(ps_dec->u1_separate_parse)
   1399             {
   1400                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1401                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1402                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1403             }
   1404             else
   1405             {
   1406                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1407                                             u1_num_mbs_next, u1_tfr_n_mb,
   1408                                             u1_end_of_row);
   1409             }
   1410             ps_dec->u2_total_mbs_coded += u1_num_mbs;
   1411             if(u1_tfr_n_mb)
   1412                 u1_num_mbs = 0;
   1413             u1_mb_idx = u1_num_mbs;
   1414             ps_dec->u1_mb_idx = u1_num_mbs;
   1415 
   1416         }
   1417 //ps_dec->ps_pred++;
   1418     }
   1419 
   1420     ps_dec->u4_num_mbs_cur_nmb = 0;
   1421     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1422                         - (u2_first_mb_in_slice << u1_mbaff);
   1423 
   1424 
   1425     return ret;
   1426 }
   1427 
   1428 WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,
   1429                                 WORD32 num_mb_skip,
   1430                                 UWORD8 u1_is_idr_slice,
   1431                                 UWORD16 u2_frame_num,
   1432                                 pocstruct_t *ps_cur_poc,
   1433                                 WORD32 prev_slice_err)
   1434 {
   1435     WORD32 i2_cur_mb_addr;
   1436     UWORD32 u1_num_mbs, u1_num_mbsNby2;
   1437     UWORD32 u1_mb_idx = ps_dec->u1_mb_idx;
   1438     UWORD32 i2_mb_skip_run;
   1439 
   1440     UWORD32 u1_num_mbs_next, u1_end_of_row;
   1441     const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
   1442     UWORD32 u1_slice_end;
   1443     UWORD32 u1_tfr_n_mb;
   1444     UWORD32 u1_decode_nmb;
   1445     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
   1446     dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
   1447     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1448     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1449     deblk_mb_t *ps_cur_deblk_mb;
   1450     dec_mb_info_t *ps_cur_mb_info;
   1451     parse_pmbarams_t *ps_parse_mb_data;
   1452     UWORD32 u1_inter_mb_type;
   1453     UWORD32 u1_deblk_mb_type;
   1454     UWORD16 u2_total_mbs_coded;
   1455     UWORD32 u1_mbaff = ps_slice->u1_mbaff_frame_flag;
   1456     parse_part_params_t *ps_part_info;
   1457     WORD32 ret;
   1458 
   1459 
   1460     if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
   1461     {
   1462         ih264d_err_pic_dispbuf_mgr(ps_dec);
   1463         return 0;
   1464     }
   1465     ps_dec->ps_dpb_cmds->u1_long_term_reference_flag = 0;
   1466     if(prev_slice_err == 1)
   1467     {
   1468         /* first slice - missing/header corruption */
   1469         ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
   1470 
   1471 
   1472         if(!ps_dec->u1_first_slice_in_stream)
   1473         {
   1474             ih264d_end_of_pic(ps_dec, u1_is_idr_slice,
   1475                 ps_dec->ps_cur_slice->u2_frame_num);
   1476             ps_dec->s_cur_pic_poc.u2_frame_num =
   1477                 ps_dec->ps_cur_slice->u2_frame_num;
   1478         }
   1479 
   1480         {
   1481             WORD32 i, j, poc = 0;
   1482 
   1483             ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0;
   1484 
   1485             ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
   1486             ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
   1487             ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
   1488 
   1489             if(ps_dec->ps_cur_pic != NULL)
   1490                 poc = ps_dec->ps_cur_pic->i4_poc + 2;
   1491 
   1492             j = 0;
   1493             for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
   1494                    if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
   1495                        j = i;
   1496             {
   1497                 //initialize slice params required by ih264d_start_of_pic to valid values
   1498                 ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
   1499                 ps_dec->ps_cur_slice->u1_nal_ref_idc = 1;
   1500                 ps_dec->ps_cur_slice->u1_nal_unit_type = 1;
   1501                 ret = ih264d_start_of_pic(ps_dec, poc, ps_cur_poc,
   1502                         ps_dec->ps_cur_slice->u2_frame_num,
   1503                         &ps_dec->ps_pps[j]);
   1504 
   1505                 if(ret != OK)
   1506                 {
   1507                     return ret;
   1508                 }
   1509             }
   1510 
   1511             ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0;
   1512 
   1513             ps_dec->u4_output_present = 0;
   1514 
   1515             {
   1516                 ih264d_get_next_display_field(ps_dec,
   1517                                               ps_dec->ps_out_buffer,
   1518                                               &(ps_dec->s_disp_op));
   1519                 /* If error code is non-zero then there is no buffer available for display,
   1520                  hence avoid format conversion */
   1521 
   1522                 if(0 != ps_dec->s_disp_op.u4_error_code)
   1523                 {
   1524                     ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
   1525                 }
   1526                 else
   1527                     ps_dec->u4_output_present = 1;
   1528             }
   1529 
   1530             if(ps_dec->u1_separate_parse == 1)
   1531             {
   1532                 if(ps_dec->u4_dec_thread_created == 0)
   1533                 {
   1534                     ithread_create(ps_dec->pv_dec_thread_handle, NULL,
   1535                                    (void *)ih264d_decode_picture_thread,
   1536                                    (void *)ps_dec);
   1537 
   1538                     ps_dec->u4_dec_thread_created = 1;
   1539                 }
   1540 
   1541                 if((ps_dec->u4_num_cores == 3) &&
   1542                                 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
   1543                                 && (ps_dec->u4_bs_deblk_thread_created == 0))
   1544                 {
   1545                     ps_dec->u4_start_recon_deblk = 0;
   1546                     ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
   1547                                    (void *)ih264d_recon_deblk_thread,
   1548                                    (void *)ps_dec);
   1549                     ps_dec->u4_bs_deblk_thread_created = 1;
   1550                 }
   1551             }
   1552         }
   1553         ps_dec->u4_first_slice_in_pic = 0;
   1554     }
   1555     else
   1556     {
   1557         // Middle / last slice
   1558 
   1559         dec_slice_struct_t *ps_parse_cur_slice;
   1560         ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
   1561 
   1562         if(ps_dec->u1_slice_header_done
   1563             && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
   1564         {
   1565             // Slice data corrupted
   1566             u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb;
   1567 
   1568             if(u1_num_mbs)
   1569             {
   1570                 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1;
   1571             }
   1572             else
   1573             {
   1574                 if(ps_dec->u1_separate_parse)
   1575                 {
   1576                     ps_cur_mb_info = ps_dec->ps_nmb_info - 1;
   1577                 }
   1578                 else
   1579                 {
   1580                     ps_cur_mb_info = ps_dec->ps_nmb_info
   1581                             + ps_dec->u4_num_mbs_prev_nmb - 1;
   1582                 }
   1583             }
   1584 
   1585             ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
   1586             ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
   1587 
   1588             ps_dec->u1_mb_ngbr_availablity =
   1589                     ps_cur_mb_info->u1_mb_ngbr_availablity;
   1590 
   1591             // Going back 1 mb
   1592             ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data;
   1593             ps_dec->u2_cur_mb_addr--;
   1594             ps_dec->i4_submb_ofst -= SUB_BLK_SIZE;
   1595 
   1596             if(u1_num_mbs)
   1597             {
   1598                 // Parse/decode N-MB left unparsed
   1599                 if (ps_dec->u1_pr_sl_type == P_SLICE
   1600                         || ps_dec->u1_pr_sl_type == B_SLICE)
   1601                 {
   1602                     ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx,    u1_num_mbs);
   1603                     ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1604                 }
   1605 
   1606                 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1607                 u1_end_of_row = (!u1_num_mbs_next)
   1608                         && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1609                 u1_slice_end = 1;
   1610                 u1_tfr_n_mb = 1;
   1611                 ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1612 
   1613                 if(ps_dec->u1_separate_parse)
   1614                 {
   1615                     ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1616                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1617                     ps_dec->ps_nmb_info += u1_num_mbs;
   1618                 }
   1619                 else
   1620                 {
   1621                     ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1622                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1623                 }
   1624                 ps_dec->u2_total_mbs_coded += u1_num_mbs;
   1625                 ps_dec->u1_mb_idx = 0;
   1626                 ps_dec->u4_num_mbs_cur_nmb = 0;
   1627             }
   1628 
   1629             if(ps_dec->u2_total_mbs_coded
   1630                     >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1631             {
   1632                 ps_dec->u1_pic_decode_done = 1;
   1633                 return 0;
   1634             }
   1635 
   1636             // Inserting new slice
   1637             ps_dec->u2_cur_slice_num++;
   1638              ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1639             ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1640             ps_dec->ps_parse_cur_slice++;
   1641 
   1642         }
   1643         else
   1644         {
   1645             // Slice missing / header corrupted
   1646             ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf
   1647                                             + ps_dec->u2_cur_slice_num;
   1648         }
   1649     }
   1650 
   1651     /******************************************************/
   1652     /* Initializations to new slice                       */
   1653     /******************************************************/
   1654     {
   1655         WORD32 num_entries;
   1656         WORD32 size;
   1657         UWORD8 *pu1_buf;
   1658 
   1659         num_entries = MAX_FRAMES;
   1660         if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
   1661             (0 == ps_dec->i4_display_delay))
   1662         {
   1663             num_entries = 1;
   1664         }
   1665         num_entries = ((2 * num_entries) + 1);
   1666         if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
   1667         {
   1668             num_entries *= 2;
   1669         }
   1670         size = num_entries * sizeof(void *);
   1671         size += PAD_MAP_IDX_POC * sizeof(void *);
   1672 
   1673         pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
   1674         pu1_buf += size * ps_dec->u2_cur_slice_num;
   1675         ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf;
   1676     }
   1677 
   1678     ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff;
   1679     ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   1680     ps_dec->ps_cur_slice->i1_slice_beta_offset = 0;
   1681 
   1682     if(ps_dec->ps_cur_slice->u1_field_pic_flag)
   1683         ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num;
   1684 
   1685     ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff;
   1686     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =    ps_dec->ps_cur_slice->u2_log2Y_crwd;
   1687 
   1688 
   1689     if(ps_dec->u1_separate_parse)
   1690     {
   1691         ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
   1692     }
   1693     else
   1694     {
   1695         ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
   1696     }
   1697 
   1698     /******************************************************/
   1699     /* Initializations specific to P slice                */
   1700     /******************************************************/
   1701     u1_inter_mb_type = P_MB;
   1702     u1_deblk_mb_type = D_INTER_MB;
   1703 
   1704     ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
   1705     ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
   1706     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
   1707     ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1708 
   1709     /******************************************************/
   1710     /* Parsing / decoding the slice                       */
   1711     /******************************************************/
   1712     ps_dec->u1_slice_header_done = 2;
   1713     ps_dec->u1_qp = ps_slice->u1_slice_qp;
   1714     ih264d_update_qp(ps_dec, 0);
   1715     u1_mb_idx = ps_dec->u1_mb_idx;
   1716     ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1717     u1_num_mbs = u1_mb_idx;
   1718 
   1719     u1_slice_end = 0;
   1720     u1_tfr_n_mb = 0;
   1721     u1_decode_nmb = 0;
   1722     u1_num_mbsNby2 = 0;
   1723     i2_cur_mb_addr = ps_dec->u2_total_mbs_coded;
   1724     i2_mb_skip_run = num_mb_skip;
   1725 
   1726     while(!u1_slice_end)
   1727     {
   1728         UWORD8 u1_mb_type;
   1729 
   1730         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
   1731             break;
   1732 
   1733         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
   1734         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
   1735 
   1736         ps_cur_mb_info->u1_Mux = 0;
   1737         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
   1738         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
   1739 
   1740         ps_cur_mb_info->u1_end_of_slice = 0;
   1741 
   1742         /* Storing Default partition info */
   1743         ps_parse_mb_data->u1_num_part = 1;
   1744         ps_parse_mb_data->u1_isI_mb = 0;
   1745 
   1746         /**************************************************************/
   1747         /* Get the required information for decoding of MB            */
   1748         /**************************************************************/
   1749         /* mb_x, mb_y, neighbor availablity, */
   1750         if (u1_mbaff)
   1751             ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1752         else
   1753             ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1754 
   1755         /* Set the deblocking parameters for this MB */
   1756         if(ps_dec->u4_app_disable_deblk_frm == 0)
   1757         {
   1758             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
   1759                                              ps_dec->u1_mb_ngbr_availablity,
   1760                                              ps_dec->u1_cur_mb_fld_dec_flag);
   1761         }
   1762 
   1763         /* Set appropriate flags in ps_cur_mb_info and ps_dec */
   1764         ps_dec->i1_prev_mb_qp_delta = 0;
   1765         ps_dec->u1_sub_mb_num = 0;
   1766         ps_cur_mb_info->u1_mb_type = MB_SKIP;
   1767         ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
   1768         ps_cur_mb_info->u1_cbp = 0;
   1769 
   1770         /* Storing Skip partition info */
   1771         ps_part_info = ps_dec->ps_part;
   1772         ps_part_info->u1_is_direct = PART_DIRECT_16x16;
   1773         ps_part_info->u1_sub_mb_num = 0;
   1774         ps_dec->ps_part++;
   1775 
   1776         /* Update Nnzs */
   1777         ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
   1778 
   1779         ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
   1780         ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
   1781 
   1782         i2_mb_skip_run--;
   1783 
   1784         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
   1785 
   1786         if (u1_mbaff)
   1787         {
   1788             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1789         }
   1790 
   1791         /**************************************************************/
   1792         /* Get next Macroblock address                                */
   1793         /**************************************************************/
   1794         i2_cur_mb_addr++;
   1795 
   1796         u1_num_mbs++;
   1797         u1_num_mbsNby2++;
   1798         ps_parse_mb_data++;
   1799 
   1800         /****************************************************************/
   1801         /* Check for End Of Row and other flags that determine when to  */
   1802         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
   1803         /* N-Mb                                                         */
   1804         /****************************************************************/
   1805         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1806         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1807         u1_slice_end = !i2_mb_skip_run;
   1808         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1809                         || u1_slice_end;
   1810         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
   1811         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1812 
   1813         if(u1_decode_nmb)
   1814         {
   1815             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
   1816             u1_num_mbsNby2 = 0;
   1817 
   1818             ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1819             ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1820 
   1821             if(ps_dec->u1_separate_parse)
   1822             {
   1823                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1824                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1825                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1826             }
   1827             else
   1828             {
   1829                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
   1830                                             u1_tfr_n_mb, u1_end_of_row);
   1831             }
   1832             ps_dec->u2_total_mbs_coded += u1_num_mbs;
   1833             if(u1_tfr_n_mb)
   1834                 u1_num_mbs = 0;
   1835             u1_mb_idx = u1_num_mbs;
   1836             ps_dec->u1_mb_idx = u1_num_mbs;
   1837         }
   1838     }
   1839 
   1840     ps_dec->u4_num_mbs_cur_nmb = 0;
   1841     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1842                         - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
   1843 
   1844     H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice);
   1845 
   1846 
   1847     /* incremented here only if first slice is inserted */
   1848     if(ps_dec->u4_first_slice_in_pic != 0)
   1849     {
   1850         ps_dec->ps_parse_cur_slice++;
   1851         ps_dec->u2_cur_slice_num++;
   1852     }
   1853 
   1854     ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1855     ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1856 
   1857     if(ps_dec->u2_total_mbs_coded
   1858             >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1859     {
   1860         ps_dec->u1_pic_decode_done = 1;
   1861     }
   1862 
   1863     return 0;
   1864 
   1865 }
   1866 
   1867 /*!
   1868  **************************************************************************
   1869  * \if Function name : ih264d_decode_pslice \endif
   1870  *
   1871  * \brief
   1872  *    Decodes a P Slice
   1873  *
   1874  *
   1875  * \return
   1876  *    0 on Success and Error code otherwise
   1877  **************************************************************************
   1878  */
   1879 WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice)
   1880 {
   1881     dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
   1882     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
   1883     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
   1884     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1885     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1886     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag;
   1887     UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
   1888 
   1889     UWORD32 u4_temp;
   1890     WORD32 i_temp;
   1891     WORD32 ret;
   1892 
   1893     /*--------------------------------------------------------------------*/
   1894     /* Read remaining contents of the slice header                        */
   1895     /*--------------------------------------------------------------------*/
   1896     {
   1897         WORD8 *pi1_buf;
   1898         WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
   1899         WORD32 *pi4_mv = (WORD32*)pi2_mv;
   1900         WORD16 *pi16_refFrame;
   1901 
   1902         pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
   1903         pi16_refFrame = (WORD16*)pi1_buf;
   1904         *pi4_mv = 0;
   1905         *(pi4_mv + 1) = 0;
   1906         *pi16_refFrame = OUT_OF_RANGE_REF;
   1907         ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
   1908         ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
   1909     }
   1910 
   1911     ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
   1912                     ps_bitstrm);
   1913 
   1914     COPYTHECONTEXT("SH: num_ref_idx_override_flag",
   1915                     ps_cur_slice->u1_num_ref_idx_active_override_flag);
   1916 
   1917     u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
   1918     if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
   1919     {
   1920         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + 1;
   1921     }
   1922 
   1923     {
   1924 
   1925 
   1926 
   1927         UWORD8 u1_max_ref_idx = MAX_FRAMES << u1_field_pic_flag;
   1928         if(u4_temp > u1_max_ref_idx)
   1929         {
   1930             return ERROR_NUM_REF;
   1931         }
   1932         ps_cur_slice->u1_num_ref_idx_lx_active[0] = u4_temp;
   1933         COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
   1934                         ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
   1935 
   1936     }
   1937 
   1938     {
   1939         UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
   1940         COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0);
   1941 
   1942         /* Initialize the Reference list once in Picture if the slice type    */
   1943         /* of first slice is between 5 to 9 defined in table 7.3 of standard  */
   1944         /* If picture contains both P & B slices then Initialize the Reference*/
   1945         /* List only when it switches from P to B and B to P                     */
   1946         {
   1947             UWORD8 init_idx_flg = (ps_dec->u1_pr_sl_type
   1948                             != ps_dec->ps_cur_slice->u1_slice_type);
   1949             if(ps_dec->u1_first_pb_nal_in_pic
   1950                             || (init_idx_flg & !ps_dec->u1_sl_typ_5_9)
   1951                             || ps_dec->u1_num_ref_idx_lx_active_prev
   1952                                             != ps_cur_slice->u1_num_ref_idx_lx_active[0])
   1953             {
   1954                 ih264d_init_ref_idx_lx_p(ps_dec);
   1955             }
   1956             if(ps_dec->u1_first_pb_nal_in_pic & ps_dec->u1_sl_typ_5_9)
   1957                 ps_dec->u1_first_pb_nal_in_pic = 0;
   1958         }
   1959         /* Store the value for future slices in the same picture */
   1960         ps_dec->u1_num_ref_idx_lx_active_prev =
   1961                         ps_cur_slice->u1_num_ref_idx_lx_active[0];
   1962 
   1963         /* Modified temporarily */
   1964         if(uc_refIdxReFlagL0)
   1965         {
   1966             WORD8 ret;
   1967             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
   1968             ret = ih264d_ref_idx_reordering(ps_dec, 0);
   1969             if(ret == -1)
   1970                 return ERROR_REFIDX_ORDER_T;
   1971             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
   1972         }
   1973         else
   1974             ps_dec->ps_ref_pic_buf_lx[0] =
   1975                             ps_dec->ps_dpb_mgr->ps_init_dpb[0];
   1976     }
   1977     /* Create refIdx to POC mapping */
   1978     {
   1979         void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
   1980         WORD8 idx;
   1981         struct pic_buffer_t *ps_pic;
   1982 
   1983         pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
   1984         pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1
   1985         pui_map_ref_idx_to_poc_lx0++;
   1986         for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
   1987         {
   1988             ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
   1989             pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
   1990         }
   1991 
   1992         /* Bug Fix Deblocking */
   1993         pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
   1994         pui_map_ref_idx_to_poc_lx1[0] = 0;
   1995 
   1996         if(u1_mbaff)
   1997         {
   1998             void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
   1999             void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
   2000             ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
   2001                             + TOP_LIST_FLD_L0;
   2002             ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
   2003                             + BOT_LIST_FLD_L0;
   2004 
   2005             ppv_map_ref_idx_to_poc_lx_t[0] = 0; //  For ref_idx = -1
   2006             ppv_map_ref_idx_to_poc_lx_t++;
   2007             ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1
   2008             ppv_map_ref_idx_to_poc_lx_b++;
   2009 
   2010             idx = 0;
   2011             for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
   2012             {
   2013                 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
   2014                 ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
   2015                 ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
   2016 
   2017                 ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
   2018                 ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
   2019 
   2020                 ppv_map_ref_idx_to_poc_lx_t += 2;
   2021                 ppv_map_ref_idx_to_poc_lx_b += 2;
   2022             }
   2023             ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc
   2024                             + TOP_LIST_FLD_L1;
   2025             ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
   2026             ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc
   2027                             + BOT_LIST_FLD_L1;
   2028             ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
   2029 
   2030         }
   2031 
   2032         if(ps_dec->u4_num_cores >= 3)
   2033         {
   2034             WORD32 num_entries;
   2035             WORD32 size;
   2036 
   2037             num_entries = MAX_FRAMES;
   2038             if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
   2039                 (0 == ps_dec->i4_display_delay))
   2040             {
   2041                 num_entries = 1;
   2042             }
   2043             num_entries = ((2 * num_entries) + 1);
   2044             if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
   2045             {
   2046                 num_entries *= 2;
   2047             }
   2048 
   2049             size = num_entries * sizeof(void *);
   2050             size += PAD_MAP_IDX_POC * sizeof(void *);
   2051 
   2052             memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
   2053                    ps_dec->ppv_map_ref_idx_to_poc,
   2054                    size);
   2055         }
   2056 
   2057 
   2058     }
   2059     if(ps_pps->u1_wted_pred_flag)
   2060     {
   2061         ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
   2062         if(ret != OK)
   2063             return ret;
   2064         ih264d_form_pred_weight_matrix(ps_dec);
   2065         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
   2066     }
   2067     else
   2068     {
   2069         ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
   2070         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
   2071     }
   2072 
   2073     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
   2074                     ps_dec->ps_cur_slice->u2_log2Y_crwd;
   2075 
   2076     if(u1_mbaff && (u1_field_pic_flag == 0))
   2077     {
   2078         ih264d_convert_frm_mbaff_list(ps_dec);
   2079     }
   2080 
   2081     /* G050 */
   2082     if(ps_cur_slice->u1_nal_ref_idc != 0)
   2083     {
   2084         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
   2085         {
   2086             i_temp = ih264d_read_mmco_commands(ps_dec);
   2087             if (i_temp < 0)
   2088             {
   2089                 return ERROR_DBP_MANAGER_T;
   2090             }
   2091             ps_dec->u4_bitoffset = i_temp;
   2092         }
   2093         else
   2094             ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
   2095 
   2096     }
   2097     /* G050 */
   2098 
   2099     if(ps_pps->u1_entropy_coding_mode == CABAC)
   2100     {
   2101         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2102 
   2103         if(u4_temp > MAX_CABAC_INIT_IDC)
   2104         {
   2105             return ERROR_INV_SLICE_HDR_T;
   2106         }
   2107         ps_cur_slice->u1_cabac_init_idc = u4_temp;
   2108         COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc);
   2109     }
   2110 
   2111     /* Read slice_qp_delta */
   2112     i_temp = ps_pps->u1_pic_init_qp
   2113                     + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2114     if((i_temp < 0) || (i_temp > 51))
   2115     {
   2116         return ERROR_INV_RANGE_QP_T;
   2117     }
   2118     ps_cur_slice->u1_slice_qp = i_temp;
   2119     COPYTHECONTEXT("SH: slice_qp_delta",
   2120                     (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
   2121 
   2122     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
   2123     {
   2124         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2125         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
   2126         {
   2127             return ERROR_INV_SLICE_HDR_T;
   2128         }
   2129 
   2130         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
   2131         ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
   2132         if(u4_temp != 1)
   2133         {
   2134             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   2135                             << 1;
   2136             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   2137             {
   2138                 return ERROR_INV_SLICE_HDR_T;
   2139             }
   2140             ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
   2141             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
   2142                             ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
   2143 
   2144             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   2145                             << 1;
   2146             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   2147             {
   2148                 return ERROR_INV_SLICE_HDR_T;
   2149             }
   2150             ps_cur_slice->i1_slice_beta_offset = i_temp;
   2151             COPYTHECONTEXT("SH: slice_beta_offset_div2",
   2152                             ps_cur_slice->i1_slice_beta_offset >> 1);
   2153         }
   2154         else
   2155         {
   2156             ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   2157             ps_cur_slice->i1_slice_beta_offset = 0;
   2158         }
   2159     }
   2160     else
   2161     {
   2162         ps_cur_slice->u1_disable_dblk_filter_idc = 0;
   2163         ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   2164         ps_cur_slice->i1_slice_beta_offset = 0;
   2165     }
   2166 
   2167     ps_dec->u1_slice_header_done = 2;
   2168 
   2169     if(ps_pps->u1_entropy_coding_mode)
   2170     {
   2171         SWITCHOFFTRACE; SWITCHONTRACECABAC;
   2172         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
   2173         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
   2174         ih264d_init_cabac_contexts(P_SLICE, ps_dec);
   2175 
   2176         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   2177             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
   2178         else
   2179             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
   2180     }
   2181     else
   2182     {
   2183         SWITCHONTRACE; SWITCHOFFTRACECABAC;
   2184         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
   2185         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
   2186         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   2187         {
   2188             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
   2189         }
   2190         else
   2191             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
   2192     }
   2193 
   2194     ps_dec->u1_B = 0;
   2195     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
   2196     ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice);
   2197     if(ret != OK)
   2198         return ret;
   2199 //    ps_dec->curr_slice_in_error = 0 ;
   2200     return OK;
   2201 }
   2202