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 = -1;
   1493             for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
   1494             {
   1495                    if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
   1496                    {
   1497                        if(ps_dec->ps_pps[i].ps_sps->u1_is_valid == TRUE)
   1498                        {
   1499                            j = i;
   1500                            break;
   1501                        }
   1502                    }
   1503             }
   1504 
   1505             //if valid SPS PPS is not found return error
   1506             if(j == -1)
   1507             {
   1508                 return ERROR_INV_SPS_PPS_T;
   1509             }
   1510 
   1511             /* call ih264d_start_of_pic only if it was not called earlier*/
   1512             if(ps_dec->u4_pic_buf_got == 0)
   1513             {
   1514                 //initialize slice params required by ih264d_start_of_pic to valid values
   1515                 ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
   1516                 ps_dec->ps_cur_slice->u1_nal_ref_idc = 1;
   1517                 ps_dec->ps_cur_slice->u1_nal_unit_type = 1;
   1518                 ret = ih264d_start_of_pic(ps_dec, poc, ps_cur_poc,
   1519                         ps_dec->ps_cur_slice->u2_frame_num,
   1520                         &ps_dec->ps_pps[j]);
   1521 
   1522                 if(ret != OK)
   1523                 {
   1524                     return ret;
   1525                 }
   1526             }
   1527 
   1528             ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0;
   1529 
   1530             ps_dec->u4_output_present = 0;
   1531 
   1532             {
   1533                 ih264d_get_next_display_field(ps_dec,
   1534                                               ps_dec->ps_out_buffer,
   1535                                               &(ps_dec->s_disp_op));
   1536                 /* If error code is non-zero then there is no buffer available for display,
   1537                  hence avoid format conversion */
   1538 
   1539                 if(0 != ps_dec->s_disp_op.u4_error_code)
   1540                 {
   1541                     ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
   1542                 }
   1543                 else
   1544                     ps_dec->u4_output_present = 1;
   1545             }
   1546 
   1547             if(ps_dec->u1_separate_parse == 1)
   1548             {
   1549                 if(ps_dec->u4_dec_thread_created == 0)
   1550                 {
   1551                     ithread_create(ps_dec->pv_dec_thread_handle, NULL,
   1552                                    (void *)ih264d_decode_picture_thread,
   1553                                    (void *)ps_dec);
   1554 
   1555                     ps_dec->u4_dec_thread_created = 1;
   1556                 }
   1557 
   1558                 if((ps_dec->u4_num_cores == 3) &&
   1559                                 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
   1560                                 && (ps_dec->u4_bs_deblk_thread_created == 0))
   1561                 {
   1562                     ps_dec->u4_start_recon_deblk = 0;
   1563                     ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
   1564                                    (void *)ih264d_recon_deblk_thread,
   1565                                    (void *)ps_dec);
   1566                     ps_dec->u4_bs_deblk_thread_created = 1;
   1567                 }
   1568             }
   1569         }
   1570         ps_dec->u4_first_slice_in_pic = 0;
   1571     }
   1572     else
   1573     {
   1574         // Middle / last slice
   1575 
   1576         dec_slice_struct_t *ps_parse_cur_slice;
   1577         ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
   1578 
   1579         if(ps_dec->u1_slice_header_done
   1580             && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
   1581         {
   1582             // Slice data corrupted
   1583             // in the case of mbaff, conceal from the even mb.
   1584             u1_num_mbs = (ps_dec->u4_num_mbs_cur_nmb >> u1_mbaff ) << u1_mbaff;
   1585 
   1586             if(u1_num_mbs)
   1587             {
   1588                 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1;
   1589             }
   1590             else
   1591             {
   1592                 if(ps_dec->u1_separate_parse)
   1593                 {
   1594                     ps_cur_mb_info = ps_dec->ps_nmb_info - 1;
   1595                 }
   1596                 else
   1597                 {
   1598                     ps_cur_mb_info = ps_dec->ps_nmb_info
   1599                             + ps_dec->u4_num_mbs_prev_nmb - 1;
   1600                 }
   1601             }
   1602 
   1603             ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
   1604             ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
   1605 
   1606             ps_dec->u1_mb_ngbr_availablity =
   1607                     ps_cur_mb_info->u1_mb_ngbr_availablity;
   1608 
   1609             // Going back 1 mb
   1610             ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data;
   1611             ps_dec->u2_cur_mb_addr--;
   1612             ps_dec->i4_submb_ofst -= SUB_BLK_SIZE;
   1613 
   1614             if(u1_num_mbs)
   1615             {
   1616                 // Parse/decode N-MB left unparsed
   1617                 if (ps_dec->u1_pr_sl_type == P_SLICE
   1618                         || ps_dec->u1_pr_sl_type == B_SLICE)
   1619                 {
   1620                     ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx,    u1_num_mbs);
   1621                     ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1622                 }
   1623 
   1624                 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1625                 u1_end_of_row = (!u1_num_mbs_next)
   1626                         && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1627                 u1_slice_end = 1;
   1628                 u1_tfr_n_mb = 1;
   1629                 ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1630 
   1631                 if(ps_dec->u1_separate_parse)
   1632                 {
   1633                     ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1634                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1635                     ps_dec->ps_nmb_info += u1_num_mbs;
   1636                 }
   1637                 else
   1638                 {
   1639                     ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1640                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1641                 }
   1642                 ps_dec->u2_total_mbs_coded += u1_num_mbs;
   1643                 ps_dec->u1_mb_idx = 0;
   1644                 ps_dec->u4_num_mbs_cur_nmb = 0;
   1645             }
   1646 
   1647             if(ps_dec->u2_total_mbs_coded
   1648                     >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1649             {
   1650                 ps_dec->u1_pic_decode_done = 1;
   1651                 return 0;
   1652             }
   1653 
   1654             // Inserting new slice
   1655             ps_dec->u2_cur_slice_num++;
   1656              ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1657             ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1658             ps_dec->ps_parse_cur_slice++;
   1659 
   1660         }
   1661         else
   1662         {
   1663             // Slice missing / header corrupted
   1664             ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf
   1665                                             + ps_dec->u2_cur_slice_num;
   1666         }
   1667     }
   1668 
   1669     /******************************************************/
   1670     /* Initializations to new slice                       */
   1671     /******************************************************/
   1672     {
   1673         WORD32 num_entries;
   1674         WORD32 size;
   1675         UWORD8 *pu1_buf;
   1676 
   1677         num_entries = MAX_FRAMES;
   1678         if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
   1679             (0 == ps_dec->i4_display_delay))
   1680         {
   1681             num_entries = 1;
   1682         }
   1683         num_entries = ((2 * num_entries) + 1);
   1684         if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
   1685         {
   1686             num_entries *= 2;
   1687         }
   1688         size = num_entries * sizeof(void *);
   1689         size += PAD_MAP_IDX_POC * sizeof(void *);
   1690 
   1691         pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
   1692         pu1_buf += size * ps_dec->u2_cur_slice_num;
   1693         ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf;
   1694     }
   1695 
   1696     ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded >> u1_mbaff;
   1697     ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   1698     ps_dec->ps_cur_slice->i1_slice_beta_offset = 0;
   1699 
   1700     if(ps_dec->ps_cur_slice->u1_field_pic_flag)
   1701         ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num;
   1702 
   1703     ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded >> u1_mbaff;
   1704     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =    ps_dec->ps_cur_slice->u2_log2Y_crwd;
   1705 
   1706 
   1707     if(ps_dec->u1_separate_parse)
   1708     {
   1709         ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
   1710     }
   1711     else
   1712     {
   1713         ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
   1714     }
   1715 
   1716     /******************************************************/
   1717     /* Initializations specific to P slice                */
   1718     /******************************************************/
   1719     u1_inter_mb_type = P_MB;
   1720     u1_deblk_mb_type = D_INTER_MB;
   1721 
   1722     ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
   1723     ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
   1724     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
   1725     ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1726     ps_dec->u2_mbx =
   1727                     (MOD(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
   1728     ps_dec->u2_mby =
   1729                     (DIV(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs));
   1730     ps_dec->u2_mby <<= u1_mbaff;
   1731 
   1732     /******************************************************/
   1733     /* Parsing / decoding the slice                       */
   1734     /******************************************************/
   1735     ps_dec->u1_slice_header_done = 2;
   1736     ps_dec->u1_qp = ps_slice->u1_slice_qp;
   1737     ih264d_update_qp(ps_dec, 0);
   1738     u1_mb_idx = ps_dec->u1_mb_idx;
   1739     ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1740     u1_num_mbs = u1_mb_idx;
   1741 
   1742     u1_slice_end = 0;
   1743     u1_tfr_n_mb = 0;
   1744     u1_decode_nmb = 0;
   1745     u1_num_mbsNby2 = 0;
   1746     i2_cur_mb_addr = ps_dec->u2_total_mbs_coded;
   1747     i2_mb_skip_run = num_mb_skip;
   1748 
   1749     while(!u1_slice_end)
   1750     {
   1751         UWORD8 u1_mb_type;
   1752 
   1753         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
   1754             break;
   1755 
   1756         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
   1757         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
   1758 
   1759         ps_cur_mb_info->u1_Mux = 0;
   1760         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
   1761         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
   1762 
   1763         ps_cur_mb_info->u1_end_of_slice = 0;
   1764 
   1765         /* Storing Default partition info */
   1766         ps_parse_mb_data->u1_num_part = 1;
   1767         ps_parse_mb_data->u1_isI_mb = 0;
   1768 
   1769         /**************************************************************/
   1770         /* Get the required information for decoding of MB            */
   1771         /**************************************************************/
   1772         /* mb_x, mb_y, neighbor availablity, */
   1773         if (u1_mbaff)
   1774             ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1775         else
   1776             ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1777 
   1778         /* Set the deblocking parameters for this MB */
   1779         if(ps_dec->u4_app_disable_deblk_frm == 0)
   1780         {
   1781             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
   1782                                              ps_dec->u1_mb_ngbr_availablity,
   1783                                              ps_dec->u1_cur_mb_fld_dec_flag);
   1784         }
   1785 
   1786         /* Set appropriate flags in ps_cur_mb_info and ps_dec */
   1787         ps_dec->i1_prev_mb_qp_delta = 0;
   1788         ps_dec->u1_sub_mb_num = 0;
   1789         ps_cur_mb_info->u1_mb_type = MB_SKIP;
   1790         ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
   1791         ps_cur_mb_info->u1_cbp = 0;
   1792 
   1793         /* Storing Skip partition info */
   1794         ps_part_info = ps_dec->ps_part;
   1795         ps_part_info->u1_is_direct = PART_DIRECT_16x16;
   1796         ps_part_info->u1_sub_mb_num = 0;
   1797         ps_dec->ps_part++;
   1798 
   1799         /* Update Nnzs */
   1800         ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
   1801 
   1802         ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
   1803         ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
   1804 
   1805         i2_mb_skip_run--;
   1806 
   1807         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
   1808 
   1809         if (u1_mbaff)
   1810         {
   1811             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1812         }
   1813 
   1814         /**************************************************************/
   1815         /* Get next Macroblock address                                */
   1816         /**************************************************************/
   1817         i2_cur_mb_addr++;
   1818 
   1819         u1_num_mbs++;
   1820         u1_num_mbsNby2++;
   1821         ps_parse_mb_data++;
   1822 
   1823         /****************************************************************/
   1824         /* Check for End Of Row and other flags that determine when to  */
   1825         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
   1826         /* N-Mb                                                         */
   1827         /****************************************************************/
   1828         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1829         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1830         u1_slice_end = !i2_mb_skip_run;
   1831         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1832                         || u1_slice_end;
   1833         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
   1834         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1835 
   1836         if(u1_decode_nmb)
   1837         {
   1838             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
   1839             u1_num_mbsNby2 = 0;
   1840 
   1841             ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1842             ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1843 
   1844             if(ps_dec->u1_separate_parse)
   1845             {
   1846                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1847                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1848                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1849             }
   1850             else
   1851             {
   1852                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
   1853                                             u1_tfr_n_mb, u1_end_of_row);
   1854             }
   1855             ps_dec->u2_total_mbs_coded += u1_num_mbs;
   1856             if(u1_tfr_n_mb)
   1857                 u1_num_mbs = 0;
   1858             u1_mb_idx = u1_num_mbs;
   1859             ps_dec->u1_mb_idx = u1_num_mbs;
   1860         }
   1861     }
   1862 
   1863     ps_dec->u4_num_mbs_cur_nmb = 0;
   1864     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1865                         - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
   1866 
   1867     H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice);
   1868 
   1869 
   1870     /* incremented here only if first slice is inserted */
   1871     if(ps_dec->u4_first_slice_in_pic != 0)
   1872     {
   1873         ps_dec->ps_parse_cur_slice++;
   1874         ps_dec->u2_cur_slice_num++;
   1875     }
   1876 
   1877     ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1878     ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1879 
   1880     if(ps_dec->u2_total_mbs_coded
   1881             >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1882     {
   1883         ps_dec->u1_pic_decode_done = 1;
   1884     }
   1885 
   1886     return 0;
   1887 
   1888 }
   1889 
   1890 /*!
   1891  **************************************************************************
   1892  * \if Function name : ih264d_decode_pslice \endif
   1893  *
   1894  * \brief
   1895  *    Decodes a P Slice
   1896  *
   1897  *
   1898  * \return
   1899  *    0 on Success and Error code otherwise
   1900  **************************************************************************
   1901  */
   1902 WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice)
   1903 {
   1904     dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
   1905     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
   1906     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
   1907     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1908     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1909     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag;
   1910     UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
   1911 
   1912     UWORD32 u4_temp;
   1913     WORD32 i_temp;
   1914     WORD32 ret;
   1915 
   1916     /*--------------------------------------------------------------------*/
   1917     /* Read remaining contents of the slice header                        */
   1918     /*--------------------------------------------------------------------*/
   1919     {
   1920         WORD8 *pi1_buf;
   1921         WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
   1922         WORD32 *pi4_mv = (WORD32*)pi2_mv;
   1923         WORD16 *pi16_refFrame;
   1924 
   1925         pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
   1926         pi16_refFrame = (WORD16*)pi1_buf;
   1927         *pi4_mv = 0;
   1928         *(pi4_mv + 1) = 0;
   1929         *pi16_refFrame = OUT_OF_RANGE_REF;
   1930         ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
   1931         ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
   1932     }
   1933 
   1934     ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
   1935                     ps_bitstrm);
   1936 
   1937     COPYTHECONTEXT("SH: num_ref_idx_override_flag",
   1938                     ps_cur_slice->u1_num_ref_idx_active_override_flag);
   1939 
   1940     u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
   1941     if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
   1942     {
   1943         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + 1;
   1944     }
   1945 
   1946     {
   1947 
   1948 
   1949 
   1950         UWORD8 u1_max_ref_idx = MAX_FRAMES << u1_field_pic_flag;
   1951         if(u4_temp > u1_max_ref_idx)
   1952         {
   1953             return ERROR_NUM_REF;
   1954         }
   1955         ps_cur_slice->u1_num_ref_idx_lx_active[0] = u4_temp;
   1956         COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
   1957                         ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
   1958 
   1959     }
   1960 
   1961     {
   1962         UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
   1963         COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0);
   1964 
   1965         /* Initialize the Reference list once in Picture if the slice type    */
   1966         /* of first slice is between 5 to 9 defined in table 7.3 of standard  */
   1967         /* If picture contains both P & B slices then Initialize the Reference*/
   1968         /* List only when it switches from P to B and B to P                     */
   1969         {
   1970             UWORD8 init_idx_flg = (ps_dec->u1_pr_sl_type
   1971                             != ps_dec->ps_cur_slice->u1_slice_type);
   1972             if(ps_dec->u1_first_pb_nal_in_pic
   1973                             || (init_idx_flg & !ps_dec->u1_sl_typ_5_9)
   1974                             || ps_dec->u1_num_ref_idx_lx_active_prev
   1975                                             != ps_cur_slice->u1_num_ref_idx_lx_active[0])
   1976             {
   1977                 ih264d_init_ref_idx_lx_p(ps_dec);
   1978             }
   1979             if(ps_dec->u1_first_pb_nal_in_pic & ps_dec->u1_sl_typ_5_9)
   1980                 ps_dec->u1_first_pb_nal_in_pic = 0;
   1981         }
   1982         /* Store the value for future slices in the same picture */
   1983         ps_dec->u1_num_ref_idx_lx_active_prev =
   1984                         ps_cur_slice->u1_num_ref_idx_lx_active[0];
   1985 
   1986         /* Modified temporarily */
   1987         if(uc_refIdxReFlagL0)
   1988         {
   1989             WORD8 ret;
   1990             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
   1991             ret = ih264d_ref_idx_reordering(ps_dec, 0);
   1992             if(ret == -1)
   1993                 return ERROR_REFIDX_ORDER_T;
   1994             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
   1995         }
   1996         else
   1997             ps_dec->ps_ref_pic_buf_lx[0] =
   1998                             ps_dec->ps_dpb_mgr->ps_init_dpb[0];
   1999     }
   2000     /* Create refIdx to POC mapping */
   2001     {
   2002         void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
   2003         WORD8 idx;
   2004         struct pic_buffer_t *ps_pic;
   2005 
   2006         pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
   2007         pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1
   2008         pui_map_ref_idx_to_poc_lx0++;
   2009         for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
   2010         {
   2011             ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
   2012             pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
   2013         }
   2014 
   2015         /* Bug Fix Deblocking */
   2016         pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
   2017         pui_map_ref_idx_to_poc_lx1[0] = 0;
   2018 
   2019         if(u1_mbaff)
   2020         {
   2021             void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
   2022             void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
   2023             ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
   2024                             + TOP_LIST_FLD_L0;
   2025             ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
   2026                             + BOT_LIST_FLD_L0;
   2027 
   2028             ppv_map_ref_idx_to_poc_lx_t[0] = 0; //  For ref_idx = -1
   2029             ppv_map_ref_idx_to_poc_lx_t++;
   2030             ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1
   2031             ppv_map_ref_idx_to_poc_lx_b++;
   2032 
   2033             idx = 0;
   2034             for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
   2035             {
   2036                 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
   2037                 ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
   2038                 ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
   2039 
   2040                 ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
   2041                 ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
   2042 
   2043                 ppv_map_ref_idx_to_poc_lx_t += 2;
   2044                 ppv_map_ref_idx_to_poc_lx_b += 2;
   2045             }
   2046             ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc
   2047                             + TOP_LIST_FLD_L1;
   2048             ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
   2049             ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc
   2050                             + BOT_LIST_FLD_L1;
   2051             ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
   2052 
   2053         }
   2054 
   2055         if(ps_dec->u4_num_cores >= 3)
   2056         {
   2057             WORD32 num_entries;
   2058             WORD32 size;
   2059 
   2060             num_entries = MAX_FRAMES;
   2061             if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
   2062                 (0 == ps_dec->i4_display_delay))
   2063             {
   2064                 num_entries = 1;
   2065             }
   2066             num_entries = ((2 * num_entries) + 1);
   2067             if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
   2068             {
   2069                 num_entries *= 2;
   2070             }
   2071 
   2072             size = num_entries * sizeof(void *);
   2073             size += PAD_MAP_IDX_POC * sizeof(void *);
   2074 
   2075             memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
   2076                    ps_dec->ppv_map_ref_idx_to_poc,
   2077                    size);
   2078         }
   2079 
   2080 
   2081     }
   2082     if(ps_pps->u1_wted_pred_flag)
   2083     {
   2084         ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
   2085         if(ret != OK)
   2086             return ret;
   2087         ih264d_form_pred_weight_matrix(ps_dec);
   2088         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
   2089     }
   2090     else
   2091     {
   2092         ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
   2093         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
   2094     }
   2095 
   2096     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
   2097                     ps_dec->ps_cur_slice->u2_log2Y_crwd;
   2098 
   2099     if(u1_mbaff && (u1_field_pic_flag == 0))
   2100     {
   2101         ih264d_convert_frm_mbaff_list(ps_dec);
   2102     }
   2103 
   2104     /* G050 */
   2105     if(ps_cur_slice->u1_nal_ref_idc != 0)
   2106     {
   2107         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
   2108         {
   2109             i_temp = ih264d_read_mmco_commands(ps_dec);
   2110             if (i_temp < 0)
   2111             {
   2112                 return ERROR_DBP_MANAGER_T;
   2113             }
   2114             ps_dec->u4_bitoffset = i_temp;
   2115         }
   2116         else
   2117             ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
   2118 
   2119     }
   2120     /* G050 */
   2121 
   2122     if(ps_pps->u1_entropy_coding_mode == CABAC)
   2123     {
   2124         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2125 
   2126         if(u4_temp > MAX_CABAC_INIT_IDC)
   2127         {
   2128             return ERROR_INV_SLICE_HDR_T;
   2129         }
   2130         ps_cur_slice->u1_cabac_init_idc = u4_temp;
   2131         COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc);
   2132     }
   2133 
   2134     /* Read slice_qp_delta */
   2135     i_temp = ps_pps->u1_pic_init_qp
   2136                     + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2137     if((i_temp < 0) || (i_temp > 51))
   2138     {
   2139         return ERROR_INV_RANGE_QP_T;
   2140     }
   2141     ps_cur_slice->u1_slice_qp = i_temp;
   2142     COPYTHECONTEXT("SH: slice_qp_delta",
   2143                     (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
   2144 
   2145     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
   2146     {
   2147         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2148         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
   2149         {
   2150             return ERROR_INV_SLICE_HDR_T;
   2151         }
   2152 
   2153         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
   2154         ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
   2155         if(u4_temp != 1)
   2156         {
   2157             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   2158                             << 1;
   2159             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   2160             {
   2161                 return ERROR_INV_SLICE_HDR_T;
   2162             }
   2163             ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
   2164             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
   2165                             ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
   2166 
   2167             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   2168                             << 1;
   2169             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   2170             {
   2171                 return ERROR_INV_SLICE_HDR_T;
   2172             }
   2173             ps_cur_slice->i1_slice_beta_offset = i_temp;
   2174             COPYTHECONTEXT("SH: slice_beta_offset_div2",
   2175                             ps_cur_slice->i1_slice_beta_offset >> 1);
   2176         }
   2177         else
   2178         {
   2179             ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   2180             ps_cur_slice->i1_slice_beta_offset = 0;
   2181         }
   2182     }
   2183     else
   2184     {
   2185         ps_cur_slice->u1_disable_dblk_filter_idc = 0;
   2186         ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   2187         ps_cur_slice->i1_slice_beta_offset = 0;
   2188     }
   2189 
   2190     ps_dec->u1_slice_header_done = 2;
   2191 
   2192     if(ps_pps->u1_entropy_coding_mode)
   2193     {
   2194         SWITCHOFFTRACE; SWITCHONTRACECABAC;
   2195         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
   2196         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
   2197         ih264d_init_cabac_contexts(P_SLICE, ps_dec);
   2198 
   2199         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   2200             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
   2201         else
   2202             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
   2203     }
   2204     else
   2205     {
   2206         SWITCHONTRACE; SWITCHOFFTRACECABAC;
   2207         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
   2208         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
   2209         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   2210         {
   2211             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
   2212         }
   2213         else
   2214             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
   2215     }
   2216 
   2217     ps_dec->u1_B = 0;
   2218     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
   2219     ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice);
   2220     if(ret != OK)
   2221         return ret;
   2222 //    ps_dec->curr_slice_in_error = 0 ;
   2223     return OK;
   2224 }
   2225