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             ret = ERROR_MB_ADDRESS_T;
    880             break;
    881         }
    882 
    883         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
    884         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
    885 
    886         ps_cur_mb_info->u1_Mux = 0;
    887         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
    888         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
    889 
    890         ps_cur_mb_info->u1_end_of_slice = 0;
    891 
    892         /* Storing Default partition info */
    893         ps_parse_mb_data->u1_num_part = 1;
    894         ps_parse_mb_data->u1_isI_mb = 0;
    895 
    896         /***************************************************************/
    897         /* Get the required information for decoding of MB             */
    898         /* mb_x, mb_y , neighbour availablity,                         */
    899         /***************************************************************/
    900         u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1);
    901 
    902         /*********************************************************************/
    903         /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */
    904         /*********************************************************************/
    905         ps_cur_mb_info->u1_tran_form8x8 = 0;
    906         ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0;
    907 
    908         /***************************************************************/
    909         /* Set the deblocking parameters for this MB                   */
    910         /***************************************************************/
    911         if(ps_dec->u4_app_disable_deblk_frm == 0)
    912             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
    913                                              ps_dec->u1_mb_ngbr_availablity,
    914                                              ps_dec->u1_cur_mb_fld_dec_flag);
    915 
    916         if(u4_mb_skip)
    917         {
    918 
    919             /* Set appropriate flags in ps_cur_mb_info and ps_dec */
    920             memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t));
    921             ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type;
    922 
    923             MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
    924 
    925             *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0;
    926             *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
    927 
    928             ps_dec->i1_prev_mb_qp_delta = 0;
    929             ps_cur_mb_info->u1_mb_type = MB_SKIP;
    930             ps_cur_mb_info->u1_cbp = 0;
    931 
    932             {
    933                 /* Storing Skip partition info */
    934                 parse_part_params_t *ps_part_info = ps_dec->ps_part;
    935                 ps_part_info->u1_is_direct = PART_DIRECT_16x16;
    936                 ps_part_info->u1_sub_mb_num = 0;
    937                 ps_dec->ps_part++;
    938             }
    939 
    940             /* Update Nnzs */
    941             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC);
    942 
    943             ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
    944             ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
    945             ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
    946 
    947         }
    948         else
    949         {
    950 
    951             /* Macroblock Layer Begins */
    952             /* Decode the u1_mb_type */
    953             u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec);
    954             ps_cur_mb_info->u1_mb_type = u1_mb_type;
    955             if(u1_mb_type > (25 + u1_mb_threshold))
    956                 return ERROR_MB_TYPE;
    957 
    958             /* Parse Macroblock Data */
    959             if(u1_mb_type < u1_mb_threshold)
    960             {
    961                 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
    962                 *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6;
    963 
    964                 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
    965                                           u1_num_mbsNby2);
    966                 if(ret != OK)
    967                     return ret;
    968                 ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
    969                 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
    970             }
    971             else
    972             {
    973                 /* Storing Intra partition info */
    974                 ps_parse_mb_data->u1_num_part = 0;
    975                 ps_parse_mb_data->u1_isI_mb = 1;
    976 
    977                 if((25 + u1_mb_threshold) == u1_mb_type)
    978                 {
    979                     /* I_PCM_MB */
    980                     ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
    981                     ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
    982                     if(ret != OK)
    983                         return ret;
    984                     ps_cur_deblk_mb->u1_mb_qp = 0;
    985                 }
    986                 else
    987                 {
    988                     if(u1_mb_type == u1_mb_threshold)
    989                         ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB;
    990                     else
    991                         ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB;
    992 
    993                     ret = ih264d_parse_imb_cabac(
    994                                     ps_dec, ps_cur_mb_info,
    995                                     (UWORD8)(u1_mb_type - u1_mb_threshold));
    996                     if(ret != OK)
    997                         return ret;
    998                     ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
    999                 }
   1000                 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
   1001 
   1002             }
   1003 
   1004         }
   1005 
   1006         if(u1_mbaff)
   1007         {
   1008             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1009         }
   1010         /* Next macroblock information */
   1011         i2_cur_mb_addr++;
   1012 
   1013         if(ps_cur_mb_info->u1_topmb && u1_mbaff)
   1014             uc_more_data_flag = 1;
   1015         else
   1016         {
   1017             uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env,
   1018                                                       ps_bitstrm);
   1019             uc_more_data_flag = !uc_more_data_flag;
   1020             COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag);
   1021         }
   1022 
   1023         u1_num_mbs++;
   1024         ps_dec->u2_total_mbs_coded++;
   1025         u1_num_mbsNby2++;
   1026         ps_parse_mb_data++;
   1027 
   1028         /****************************************************************/
   1029         /* Check for End Of Row and other flags that determine when to  */
   1030         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
   1031         /* N-Mb                                                         */
   1032         /****************************************************************/
   1033         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1034         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1035         u1_slice_end = !uc_more_data_flag;
   1036         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1037                         || u1_slice_end;
   1038         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
   1039         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1040         /*u1_dma_nby2mb   = u1_decode_nmb ||
   1041          (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
   1042 
   1043 //if(u1_dma_nby2mb)
   1044         if(u1_decode_nmb)
   1045         {
   1046 
   1047             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
   1048             u1_num_mbsNby2 = 0;
   1049 
   1050             {
   1051                 ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1052                 ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1053             }
   1054         }
   1055 
   1056         /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
   1057          ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
   1058          ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
   1059          H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d, u1_num_mbs: %d", u1_decode_nmb, u1_num_mbs);*/
   1060         if(u1_decode_nmb)
   1061         {
   1062 
   1063             if(ps_dec->u1_separate_parse)
   1064             {
   1065                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1066                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1067                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1068             }
   1069             else
   1070             {
   1071                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1072                                             u1_num_mbs_next, u1_tfr_n_mb,
   1073                                             u1_end_of_row);
   1074             }
   1075 
   1076             if(u1_tfr_n_mb)
   1077                 u1_num_mbs = 0;
   1078             u1_mb_idx = u1_num_mbs;
   1079             ps_dec->u1_mb_idx = u1_num_mbs;
   1080 
   1081         }
   1082     }
   1083 
   1084 
   1085     ps_dec->u4_num_mbs_cur_nmb = 0;
   1086     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1087 
   1088                         - (u2_first_mb_in_slice << u1_mbaff);
   1089 
   1090     return ret;
   1091 }
   1092 
   1093 /*****************************************************************************/
   1094 /*                                                                           */
   1095 /*  Function Name : ih264d_parse_inter_slice_data_cavlc                             */
   1096 /*                                                                           */
   1097 /*  Description   : This function parses cavlc syntax of a inter slice on    */
   1098 /*                  N MB basis.                                              */
   1099 /*                                                                           */
   1100 /*  Inputs        : ps_dec                                                   */
   1101 /*                  sliceparams                                              */
   1102 /*                  firstMbInSlice                                           */
   1103 /*                                                                           */
   1104 /*  Processing    : 1. After parsing syntax for N MBs those N MBs are        */
   1105 /*                     decoded till the end of slice.                        */
   1106 /*                  2. MV prediction and DMA happens on a N/2 MB basis.      */
   1107 /*                                                                           */
   1108 /*  Returns       : 0                                                        */
   1109 /*                                                                           */
   1110 /*  Issues        : <List any issues or problems with this function>         */
   1111 /*                                                                           */
   1112 /*  Revision History:                                                        */
   1113 /*                                                                           */
   1114 /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
   1115 /*         13 07 2002   Jay             Draft                                */
   1116 /*                                                                           */
   1117 /*****************************************************************************/
   1118 
   1119 WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec,
   1120                                            dec_slice_params_t * ps_slice,
   1121                                            UWORD16 u2_first_mb_in_slice)
   1122 {
   1123     UWORD32 uc_more_data_flag;
   1124     WORD32 i2_cur_mb_addr;
   1125     UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx;
   1126     UWORD32 i2_mb_skip_run;
   1127     UWORD32 u1_read_mb_type;
   1128 
   1129     UWORD32 u1_mbaff;
   1130     UWORD32 u1_num_mbs_next, u1_end_of_row;
   1131     const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
   1132     UWORD32 u1_slice_end = 0;
   1133     UWORD32 u1_tfr_n_mb = 0;
   1134     UWORD32 u1_decode_nmb = 0;
   1135 
   1136     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
   1137     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1138     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1139     deblk_mb_t *ps_cur_deblk_mb;
   1140     dec_mb_info_t *ps_cur_mb_info;
   1141     parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1142     UWORD32 u1_inter_mb_type;
   1143     UWORD32 u1_deblk_mb_type;
   1144     UWORD32 u1_mb_threshold;
   1145     WORD32 ret = OK;
   1146 
   1147     /******************************************************/
   1148     /* Initialisations specific to B or P slice           */
   1149     /******************************************************/
   1150 
   1151     if(ps_slice->u1_slice_type == P_SLICE)
   1152     {
   1153         u1_inter_mb_type = P_MB;
   1154         u1_deblk_mb_type = D_INTER_MB;
   1155         u1_mb_threshold = 5;
   1156     }
   1157     else // B_SLICE
   1158     {
   1159         u1_inter_mb_type = B_MB;
   1160         u1_deblk_mb_type = D_B_SLICE;
   1161         u1_mb_threshold = 23;
   1162     }
   1163     /******************************************************/
   1164     /* Slice Level Initialisations                        */
   1165     /******************************************************/
   1166     ps_dec->u1_qp = ps_slice->u1_slice_qp;
   1167     ih264d_update_qp(ps_dec, 0);
   1168     u1_mb_idx = ps_dec->u1_mb_idx;
   1169     u1_num_mbs = u1_mb_idx;
   1170 
   1171     u1_num_mbsNby2 = 0;
   1172     u1_mbaff = ps_slice->u1_mbaff_frame_flag;
   1173     i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff;
   1174     i2_mb_skip_run = 0;
   1175     uc_more_data_flag = 1;
   1176     u1_read_mb_type = 0;
   1177 
   1178     while(!u1_slice_end)
   1179     {
   1180         UWORD8 u1_mb_type;
   1181 
   1182         ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
   1183 
   1184         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
   1185         {
   1186             ret = ERROR_MB_ADDRESS_T;
   1187             break;
   1188         }
   1189 
   1190 
   1191         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
   1192         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
   1193 
   1194         ps_cur_mb_info->u1_Mux = 0;
   1195         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
   1196         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
   1197 
   1198         ps_cur_mb_info->u1_end_of_slice = 0;
   1199 
   1200         /* Storing Default partition info */
   1201         ps_parse_mb_data->u1_num_part = 1;
   1202         ps_parse_mb_data->u1_isI_mb = 0;
   1203 
   1204         if((!i2_mb_skip_run) && (!u1_read_mb_type))
   1205         {
   1206 
   1207             //Inlined ih264d_uev
   1208             UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
   1209             UWORD32 u4_word, u4_ldz;
   1210 
   1211             /***************************************************************/
   1212             /* Find leading zeros in next 32 bits                          */
   1213             /***************************************************************/
   1214             NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
   1215 
   1216             u4_ldz = CLZ(u4_word);
   1217 
   1218             /* Flush the ps_bitstrm */
   1219             u4_bitstream_offset += (u4_ldz + 1);
   1220             /* Read the suffix from the ps_bitstrm */
   1221             u4_word = 0;
   1222             if(u4_ldz)
   1223             {
   1224                 GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
   1225                         u4_ldz);
   1226             }
   1227             *pu4_bitstrm_ofst = u4_bitstream_offset;
   1228             i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1);
   1229             //Inlined ih264d_uev
   1230             COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run);
   1231             uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
   1232             u1_read_mb_type = uc_more_data_flag;
   1233         }
   1234 
   1235         /***************************************************************/
   1236         /* Get the required information for decoding of MB                  */
   1237         /* mb_x, mb_y , neighbour availablity,                              */
   1238         /***************************************************************/
   1239         ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1240 
   1241         /***************************************************************/
   1242         /* Set the deblocking parameters for this MB                   */
   1243         /***************************************************************/
   1244         if(ps_dec->u4_app_disable_deblk_frm == 0)
   1245             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
   1246                                              ps_dec->u1_mb_ngbr_availablity,
   1247                                              ps_dec->u1_cur_mb_fld_dec_flag);
   1248 
   1249         if(i2_mb_skip_run)
   1250         {
   1251             /* Set appropriate flags in ps_cur_mb_info and ps_dec */
   1252             ps_dec->i1_prev_mb_qp_delta = 0;
   1253             ps_dec->u1_sub_mb_num = 0;
   1254             ps_cur_mb_info->u1_mb_type = MB_SKIP;
   1255             ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
   1256             ps_cur_mb_info->u1_cbp = 0;
   1257 
   1258             {
   1259                 /* Storing Skip partition info */
   1260                 parse_part_params_t *ps_part_info = ps_dec->ps_part;
   1261                 ps_part_info->u1_is_direct = PART_DIRECT_16x16;
   1262                 ps_part_info->u1_sub_mb_num = 0;
   1263                 ps_dec->ps_part++;
   1264             }
   1265 
   1266             /* Update Nnzs */
   1267             ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
   1268 
   1269             ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
   1270             ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
   1271 
   1272             i2_mb_skip_run--;
   1273         }
   1274         else
   1275         {
   1276             u1_read_mb_type = 0;
   1277             /**************************************************************/
   1278             /* Macroblock Layer Begins, Decode the u1_mb_type                */
   1279             /**************************************************************/
   1280             {
   1281                 UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst;
   1282                 UWORD32 u4_word, u4_ldz, u4_temp;
   1283 
   1284 
   1285                 //Inlined ih264d_uev
   1286                 /***************************************************************/
   1287                 /* Find leading zeros in next 32 bits                          */
   1288                 /***************************************************************/
   1289                 NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf);
   1290                 u4_ldz = CLZ(u4_word);
   1291                 /* Flush the ps_bitstrm */
   1292                 u4_bitstream_offset += (u4_ldz + 1);
   1293                 /* Read the suffix from the ps_bitstrm */
   1294                 u4_word = 0;
   1295                 if(u4_ldz)
   1296                     GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf,
   1297                             u4_ldz);
   1298                 *pu4_bitstrm_ofst = u4_bitstream_offset;
   1299                 u4_temp = ((1 << u4_ldz) + u4_word - 1);
   1300                 //Inlined ih264d_uev
   1301                 if(u4_temp > (UWORD32)(25 + u1_mb_threshold))
   1302                     return ERROR_MB_TYPE;
   1303                 u1_mb_type = u4_temp;
   1304                 COPYTHECONTEXT("u1_mb_type", u1_mb_type);
   1305             }
   1306             ps_cur_mb_info->u1_mb_type = u1_mb_type;
   1307 
   1308             /**************************************************************/
   1309             /* Parse Macroblock data                                      */
   1310             /**************************************************************/
   1311             if(u1_mb_type < u1_mb_threshold)
   1312             {
   1313                 ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
   1314 
   1315                 ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs,
   1316                                           u1_num_mbsNby2);
   1317                 if(ret != OK)
   1318                     return ret;
   1319                 ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
   1320             }
   1321             else
   1322             {
   1323                 /* Storing Intra partition info */
   1324                 ps_parse_mb_data->u1_num_part = 0;
   1325                 ps_parse_mb_data->u1_isI_mb = 1;
   1326 
   1327                 if((25 + u1_mb_threshold) == u1_mb_type)
   1328                 {
   1329                     /* I_PCM_MB */
   1330                     ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB;
   1331                     ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs);
   1332                     if(ret != OK)
   1333                          return ret;
   1334                     ps_dec->u1_qp = 0;
   1335                 }
   1336                 else
   1337                 {
   1338                     ret = ih264d_parse_imb_cavlc(
   1339                                     ps_dec, ps_cur_mb_info, u1_num_mbs,
   1340                                     (UWORD8)(u1_mb_type - u1_mb_threshold));
   1341                     if(ret != OK)
   1342                         return ret;
   1343                 }
   1344 
   1345                 ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB;
   1346             }
   1347             uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm);
   1348         }
   1349         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
   1350 
   1351         if(u1_mbaff)
   1352         {
   1353             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1354         }
   1355         /**************************************************************/
   1356         /* Get next Macroblock address                                */
   1357         /**************************************************************/
   1358         i2_cur_mb_addr++;
   1359 
   1360         u1_num_mbs++;
   1361         ps_dec->u2_total_mbs_coded++;
   1362         u1_num_mbsNby2++;
   1363         ps_parse_mb_data++;
   1364 
   1365         /****************************************************************/
   1366         /* Check for End Of Row and other flags that determine when to  */
   1367         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
   1368         /* N-Mb                                                         */
   1369         /****************************************************************/
   1370         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1371         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1372         u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run));
   1373         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1374                         || u1_slice_end;
   1375         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
   1376         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1377 
   1378         /*u1_dma_nby2mb   = u1_decode_nmb ||
   1379          (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/
   1380 
   1381 //if(u1_dma_nby2mb)
   1382         if(u1_decode_nmb)
   1383         {
   1384             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
   1385             u1_num_mbsNby2 = 0;
   1386 
   1387             {
   1388                 ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1389                 ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1390             }
   1391         }
   1392 
   1393         /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d",
   1394          ps_slice->i4_poc >> ps_slice->u1_field_pic_flag,
   1395          ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb));
   1396          H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d", u1_decode_nmb);*/
   1397         if(u1_decode_nmb)
   1398         {
   1399 
   1400 
   1401 
   1402             if(ps_dec->u1_separate_parse)
   1403             {
   1404                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1405                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1406                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1407             }
   1408             else
   1409             {
   1410                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1411                                             u1_num_mbs_next, u1_tfr_n_mb,
   1412                                             u1_end_of_row);
   1413             }
   1414 
   1415             if(u1_tfr_n_mb)
   1416                 u1_num_mbs = 0;
   1417             u1_mb_idx = u1_num_mbs;
   1418             ps_dec->u1_mb_idx = u1_num_mbs;
   1419 
   1420         }
   1421 //ps_dec->ps_pred++;
   1422     }
   1423 
   1424     ps_dec->u4_num_mbs_cur_nmb = 0;
   1425     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1426                         - (u2_first_mb_in_slice << u1_mbaff);
   1427 
   1428 
   1429     return ret;
   1430 }
   1431 
   1432 WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,
   1433                                 WORD32 num_mb_skip,
   1434                                 UWORD8 u1_is_idr_slice,
   1435                                 UWORD16 u2_frame_num,
   1436                                 pocstruct_t *ps_cur_poc,
   1437                                 WORD32 prev_slice_err)
   1438 {
   1439     WORD32 i2_cur_mb_addr;
   1440     UWORD32 u1_num_mbs, u1_num_mbsNby2;
   1441     UWORD32 u1_mb_idx = ps_dec->u1_mb_idx;
   1442     UWORD32 i2_mb_skip_run;
   1443 
   1444     UWORD32 u1_num_mbs_next, u1_end_of_row;
   1445     const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs;
   1446     UWORD32 u1_slice_end;
   1447     UWORD32 u1_tfr_n_mb;
   1448     UWORD32 u1_decode_nmb;
   1449     dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
   1450     dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice;
   1451     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1452     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1453     deblk_mb_t *ps_cur_deblk_mb;
   1454     dec_mb_info_t *ps_cur_mb_info;
   1455     parse_pmbarams_t *ps_parse_mb_data;
   1456     UWORD32 u1_inter_mb_type;
   1457     UWORD32 u1_deblk_mb_type;
   1458     UWORD16 u2_total_mbs_coded;
   1459     UWORD32 u1_mbaff = ps_slice->u1_mbaff_frame_flag;
   1460     parse_part_params_t *ps_part_info;
   1461     WORD32 ret;
   1462 
   1463 
   1464     if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
   1465     {
   1466         ih264d_err_pic_dispbuf_mgr(ps_dec);
   1467         return 0;
   1468     }
   1469 
   1470     if(prev_slice_err == 1)
   1471     {
   1472         /* first slice - missing/header corruption */
   1473         ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
   1474 
   1475 
   1476         if(!ps_dec->u1_first_slice_in_stream)
   1477         {
   1478             ih264d_end_of_pic(ps_dec, u1_is_idr_slice,
   1479                 ps_dec->ps_cur_slice->u2_frame_num);
   1480             ps_dec->s_cur_pic_poc.u2_frame_num =
   1481                 ps_dec->ps_cur_slice->u2_frame_num;
   1482         }
   1483 
   1484         {
   1485             WORD32 i, j, poc = 0;
   1486 
   1487             ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0;
   1488 
   1489             ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
   1490             ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
   1491             ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
   1492 
   1493             if(ps_dec->ps_cur_pic != NULL)
   1494                 poc = ps_dec->ps_cur_pic->i4_poc + 2;
   1495 
   1496             j = 0;
   1497             for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
   1498                    if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
   1499                        j = i;
   1500             {
   1501                 ret = ih264d_start_of_pic(ps_dec, poc, ps_cur_poc,
   1502                         ps_dec->ps_cur_slice->u2_frame_num,
   1503                         &ps_dec->ps_pps[j]);
   1504 
   1505                 if(ret != OK)
   1506                 {
   1507                     return ret;
   1508                 }
   1509             }
   1510 
   1511             ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0;
   1512 
   1513             ps_dec->u4_output_present = 0;
   1514 
   1515             {
   1516                 ih264d_get_next_display_field(ps_dec,
   1517                                               ps_dec->ps_out_buffer,
   1518                                               &(ps_dec->s_disp_op));
   1519                 /* If error code is non-zero then there is no buffer available for display,
   1520                  hence avoid format conversion */
   1521 
   1522                 if(0 != ps_dec->s_disp_op.u4_error_code)
   1523                 {
   1524                     ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
   1525                 }
   1526                 else
   1527                     ps_dec->u4_output_present = 1;
   1528             }
   1529 
   1530             if(ps_dec->u1_separate_parse == 1)
   1531             {
   1532                 if(ps_dec->u4_dec_thread_created == 0)
   1533                 {
   1534                     ithread_create(ps_dec->pv_dec_thread_handle, NULL,
   1535                                    (void *)ih264d_decode_picture_thread,
   1536                                    (void *)ps_dec);
   1537 
   1538                     ps_dec->u4_dec_thread_created = 1;
   1539                 }
   1540 
   1541                 if((ps_dec->u4_num_cores == 3) &&
   1542                                 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
   1543                                 && (ps_dec->u4_bs_deblk_thread_created == 0))
   1544                 {
   1545                     ps_dec->u4_start_recon_deblk = 0;
   1546                     ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
   1547                                    (void *)ih264d_recon_deblk_thread,
   1548                                    (void *)ps_dec);
   1549                     ps_dec->u4_bs_deblk_thread_created = 1;
   1550                 }
   1551             }
   1552         }
   1553     }
   1554     else
   1555     {
   1556         // Middle / last slice
   1557 
   1558         dec_slice_struct_t *ps_parse_cur_slice;
   1559         ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num;
   1560 
   1561         if(ps_dec->u1_slice_header_done
   1562             && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
   1563         {
   1564             // Slice data corrupted
   1565             u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb;
   1566 
   1567             if(u1_num_mbs)
   1568             {
   1569                 ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1;
   1570             }
   1571             else
   1572             {
   1573                 if(ps_dec->u1_separate_parse)
   1574                 {
   1575                     ps_cur_mb_info = ps_dec->ps_nmb_info - 1;
   1576                 }
   1577                 else
   1578                 {
   1579                     ps_cur_mb_info = ps_dec->ps_nmb_info
   1580                             + ps_dec->u4_num_mbs_prev_nmb - 1;
   1581                 }
   1582             }
   1583 
   1584             ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
   1585             ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
   1586 
   1587             ps_dec->u1_mb_ngbr_availablity =
   1588                     ps_cur_mb_info->u1_mb_ngbr_availablity;
   1589 
   1590             // Going back 1 mb
   1591             ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data;
   1592             ps_dec->u2_cur_mb_addr--;
   1593             ps_dec->i4_submb_ofst -= SUB_BLK_SIZE;
   1594 
   1595             if(u1_num_mbs)
   1596             {
   1597                 // Parse/decode N-MB left unparsed
   1598                 if (ps_dec->u1_pr_sl_type == P_SLICE
   1599                         || ps_dec->u1_pr_sl_type == B_SLICE)
   1600                 {
   1601                     ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx,    u1_num_mbs);
   1602                     ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1603                 }
   1604 
   1605                 u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1606                 u1_end_of_row = (!u1_num_mbs_next)
   1607                         && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1608                 u1_slice_end = 1;
   1609                 u1_tfr_n_mb = 1;
   1610                 ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1611 
   1612                 if(ps_dec->u1_separate_parse)
   1613                 {
   1614                     ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1615                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1616                     ps_dec->ps_nmb_info += u1_num_mbs;
   1617                 }
   1618                 else
   1619                 {
   1620                     ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1621                             u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1622                 }
   1623 
   1624                 ps_dec->u1_mb_idx = 0;
   1625                 ps_dec->u4_num_mbs_cur_nmb = 0;
   1626             }
   1627 
   1628             if(ps_dec->u2_total_mbs_coded
   1629                     >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1630             {
   1631                 ps_dec->u1_pic_decode_done = 1;
   1632                 return 0;
   1633             }
   1634 
   1635             // Inserting new slice
   1636             ps_dec->u2_cur_slice_num++;
   1637              ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1638             ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1639             ps_dec->ps_parse_cur_slice++;
   1640 
   1641         }
   1642         else
   1643         {
   1644             // Slice missing / header corrupted
   1645             ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf
   1646                                             + ps_dec->u2_cur_slice_num;
   1647         }
   1648     }
   1649 
   1650     /******************************************************/
   1651     /* Initializations to new slice                       */
   1652     /******************************************************/
   1653     {
   1654         WORD32 num_entries;
   1655         WORD32 size;
   1656         UWORD8 *pu1_buf;
   1657 
   1658         num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
   1659         num_entries = 2 * ((2 * num_entries) + 1);
   1660 
   1661         size = num_entries * sizeof(void *);
   1662         size += PAD_MAP_IDX_POC * sizeof(void *);
   1663 
   1664         pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
   1665         pu1_buf += size * ps_dec->u2_cur_slice_num;
   1666         ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf;
   1667     }
   1668 
   1669     ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff;
   1670     if(ps_dec->ps_cur_slice->u1_field_pic_flag)
   1671         ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num;
   1672 
   1673     ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff;
   1674     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =    ps_dec->ps_cur_slice->u2_log2Y_crwd;
   1675 
   1676 
   1677     if(ps_dec->u1_separate_parse)
   1678     {
   1679         ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
   1680     }
   1681     else
   1682     {
   1683         ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
   1684     }
   1685 
   1686     /******************************************************/
   1687     /* Initializations specific to P slice                */
   1688     /******************************************************/
   1689     u1_inter_mb_type = P_MB;
   1690     u1_deblk_mb_type = D_INTER_MB;
   1691 
   1692     ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
   1693     ps_dec->ps_parse_cur_slice->slice_type = P_SLICE;
   1694     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
   1695     ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1696 
   1697     /******************************************************/
   1698     /* Parsing / decoding the slice                       */
   1699     /******************************************************/
   1700     ps_dec->u1_slice_header_done = 2;
   1701     ps_dec->u1_qp = ps_slice->u1_slice_qp;
   1702     ih264d_update_qp(ps_dec, 0);
   1703     u1_mb_idx = ps_dec->u1_mb_idx;
   1704     ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1705     u1_num_mbs = u1_mb_idx;
   1706 
   1707     u1_slice_end = 0;
   1708     u1_tfr_n_mb = 0;
   1709     u1_decode_nmb = 0;
   1710     u1_num_mbsNby2 = 0;
   1711     i2_cur_mb_addr = ps_dec->u2_total_mbs_coded;
   1712     i2_mb_skip_run = num_mb_skip;
   1713 
   1714     while(!u1_slice_end)
   1715     {
   1716         UWORD8 u1_mb_type;
   1717 
   1718         if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr)
   1719             break;
   1720 
   1721         ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs;
   1722         ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs;
   1723 
   1724         ps_cur_mb_info->u1_Mux = 0;
   1725         ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff);
   1726         ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs;
   1727 
   1728         ps_cur_mb_info->u1_end_of_slice = 0;
   1729 
   1730         /* Storing Default partition info */
   1731         ps_parse_mb_data->u1_num_part = 1;
   1732         ps_parse_mb_data->u1_isI_mb = 0;
   1733 
   1734         /**************************************************************/
   1735         /* Get the required information for decoding of MB            */
   1736         /**************************************************************/
   1737         /* mb_x, mb_y, neighbor availablity, */
   1738         if (u1_mbaff)
   1739             ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1740         else
   1741             ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run);
   1742 
   1743         /* Set the deblocking parameters for this MB */
   1744         if(ps_dec->u4_app_disable_deblk_frm == 0)
   1745         {
   1746             ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice,
   1747                                              ps_dec->u1_mb_ngbr_availablity,
   1748                                              ps_dec->u1_cur_mb_fld_dec_flag);
   1749         }
   1750 
   1751         /* Set appropriate flags in ps_cur_mb_info and ps_dec */
   1752         ps_dec->i1_prev_mb_qp_delta = 0;
   1753         ps_dec->u1_sub_mb_num = 0;
   1754         ps_cur_mb_info->u1_mb_type = MB_SKIP;
   1755         ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16;
   1756         ps_cur_mb_info->u1_cbp = 0;
   1757 
   1758         /* Storing Skip partition info */
   1759         ps_part_info = ps_dec->ps_part;
   1760         ps_part_info->u1_is_direct = PART_DIRECT_16x16;
   1761         ps_part_info->u1_sub_mb_num = 0;
   1762         ps_dec->ps_part++;
   1763 
   1764         /* Update Nnzs */
   1765         ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC);
   1766 
   1767         ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type;
   1768         ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type;
   1769 
   1770         i2_mb_skip_run--;
   1771 
   1772         ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp;
   1773 
   1774         if (u1_mbaff)
   1775         {
   1776             ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info);
   1777         }
   1778 
   1779         /**************************************************************/
   1780         /* Get next Macroblock address                                */
   1781         /**************************************************************/
   1782         i2_cur_mb_addr++;
   1783 
   1784         u1_num_mbs++;
   1785         ps_dec->u2_total_mbs_coded++;
   1786         u1_num_mbsNby2++;
   1787         ps_parse_mb_data++;
   1788 
   1789         /****************************************************************/
   1790         /* Check for End Of Row and other flags that determine when to  */
   1791         /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for   */
   1792         /* N-Mb                                                         */
   1793         /****************************************************************/
   1794         u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1;
   1795         u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01)));
   1796         u1_slice_end = !i2_mb_skip_run;
   1797         u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row
   1798                         || u1_slice_end;
   1799         u1_decode_nmb = u1_tfr_n_mb || u1_slice_end;
   1800         ps_cur_mb_info->u1_end_of_slice = u1_slice_end;
   1801 
   1802         if(u1_decode_nmb)
   1803         {
   1804             ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs);
   1805             u1_num_mbsNby2 = 0;
   1806 
   1807             ps_parse_mb_data = ps_dec->ps_parse_mb_data;
   1808             ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1809 
   1810             if(ps_dec->u1_separate_parse)
   1811             {
   1812                 ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs,
   1813                                      u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row);
   1814                 ps_dec->ps_nmb_info +=  u1_num_mbs;
   1815             }
   1816             else
   1817             {
   1818                 ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next,
   1819                                             u1_tfr_n_mb, u1_end_of_row);
   1820             }
   1821 
   1822             if(u1_tfr_n_mb)
   1823                 u1_num_mbs = 0;
   1824             u1_mb_idx = u1_num_mbs;
   1825             ps_dec->u1_mb_idx = u1_num_mbs;
   1826         }
   1827     }
   1828 
   1829     ps_dec->u4_num_mbs_cur_nmb = 0;
   1830     ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr
   1831                         - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice;
   1832 
   1833     H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice);
   1834 
   1835     ps_dec->u2_cur_slice_num++;
   1836 
   1837     /* incremented here only if first slice is inserted */
   1838     if(ps_dec->u4_first_slice_in_pic != 0)
   1839         ps_dec->ps_parse_cur_slice++;
   1840 
   1841     ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1842     ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1843 
   1844     if(ps_dec->u2_total_mbs_coded
   1845             >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1846     {
   1847         ps_dec->u1_pic_decode_done = 1;
   1848     }
   1849 
   1850     return 0;
   1851 
   1852 }
   1853 
   1854 /*!
   1855  **************************************************************************
   1856  * \if Function name : ih264d_decode_pslice \endif
   1857  *
   1858  * \brief
   1859  *    Decodes a P Slice
   1860  *
   1861  *
   1862  * \return
   1863  *    0 on Success and Error code otherwise
   1864  **************************************************************************
   1865  */
   1866 WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice)
   1867 {
   1868     dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps;
   1869     dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice;
   1870     dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm;
   1871     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1872     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1873     UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag;
   1874     UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
   1875 
   1876     UWORD32 u4_temp;
   1877     WORD32 i_temp;
   1878     WORD32 ret;
   1879 
   1880     /*--------------------------------------------------------------------*/
   1881     /* Read remaining contents of the slice header                        */
   1882     /*--------------------------------------------------------------------*/
   1883     {
   1884         WORD8 *pi1_buf;
   1885         WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv;
   1886         WORD32 *pi4_mv = (WORD32*)pi2_mv;
   1887         WORD16 *pi16_refFrame;
   1888 
   1889         pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame;
   1890         pi16_refFrame = (WORD16*)pi1_buf;
   1891         *pi4_mv = 0;
   1892         *(pi4_mv + 1) = 0;
   1893         *pi16_refFrame = OUT_OF_RANGE_REF;
   1894         ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1;
   1895         ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1;
   1896     }
   1897 
   1898     ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264(
   1899                     ps_bitstrm);
   1900 
   1901     COPYTHECONTEXT("SH: num_ref_idx_override_flag",
   1902                     ps_cur_slice->u1_num_ref_idx_active_override_flag);
   1903 
   1904     u4_temp = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0];
   1905     if(ps_cur_slice->u1_num_ref_idx_active_override_flag)
   1906     {
   1907         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + 1;
   1908     }
   1909 
   1910     {
   1911 
   1912 
   1913 
   1914         UWORD8 u1_max_ref_idx = MAX_FRAMES << u1_field_pic_flag;
   1915         if(u4_temp > u1_max_ref_idx)
   1916         {
   1917             return ERROR_NUM_REF;
   1918         }
   1919         ps_cur_slice->u1_num_ref_idx_lx_active[0] = u4_temp;
   1920         COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1",
   1921                         ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1);
   1922 
   1923     }
   1924 
   1925     {
   1926         UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm);
   1927         COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0);
   1928 
   1929         /* Initialize the Reference list once in Picture if the slice type    */
   1930         /* of first slice is between 5 to 9 defined in table 7.3 of standard  */
   1931         /* If picture contains both P & B slices then Initialize the Reference*/
   1932         /* List only when it switches from P to B and B to P                     */
   1933         {
   1934             UWORD8 init_idx_flg = (ps_dec->u1_pr_sl_type
   1935                             != ps_dec->ps_cur_slice->u1_slice_type);
   1936             if(ps_dec->u1_first_pb_nal_in_pic
   1937                             || (init_idx_flg & !ps_dec->u1_sl_typ_5_9)
   1938                             || ps_dec->u1_num_ref_idx_lx_active_prev
   1939                                             != ps_cur_slice->u1_num_ref_idx_lx_active[0])
   1940             {
   1941                 ih264d_init_ref_idx_lx_p(ps_dec);
   1942             }
   1943             if(ps_dec->u1_first_pb_nal_in_pic & ps_dec->u1_sl_typ_5_9)
   1944                 ps_dec->u1_first_pb_nal_in_pic = 0;
   1945         }
   1946         /* Store the value for future slices in the same picture */
   1947         ps_dec->u1_num_ref_idx_lx_active_prev =
   1948                         ps_cur_slice->u1_num_ref_idx_lx_active[0];
   1949 
   1950         /* Modified temporarily */
   1951         if(uc_refIdxReFlagL0)
   1952         {
   1953             WORD8 ret;
   1954             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
   1955             ret = ih264d_ref_idx_reordering(ps_dec, 0);
   1956             if(ret == -1)
   1957                 return ERROR_REFIDX_ORDER_T;
   1958             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0];
   1959         }
   1960         else
   1961             ps_dec->ps_ref_pic_buf_lx[0] =
   1962                             ps_dec->ps_dpb_mgr->ps_init_dpb[0];
   1963     }
   1964     /* Create refIdx to POC mapping */
   1965     {
   1966         void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1;
   1967         WORD8 idx;
   1968         struct pic_buffer_t *ps_pic;
   1969 
   1970         pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0;
   1971         pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1
   1972         pui_map_ref_idx_to_poc_lx0++;
   1973         for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
   1974         {
   1975             ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
   1976             pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1);
   1977         }
   1978 
   1979         /* Bug Fix Deblocking */
   1980         pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
   1981         pui_map_ref_idx_to_poc_lx1[0] = 0;
   1982 
   1983         if(u1_mbaff)
   1984         {
   1985             void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b;
   1986             void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1;
   1987             ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc
   1988                             + TOP_LIST_FLD_L0;
   1989             ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc
   1990                             + BOT_LIST_FLD_L0;
   1991 
   1992             ppv_map_ref_idx_to_poc_lx_t[0] = 0; //  For ref_idx = -1
   1993             ppv_map_ref_idx_to_poc_lx_t++;
   1994             ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1
   1995             ppv_map_ref_idx_to_poc_lx_b++;
   1996 
   1997             idx = 0;
   1998             for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++)
   1999             {
   2000                 ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx];
   2001                 ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1);
   2002                 ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1);
   2003 
   2004                 ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1;
   2005                 ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1;
   2006 
   2007                 ppv_map_ref_idx_to_poc_lx_t += 2;
   2008                 ppv_map_ref_idx_to_poc_lx_b += 2;
   2009             }
   2010             ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc
   2011                             + TOP_LIST_FLD_L1;
   2012             ppv_map_ref_idx_to_poc_lx_t1[0] = 0;
   2013             ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc
   2014                             + BOT_LIST_FLD_L1;
   2015             ppv_map_ref_idx_to_poc_lx_b1[0] = 0;
   2016 
   2017         }
   2018 
   2019         if(ps_dec->u4_num_cores >= 3)
   2020         {
   2021             WORD32 num_entries;
   2022             WORD32 size;
   2023 
   2024             num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
   2025             num_entries = 2 * ((2 * num_entries) + 1);
   2026 
   2027             size = num_entries * sizeof(void *);
   2028             size += PAD_MAP_IDX_POC * sizeof(void *);
   2029 
   2030             memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
   2031                    ps_dec->ppv_map_ref_idx_to_poc,
   2032                    size);
   2033         }
   2034 
   2035 
   2036     }
   2037     if(ps_pps->u1_wted_pred_flag)
   2038     {
   2039         ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm);
   2040         if(ret != OK)
   2041             return ret;
   2042         ih264d_form_pred_weight_matrix(ps_dec);
   2043         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
   2044     }
   2045     else
   2046     {
   2047         ps_dec->ps_cur_slice->u2_log2Y_crwd = 0;
   2048         ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
   2049     }
   2050 
   2051     ps_dec->ps_parse_cur_slice->u2_log2Y_crwd =
   2052                     ps_dec->ps_cur_slice->u2_log2Y_crwd;
   2053 
   2054     if(u1_mbaff && (u1_field_pic_flag == 0))
   2055     {
   2056         ih264d_convert_frm_mbaff_list(ps_dec);
   2057     }
   2058 
   2059     /* G050 */
   2060     if(ps_cur_slice->u1_nal_ref_idc != 0)
   2061     {
   2062         if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
   2063             ps_dec->u4_bitoffset = ih264d_read_mmco_commands(ps_dec);
   2064         else
   2065             ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset;
   2066 
   2067     }
   2068     /* G050 */
   2069 
   2070     if(ps_pps->u1_entropy_coding_mode == CABAC)
   2071     {
   2072         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2073 
   2074         if(u4_temp > MAX_CABAC_INIT_IDC)
   2075         {
   2076             return ERROR_INV_SLICE_HDR_T;
   2077         }
   2078         ps_cur_slice->u1_cabac_init_idc = u4_temp;
   2079         COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc);
   2080     }
   2081 
   2082     /* Read slice_qp_delta */
   2083     i_temp = ps_pps->u1_pic_init_qp
   2084                     + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2085     if((i_temp < 0) || (i_temp > 51))
   2086     {
   2087         return ERROR_INV_RANGE_QP_T;
   2088     }
   2089     ps_cur_slice->u1_slice_qp = i_temp;
   2090     COPYTHECONTEXT("SH: slice_qp_delta",
   2091                     (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp));
   2092 
   2093     if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1)
   2094     {
   2095         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   2096         if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED)
   2097         {
   2098             return ERROR_INV_SLICE_HDR_T;
   2099         }
   2100 
   2101         COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp);
   2102         ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp;
   2103         if(u4_temp != 1)
   2104         {
   2105             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   2106                             << 1;
   2107             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   2108             {
   2109                 return ERROR_INV_SLICE_HDR_T;
   2110             }
   2111             ps_cur_slice->i1_slice_alpha_c0_offset = i_temp;
   2112             COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2",
   2113                             ps_cur_slice->i1_slice_alpha_c0_offset >> 1);
   2114 
   2115             i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf)
   2116                             << 1;
   2117             if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF))
   2118             {
   2119                 return ERROR_INV_SLICE_HDR_T;
   2120             }
   2121             ps_cur_slice->i1_slice_beta_offset = i_temp;
   2122             COPYTHECONTEXT("SH: slice_beta_offset_div2",
   2123                             ps_cur_slice->i1_slice_beta_offset >> 1);
   2124         }
   2125         else
   2126         {
   2127             ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   2128             ps_cur_slice->i1_slice_beta_offset = 0;
   2129         }
   2130     }
   2131     else
   2132     {
   2133         ps_cur_slice->u1_disable_dblk_filter_idc = 0;
   2134         ps_cur_slice->i1_slice_alpha_c0_offset = 0;
   2135         ps_cur_slice->i1_slice_beta_offset = 0;
   2136     }
   2137 
   2138     ps_dec->u1_slice_header_done = 2;
   2139 
   2140     if(ps_pps->u1_entropy_coding_mode)
   2141     {
   2142         SWITCHOFFTRACE; SWITCHONTRACECABAC;
   2143         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac;
   2144         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac;
   2145         ih264d_init_cabac_contexts(P_SLICE, ps_dec);
   2146 
   2147         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   2148             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff;
   2149         else
   2150             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff;
   2151     }
   2152     else
   2153     {
   2154         SWITCHONTRACE; SWITCHOFFTRACECABAC;
   2155         ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc;
   2156         ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc;
   2157         if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
   2158         {
   2159             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff;
   2160         }
   2161         else
   2162             ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff;
   2163     }
   2164 
   2165     ps_dec->u1_B = 0;
   2166     ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb;
   2167     ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice);
   2168     if(ret != OK)
   2169         return ret;
   2170 //    ps_dec->curr_slice_in_error = 0 ;
   2171     return OK;
   2172 }
   2173