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