Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 /*!
     21  **************************************************************************
     22  * \file ih264d_parse_slice.c
     23  *
     24  * \brief
     25  *    Contains routines that decodes a slice NAL unit
     26  *
     27  * \date
     28  *    19/12/2002
     29  *
     30  * \author  AI
     31  **************************************************************************
     32  */
     33 #include <string.h>
     34 #include "ih264_typedefs.h"
     35 #include "ih264_macros.h"
     36 #include "ih264_platform_macros.h"
     37 #include "ithread.h"
     38 #include "ih264d_structs.h"
     39 #include "ih264d_debug.h"
     40 #include "ih264d_bitstrm.h"
     41 #include "ih264d_parse_mb_header.h"
     42 #include "ih264d_process_bslice.h"
     43 #include "ih264d_process_pslice.h"
     44 #include "ih264d_parse_cavlc.h"
     45 #include "ih264d_utils.h"
     46 #include "ih264d_deblocking.h"
     47 #include "ih264d_defs.h"
     48 #include "ih264d_error_handler.h"
     49 #include "ih264d_tables.h"
     50 #include "ih264d_defs.h"
     51 #include "ih264d_mem_request.h"
     52 #include "ih264d_parse_islice.h"
     53 #include "ih264d_parse_slice.h"
     54 #include "ih264d_mvpred.h"
     55 #include "ih264d_mb_utils.h"
     56 
     57 #include "ih264d_defs.h"
     58 #include "ih264d_quant_scaling.h"
     59 
     60 #include "ih264d_inter_pred.h"
     61 
     62 #include "ih264d_sei.h"
     63 #include "ih264d.h"
     64 #include "ih264_error.h"
     65 #include "ih264_disp_mgr.h"
     66 #include "ih264_buf_mgr.h"
     67 
     68 #include "ih264d_thread_parse_decode.h"
     69 #include "ih264d_thread_compute_bs.h"
     70 #include "ih264d_dpb_manager.h"
     71 #include <assert.h>
     72 #include "ih264d_parse_islice.h"
     73 #define RET_LAST_SKIP  0x80000000
     74 
     75 WORD32 check_app_out_buf_size(dec_struct_t *ps_dec);
     76 /*!
     77  **************************************************************************
     78  * \if Function name : ih264d_form_pred_weight_matrix \endif
     79  *
     80  * \brief
     81  *    Forms pred weight matrix.
     82  *
     83  * \return
     84  *    None
     85  *
     86  **************************************************************************
     87  */
     88 
     89 void ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec)
     90 {
     91     dec_slice_params_t *ps_cur_slice;
     92     UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active;
     93     UWORD8 i, j;
     94     UWORD32 *pu4_mat_iwt_ofst;
     95     UWORD16 i2_idx;
     96     UWORD32 *pui32_weight_offset_l0, *pui32_weight_offset_l1;
     97     UWORD32 u4_temp;
     98 
     99     ps_cur_slice = ps_dec->ps_cur_slice;
    100     uc_num_ref_idx_l0_active = ps_cur_slice->u1_num_ref_idx_lx_active[0];
    101     uc_num_ref_idx_l1_active = ps_cur_slice->u1_num_ref_idx_lx_active[1];
    102 
    103     pu4_mat_iwt_ofst = ps_dec->pu4_wts_ofsts_mat;
    104 
    105     if(ps_cur_slice->u1_slice_type == B_SLICE)
    106     {
    107         for(i = 0; i < uc_num_ref_idx_l0_active; i++)
    108         {
    109             pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
    110             for(j = 0; j < uc_num_ref_idx_l1_active; j++)
    111             {
    112                 pui32_weight_offset_l1 = ps_cur_slice->u4_wt_ofst_lx[1][j];
    113                 i2_idx = i * uc_num_ref_idx_l0_active + j;
    114                 i2_idx = X3(i2_idx);
    115                 /*        u4_temp = (pui32_weight_offset_l0[0] | (pui32_weight_offset_l1[0] << 16));
    116                  pu4_mat_iwt_ofst[0] = u4_temp;
    117                  u4_temp = (pui32_weight_offset_l0[1] | (pui32_weight_offset_l1[1] << 16));
    118                  pu4_mat_iwt_ofst[1] = u4_temp;
    119                  u4_temp = (pui32_weight_offset_l0[2] | (pui32_weight_offset_l1[2] << 16));
    120                  pu4_mat_iwt_ofst[2] = u4_temp;
    121                  pu4_mat_iwt_ofst += 3;*/
    122                 pu4_mat_iwt_ofst[0] = pui32_weight_offset_l0[0];
    123                 pu4_mat_iwt_ofst[1] = pui32_weight_offset_l1[0];
    124                 pu4_mat_iwt_ofst[2] = pui32_weight_offset_l0[1];
    125                 pu4_mat_iwt_ofst[3] = pui32_weight_offset_l1[1];
    126                 pu4_mat_iwt_ofst[4] = pui32_weight_offset_l0[2];
    127                 pu4_mat_iwt_ofst[5] = pui32_weight_offset_l1[2];
    128                 pu4_mat_iwt_ofst += 6;
    129             }
    130         }
    131     }
    132     else
    133     {
    134         for(i = 0; i < uc_num_ref_idx_l0_active; i++)
    135         {
    136             pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
    137             i2_idx = X3(i);
    138             u4_temp = (UWORD32)pui32_weight_offset_l0[0];
    139             pu4_mat_iwt_ofst[0] = u4_temp;
    140             u4_temp = (UWORD32)pui32_weight_offset_l0[1];
    141             pu4_mat_iwt_ofst[2] = u4_temp;
    142             u4_temp = (UWORD32)pui32_weight_offset_l0[2];
    143             pu4_mat_iwt_ofst[4] = u4_temp;
    144             pu4_mat_iwt_ofst += 6;
    145         }
    146     }
    147 }
    148 
    149 
    150 /*!
    151  **************************************************************************
    152  * \if Function name :  init_firstSliceParam \endif
    153  *
    154  * \brief
    155  *    Initialize the Parameter required for all the slices for a picture
    156  *
    157  * \return           : Nothing
    158  *
    159  **************************************************************************
    160  */
    161 
    162 WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
    163                          WORD32 i4_poc,
    164                          pocstruct_t *ps_temp_poc,
    165                          UWORD16 u2_frame_num,
    166                          dec_pic_params_t *ps_pps)
    167 {
    168     pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc;
    169     pocstruct_t *ps_cur_poc = ps_temp_poc;
    170 
    171     pic_buffer_t *pic_buf;
    172 
    173     ivd_video_decode_op_t * ps_dec_output =
    174                     (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
    175     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
    176     dec_seq_params_t *ps_seq = ps_pps->ps_sps;
    177     UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
    178     UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
    179     /* high profile related declarations */
    180     high_profile_tools_t s_high_profile;
    181     WORD32 ret;
    182 
    183     H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
    184 
    185     /* check output buffer size given by the application */
    186     if(check_app_out_buf_size(ps_dec) != IV_SUCCESS)
    187         return IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
    188 
    189     ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
    190     ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
    191     ps_prev_poc->i4_delta_pic_order_cnt_bottom =
    192                     ps_cur_poc->i4_delta_pic_order_cnt_bottom;
    193     ps_prev_poc->i4_delta_pic_order_cnt[0] =
    194                     ps_cur_poc->i4_delta_pic_order_cnt[0];
    195     ps_prev_poc->i4_delta_pic_order_cnt[1] =
    196                     ps_cur_poc->i4_delta_pic_order_cnt[1];
    197     ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag;
    198     ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
    199     ps_prev_poc->u2_frame_num = u2_frame_num;
    200     ps_dec->i1_prev_mb_qp_delta = 0;
    201     ps_dec->i1_next_ctxt_idx = 0;
    202 
    203 
    204     ps_dec->u4_nmb_deblk = 0;
    205     if(ps_dec->u4_num_cores == 1)
    206        ps_dec->u4_nmb_deblk = 1;
    207 
    208 
    209 
    210     if(ps_seq->u1_mb_aff_flag == 1)
    211     {
    212         ps_dec->u4_nmb_deblk = 0;
    213         if(ps_dec->u4_num_cores > 2)
    214             ps_dec->u4_num_cores = 2;
    215     }
    216 
    217         ps_dec->u4_use_intrapred_line_copy = 0;
    218 
    219 
    220 
    221     if (ps_seq->u1_mb_aff_flag == 0)
    222     {
    223         ps_dec->u4_use_intrapred_line_copy = 1;
    224     }
    225 
    226     ps_dec->u4_app_disable_deblk_frm = 0;
    227     /* If degrade is enabled, set the degrade flags appropriately */
    228     if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics)
    229     {
    230         WORD32 degrade_pic;
    231         ps_dec->i4_degrade_pic_cnt++;
    232         degrade_pic = 0;
    233 
    234         /* If degrade is to be done in all frames, then do not check further */
    235         switch(ps_dec->i4_degrade_pics)
    236         {
    237             case 4:
    238             {
    239                 degrade_pic = 1;
    240                 break;
    241             }
    242             case 3:
    243             {
    244                 if(ps_cur_slice->u1_slice_type != I_SLICE)
    245                     degrade_pic = 1;
    246 
    247                 break;
    248             }
    249             case 2:
    250             {
    251 
    252                 /* If pic count hits non-degrade interval or it is an islice, then do not degrade */
    253                 if((ps_cur_slice->u1_slice_type != I_SLICE)
    254                                 && (ps_dec->i4_degrade_pic_cnt
    255                                                 != ps_dec->i4_nondegrade_interval))
    256                     degrade_pic = 1;
    257 
    258                 break;
    259             }
    260             case 1:
    261             {
    262                 /* Check if the current picture is non-ref */
    263                 if(0 == ps_cur_slice->u1_nal_ref_idc)
    264                 {
    265                     degrade_pic = 1;
    266                 }
    267                 break;
    268             }
    269 
    270         }
    271         if(degrade_pic)
    272         {
    273             if(ps_dec->i4_degrade_type & 0x2)
    274                 ps_dec->u4_app_disable_deblk_frm = 1;
    275 
    276             /* MC degrading is done only for non-ref pictures */
    277             if(0 == ps_cur_slice->u1_nal_ref_idc)
    278             {
    279                 if(ps_dec->i4_degrade_type & 0x4)
    280                     ps_dec->i4_mv_frac_mask = 0;
    281 
    282                 if(ps_dec->i4_degrade_type & 0x8)
    283                     ps_dec->i4_mv_frac_mask = 0;
    284             }
    285         }
    286         else
    287             ps_dec->i4_degrade_pic_cnt = 0;
    288     }
    289 
    290     {
    291         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
    292         if((ps_cur_slice->u1_slice_type == I_SLICE)
    293                         || (ps_cur_slice->u1_slice_type == SI_SLICE))
    294             ps_err->u1_cur_pic_type = PIC_TYPE_I;
    295         else
    296             ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
    297 
    298         if(ps_err->u1_pic_aud_i == PIC_TYPE_I)
    299         {
    300             ps_err->u1_cur_pic_type = PIC_TYPE_I;
    301             ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
    302         }
    303 
    304         if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
    305         {
    306             if(ps_err->u1_err_flag)
    307                 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
    308             ps_err->u1_err_flag = ACCEPT_ALL_PICS;
    309         }
    310     }
    311 
    312     if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending)
    313     {
    314         /* Reset the decoder picture buffers */
    315         WORD32 j;
    316         for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
    317         {
    318 
    319             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    320                                   j,
    321                                   BUF_MGR_REF);
    322             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
    323                                   ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
    324                                   BUF_MGR_REF);
    325             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    326                                   j,
    327                                   BUF_MGR_IO);
    328         }
    329 
    330         /* reset the decoder structure parameters related to buffer handling */
    331         ps_dec->u1_second_field = 0;
    332         ps_dec->i4_cur_display_seq = 0;
    333 
    334         /********************************************************************/
    335         /* indicate in the decoder output i4_status that some frames are being */
    336         /* dropped, so that it resets timestamp and wait for a new sequence */
    337         /********************************************************************/
    338 
    339         ps_dec->s_prev_seq_params.u1_eoseq_pending = 0;
    340     }
    341     ret = ih264d_init_pic(ps_dec, u2_frame_num, i4_poc, ps_pps);
    342     if(ret != OK)
    343         return ret;
    344 
    345     ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
    346     ps_dec->pv_proc_tu_coeff_data  = ps_dec->pv_pic_tu_coeff_data;
    347     ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info;
    348     if(ps_dec->u1_separate_parse)
    349     {
    350         UWORD16 pic_wd;
    351         UWORD16 pic_ht;
    352         UWORD32 num_mbs;
    353 
    354         pic_wd = ps_dec->u2_pic_wd;
    355         pic_ht = ps_dec->u2_pic_ht;
    356         num_mbs = (pic_wd * pic_ht) >> 8;
    357 
    358         if(ps_dec->pu1_dec_mb_map)
    359         {
    360             memset((void *)ps_dec->pu1_dec_mb_map, 0, num_mbs);
    361         }
    362 
    363         if(ps_dec->pu1_recon_mb_map)
    364         {
    365 
    366             memset((void *)ps_dec->pu1_recon_mb_map, 0, num_mbs);
    367         }
    368 
    369         if(ps_dec->pu2_slice_num_map)
    370         {
    371             memset((void *)ps_dec->pu2_slice_num_map, 0,
    372                    (num_mbs * sizeof(UWORD16)));
    373         }
    374 
    375     }
    376 
    377     ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
    378     ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
    379     ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
    380     ps_dec->u2_cur_slice_num = 0;
    381 
    382     /* Initialize all the HP toolsets to zero */
    383     ps_dec->s_high_profile.u1_scaling_present = 0;
    384     ps_dec->s_high_profile.u1_transform8x8_present = 0;
    385 
    386     /* Get Next Free Picture */
    387     if(1 == ps_dec->u4_share_disp_buf)
    388     {
    389         UWORD32 i;
    390         /* Free any buffer that is in the queue to be freed */
    391         for(i = 0; i < MAX_DISP_BUFS_NEW; i++)
    392         {
    393             if(0 == ps_dec->u4_disp_buf_to_be_freed[i])
    394                 continue;
    395             ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i,
    396             BUF_MGR_IO);
    397             ps_dec->u4_disp_buf_to_be_freed[i] = 0;
    398             ps_dec->u4_disp_buf_mapping[i] = 0;
    399 
    400         }
    401     }
    402     if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded)) //ps_dec->u1_second_field))
    403     {
    404         pic_buffer_t *ps_cur_pic;
    405         WORD32 cur_pic_buf_id, cur_mv_buf_id;
    406         col_mv_buf_t *ps_col_mv;
    407         while(1)
    408         {
    409             ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
    410                             (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    411                             &cur_pic_buf_id);
    412             if(ps_cur_pic == NULL)
    413             {
    414                 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
    415                 return ERROR_UNAVAIL_PICBUF_T;
    416             }
    417             if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id])
    418             {
    419                 break;
    420             }
    421 
    422         }
    423         ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
    424                                                                &cur_mv_buf_id);
    425         if(ps_col_mv == NULL)
    426         {
    427             ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
    428             return ERROR_UNAVAIL_MVBUF_T;
    429         }
    430 
    431         ps_dec->ps_cur_pic = ps_cur_pic;
    432         ps_dec->u1_pic_buf_id = cur_pic_buf_id;
    433         ps_cur_pic->u4_ts = ps_dec->u4_ts;
    434 
    435 
    436         ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
    437         ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
    438 
    439         ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
    440         ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
    441         ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
    442 
    443         {
    444             /*make first entry of list0 and list1 point to cur pic,
    445              *so that if first slice is in error, ref pic struct will have valid entries*/
    446             ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
    447             ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1];
    448             *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
    449             /* Initialize for field reference as well */
    450             *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
    451 
    452             *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][0]) = *ps_cur_pic;
    453             /* Initialize for field reference as well */
    454             *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
    455             *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][0]) = *ps_cur_pic;
    456             /* Initialize for field reference as well */
    457             *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
    458             *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][0]) = *ps_cur_pic;
    459             /* Initialize for field reference as well */
    460             *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
    461         }
    462 
    463         if(!ps_dec->ps_cur_pic)
    464         {
    465             WORD32 j;
    466             H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n");
    467             for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
    468             {
    469 
    470                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    471                                       j,
    472                                       BUF_MGR_REF);
    473                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
    474                                       ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
    475                                       BUF_MGR_REF);
    476                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    477                                       j,
    478                                       BUF_MGR_IO);
    479             }
    480 
    481             ps_dec->i4_cur_display_seq = 0;
    482             ps_dec->i4_prev_max_display_seq = 0;
    483             ps_dec->i4_max_poc = 0;
    484 
    485             ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
    486                             (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    487                             &cur_pic_buf_id);
    488             if(ps_cur_pic == NULL)
    489             {
    490                 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
    491                 return ERROR_UNAVAIL_PICBUF_T;
    492             }
    493 
    494             ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
    495                                                                    &cur_mv_buf_id);
    496             if(ps_col_mv == NULL)
    497             {
    498                 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
    499                 return ERROR_UNAVAIL_MVBUF_T;
    500             }
    501 
    502             ps_dec->ps_cur_pic = ps_cur_pic;
    503             ps_dec->u1_pic_buf_id = cur_pic_buf_id;
    504             ps_cur_pic->u4_ts = ps_dec->u4_ts;
    505             ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic;
    506 
    507             ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
    508             ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
    509 
    510             ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
    511             ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
    512             ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
    513 
    514         }
    515 
    516         ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag;
    517         ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE;
    518         H264_DEC_DEBUG_PRINT("got a buffer\n");
    519     }
    520     else
    521     {
    522         H264_DEC_DEBUG_PRINT("did not get a buffer\n");
    523     }
    524 
    525     ps_dec->u4_pic_buf_got = 1;
    526 
    527     ps_dec->ps_cur_pic->i4_poc = i4_poc;
    528     ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num;
    529     ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num;
    530     ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt;
    531     ps_dec->ps_cur_pic->i4_bottom_field_order_cnt =
    532                     ps_pps->i4_bottom_field_order_cnt;
    533     ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc;
    534     ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts;
    535 
    536     ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic);
    537     if(u1_field_pic_flag && u1_bottom_field_flag)
    538     {
    539         WORD32 i4_temp_poc;
    540         WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
    541         /* Point to odd lines, since it's bottom field */
    542         ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y;
    543         ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv;
    544         ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv;
    545         ps_dec->s_cur_pic.ps_mv +=
    546                         ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
    547         ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht
    548                         * ps_dec->u2_pic_wd) >> 5);
    549         ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD;
    550         i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
    551         i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
    552         i4_temp_poc = MIN(i4_top_field_order_poc,
    553                                  i4_bot_field_order_poc);
    554         ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
    555     }
    556 
    557     ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
    558                     && (!u1_field_pic_flag);
    559 
    560     ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag
    561                     << 2);
    562 
    563     ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0];
    564     //Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be valid
    565     ps_dec->ps_cur_mb_row += 2;
    566     ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
    567     ps_dec->ps_top_mb_row += ((ps_dec->u2_frm_wd_in_mbs + 2) << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
    568     //Increment by 2 ,so that left mb (mbaff decrements by 2)  will always be valid
    569     ps_dec->ps_top_mb_row += 2;
    570 
    571     /* CHANGED CODE */
    572     ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
    573     ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
    574     /* CHANGED CODE */
    575     ps_dec->u1_mv_top_p = 0;
    576     ps_dec->u1_mb_idx = 0;
    577     /* CHANGED CODE */
    578     ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
    579     ps_dec->u2_total_mbs_coded = 0;
    580     ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE);
    581     ps_dec->u4_pred_info_idx = 0;
    582     ps_dec->u4_pred_info_pkd_idx = 0;
    583     ps_dec->u4_dma_buf_idx = 0;
    584     ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
    585     ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
    586     ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
    587     ps_dec->ps_part = ps_dec->ps_parse_part_params;
    588     ps_dec->i2_prev_slice_mbx = -1;
    589     ps_dec->i2_prev_slice_mby = 0;
    590     ps_dec->u2_mv_2mb[0] = 0;
    591     ps_dec->u2_mv_2mb[1] = 0;
    592     ps_dec->u1_last_pic_not_decoded = 0;
    593 
    594     ps_dec->u2_cur_slice_num_dec_thread = 0;
    595     ps_dec->u2_cur_slice_num_bs = 0;
    596     ps_dec->u4_intra_pred_line_ofst = 0;
    597     ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line;
    598     ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line;
    599     ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line;
    600 
    601     ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line;
    602     ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line;
    603     ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line;
    604 
    605 
    606 
    607 
    608 
    609     ps_dec->pu1_prev_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line
    610                     + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE);
    611 
    612     ps_dec->pu1_prev_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line
    613                     + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR;
    614     ps_dec->pu1_prev_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line
    615                     + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE;
    616 
    617     ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
    618     /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */
    619     {
    620         if(ps_cur_slice->u1_mbaff_frame_flag)
    621         {
    622             ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff;
    623             ps_dec->pf_mvpred = ih264d_mvpred_mbaff;
    624         }
    625         else
    626         {
    627             ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff;
    628             ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
    629         }
    630     }
    631     /* Set up the Parameter for DMA transfer */
    632     {
    633         UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
    634 
    635         UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag;
    636 
    637         UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4)
    638                         % (ps_dec->u1_recon_mb_grp >> u1_mbaff));
    639         UWORD16 ui16_lastmbs_widthY =
    640                         (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u1_recon_mb_grp
    641                                         >> u1_mbaff) << 4));
    642         UWORD16 ui16_lastmbs_widthUV =
    643                         uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp
    644                                         >> u1_mbaff) << 3);
    645 
    646         ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
    647         ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
    648         ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
    649 
    650         ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y
    651                         << u1_field_pic_flag;
    652         ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv
    653                         << u1_field_pic_flag;
    654 
    655         if(u1_field_pic_flag)
    656         {
    657             ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y;
    658             ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv;
    659         }
    660 
    661         /* Normal Increment of Pointer */
    662         ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4)
    663                         >> u1_mbaff);
    664         ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4)
    665                         >> u1_mbaff);
    666 
    667         /* End of Row Increment */
    668         ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY
    669                         + (PAD_LEN_Y_H << 1)
    670                         + ps_dec->s_tran_addrecon.u2_frm_wd_y
    671                                         * ((15 << u1_mbaff) + u1_mbaff));
    672         ps_dec->s_tran_addrecon.u4_inc_uv[1] = (ui16_lastmbs_widthUV
    673                         + (PAD_LEN_UV_H << 2)
    674                         + ps_dec->s_tran_addrecon.u2_frm_wd_uv
    675                                         * ((15 << u1_mbaff) + u1_mbaff));
    676 
    677         /* Assign picture numbers to each frame/field  */
    678         /* only once per picture.                      */
    679         ih264d_assign_pic_num(ps_dec);
    680         ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (ps_dec->u1_recon_mb_grp
    681                         << 2) - 1 - (u1_mbaff << 2);
    682         ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u1_recon_mb_grp
    683                         >> u1_mbaff) - 1) << (4 + u1_mbaff);
    684     }
    685     /**********************************************************************/
    686     /* High profile related initialization at pictrue level               */
    687     /**********************************************************************/
    688     if(ps_seq->u1_profile_idc == HIGH_PROFILE_IDC)
    689     {
    690         if((ps_seq->i4_seq_scaling_matrix_present_flag)
    691                         || (ps_pps->i4_pic_scaling_matrix_present_flag))
    692         {
    693             ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec);
    694             ps_dec->s_high_profile.u1_scaling_present = 1;
    695         }
    696         else
    697         {
    698             ih264d_form_default_scaling_matrix(ps_dec);
    699         }
    700 
    701         if(ps_pps->i4_transform_8x8_mode_flag)
    702         {
    703             ps_dec->s_high_profile.u1_transform8x8_present = 1;
    704         }
    705     }
    706     else
    707     {
    708         ih264d_form_default_scaling_matrix(ps_dec);
    709     }
    710 
    711     /* required while reading the transform_size_8x8 u4_flag */
    712     ps_dec->s_high_profile.u1_direct_8x8_inference_flag =
    713                     ps_seq->u1_direct_8x8_inference_flag;
    714     ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt;
    715 
    716     ps_dec->i1_recon_in_thread3_flag = 1;
    717     ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon;
    718     if(ps_dec->u1_separate_parse)
    719     {
    720         memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon,
    721                sizeof(tfr_ctxt_t));
    722         if(ps_dec->u4_num_cores >= 3 && ps_dec->i1_recon_in_thread3_flag)
    723         {
    724             memcpy(&ps_dec->s_tran_iprecon, &ps_dec->s_tran_addrecon,
    725                    sizeof(tfr_ctxt_t));
    726             ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon;
    727         }
    728     }
    729 
    730 
    731     ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon),
    732                                ps_dec->u2_frm_wd_in_mbs, 0);
    733 
    734     ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic;
    735     ps_dec->u4_cur_deblk_mb_num = 0;
    736 
    737     ps_dec->u4_deblk_mb_x = 0;
    738     ps_dec->u4_deblk_mb_y = 0;
    739     ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
    740 
    741     ps_dec->u4_first_slice_in_pic = 0;
    742     H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
    743     return OK;
    744 }
    745 
    746 /*!
    747  **************************************************************************
    748  * \if Function name :  ih264d_deblock_display \endif
    749  *
    750  * \brief            :  The function callls the deblocking routine and manages
    751  :  the Recon buffers and displays .
    752  * \return           :  Nothing
    753  *
    754  **************************************************************************
    755  */
    756 WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)
    757 {
    758     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
    759     UWORD8 u1_num_of_users = 0;
    760     WORD32 ret;
    761 
    762     H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
    763     if(1)
    764     {
    765 
    766         {
    767             ih264d_delete_nonref_nondisplay_pics(ps_dec->ps_dpb_mgr);
    768             if(ps_cur_slice->u1_mmco_equalto5
    769                             || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
    770             {
    771                 ps_dec->ps_cur_pic->i4_poc = 0;
    772                 if(ps_dec->u2_total_mbs_coded
    773                                 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
    774                     ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
    775                 ih264d_release_display_bufs(ps_dec);
    776             }
    777             if(IVD_DECODE_FRAME_OUT != ps_dec->e_frm_out_mode)
    778             {
    779                 ret = ih264d_assign_display_seq(ps_dec);
    780                 if(ret != OK)
    781                     return ret;
    782             }
    783         }
    784 
    785         if(ps_cur_slice->u1_nal_ref_idc)
    786         {
    787             /* Mark pic buf as needed for reference */
    788             ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    789                                      ps_dec->u1_pic_buf_id,
    790                                      BUF_MGR_REF);
    791             /* Mark mv buf as needed for reference */
    792             ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
    793                                      ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
    794                                      BUF_MGR_REF);
    795             ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 1;
    796         }
    797 
    798         /* 420 consumer */
    799         /* Increment the number of users by 1 for display based upon */
    800         /*the SEEK KEY FRAME control sent to decoder                 */
    801         if(((0 == ps_dec->u1_last_pic_not_decoded)
    802                         && (0
    803                                         == (ps_dec->ps_cur_pic->u4_pack_slc_typ
    804                                                         & ps_dec->u4_skip_frm_mask)))
    805                         || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
    806         {
    807             /* Mark pic buf as needed for display */
    808             ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    809                                      ps_dec->u1_pic_buf_id,
    810                                      BUF_MGR_IO);
    811 
    812         }
    813 
    814         if(!ps_cur_slice->u1_field_pic_flag
    815                         || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
    816                                         != ps_dec->u1_top_bottom_decoded))
    817         {
    818             pic_buffer_t *ps_cur_pic = ps_dec->ps_cur_pic;
    819             ps_cur_pic->u2_disp_width = ps_dec->u2_disp_width;
    820             ps_cur_pic->u2_disp_height = ps_dec->u2_disp_height >> 1;
    821 
    822             ps_cur_pic->u2_crop_offset_y = ps_dec->u2_crop_offset_y;
    823             ps_cur_pic->u2_crop_offset_uv = ps_dec->u2_crop_offset_uv;
    824             ps_cur_pic->u1_pic_type = 0;
    825 
    826             ret = ih264d_insert_pic_in_display_list(
    827                             ps_dec->ps_dpb_mgr,
    828                             ps_dec->u1_pic_buf_id,
    829                             ps_dec->i4_prev_max_display_seq
    830                                             + ps_dec->ps_cur_pic->i4_poc,
    831                             ps_dec->ps_cur_pic->i4_frame_num);
    832             if(ret != OK)
    833                 return ret;
    834 
    835             {
    836                 ivd_video_decode_op_t * ps_dec_output =
    837                                 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
    838 
    839                 ps_dec_output->u4_frame_decoded_flag = 1;
    840             }
    841             if(ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] == 0)
    842             {
    843                 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
    844                                       ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
    845                                       BUF_MGR_REF);
    846                 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 0;
    847 
    848             }
    849         }
    850         else
    851         {
    852             H264_DEC_DEBUG_PRINT("pic not inserted display %d %d\n",
    853                                  ps_cur_slice->u1_field_pic_flag,
    854                                  ps_dec->u1_second_field);
    855         }
    856 
    857         if(!ps_cur_slice->u1_field_pic_flag
    858                         || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
    859                                         == ps_dec->u1_top_bottom_decoded))
    860         {
    861             if(IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
    862             {
    863                 ret = ih264d_assign_display_seq(ps_dec);
    864                 if(ret != OK)
    865                     return ret;
    866             }
    867         }
    868     }
    869 
    870     H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
    871 
    872     return OK;
    873 }
    874 
    875 void ih264d_err_pic_dispbuf_mgr(dec_struct_t *ps_dec)
    876 {
    877     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
    878     ivd_video_decode_op_t * ps_dec_output =
    879                     (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
    880 
    881     ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    882                           ps_dec->u1_pic_buf_id,
    883                           BUF_MGR_REF);
    884     ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
    885                           ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
    886                           BUF_MGR_REF);
    887     ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
    888                           ps_dec->u1_pic_buf_id,
    889                           BUF_MGR_IO);
    890 }
    891 
    892 void ih264d_deblock_picture(void *ptr)
    893 {
    894     dec_struct_t *ps_dec = (dec_struct_t *)ptr;
    895 
    896     {
    897         /*Deblock picture only if all the mb's in the frame have been decoded*/
    898         if(ps_dec->u1_pic_decode_done == 1)
    899         {
    900             if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
    901                             || ps_dec->ps_cur_slice->u1_field_pic_flag)
    902             {
    903                 ps_dec->p_DeblockPicture[ps_dec->ps_cur_slice->u1_mbaff_frame_flag](
    904                                 ps_dec);
    905             }
    906             else
    907 
    908             {
    909 
    910                 ih264d_deblock_picture_progressive(ps_dec);
    911             }
    912 
    913         }
    914     }
    915 
    916 }
    917 
    918 /*!
    919  **************************************************************************
    920  * \if Function name :  ih264d_deblock_display \endif
    921  *
    922  * \brief            :  The function callls the deblocking routine and manages
    923  :  the Recon buffers and displays .
    924  * \return           :  Nothing
    925  *
    926  **************************************************************************
    927  */
    928 WORD32 ih264d_deblock_display(dec_struct_t *ps_dec)
    929 {
    930     WORD32 ret;
    931     /* Call deblocking */
    932     ih264d_deblock_picture(ps_dec);
    933 
    934     ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
    935     if(ret != OK)
    936         return ret;
    937 
    938     return OK;
    939 }
    940 
    941 /*
    942  *!
    943  **************************************************************************
    944  * \if Function name : EndofPoc \endif
    945  *
    946  * \brief
    947  *    EndofPoc Processing
    948  *
    949  * \return
    950  *    0 on Success and Error code otherwise
    951  **************************************************************************
    952  */
    953 
    954 WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec)
    955 {
    956     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
    957     WORD32 ret;
    958 
    959     {
    960         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
    961         if(ps_err->u1_err_flag & REJECT_CUR_PIC)
    962         {
    963             ih264d_err_pic_dispbuf_mgr(ps_dec);
    964             return ERROR_NEW_FRAME_EXPECTED;
    965         }
    966     }
    967 
    968     H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
    969     ret = ih264d_end_of_pic_processing(ps_dec);
    970     if(ret != OK)
    971         return ret;
    972     /*--------------------------------------------------------------------*/
    973     /* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt                    */
    974     /* Needed to detect end of picture                                    */
    975     /*--------------------------------------------------------------------*/
    976 
    977     H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
    978 
    979     return OK;
    980 }
    981 
    982 /*!
    983  **************************************************************************
    984  * \if Function name : DecodeSlice \endif
    985  *
    986  * \brief
    987  *    Parses a slice
    988  *
    989  * \return
    990  *    0 on Success and Error code otherwise
    991  **************************************************************************
    992  */
    993 
    994 WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
    995                                  UWORD8 u1_nal_ref_idc,
    996                                  dec_struct_t *ps_dec /* Decoder parameters */
    997                                  )
    998 {
    999     dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
   1000     dec_pic_params_t *ps_pps;
   1001     dec_seq_params_t *ps_seq;
   1002     dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
   1003     pocstruct_t s_tmp_poc;
   1004     WORD32 i_delta_poc[2];
   1005     WORD32 i4_poc = 0;
   1006     UWORD16 u2_first_mb_in_slice, u2_frame_num;
   1007     UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
   1008     UWORD32 u4_idr_pic_id = 0;
   1009     UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
   1010 
   1011     UWORD8 u1_nal_unit_type;
   1012     UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
   1013     UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
   1014     WORD8 i1_is_end_of_poc;
   1015 
   1016     WORD32 ret, end_of_frame;
   1017     WORD32 prev_slice_err, num_mb_skipped;
   1018     UWORD8 u1_mbaff;
   1019     pocstruct_t *ps_cur_poc;
   1020 
   1021     UWORD32 u4_temp;
   1022     WORD32 i_temp;
   1023     UWORD32 u4_call_end_of_pic = 0;
   1024 
   1025     /* read FirstMbInSlice  and slice type*/
   1026     ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
   1027     u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst,
   1028                                      pu4_bitstrm_buf);
   1029     if(u2_first_mb_in_slice
   1030                     > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
   1031     {
   1032 
   1033         return ERROR_CORRUPTED_SLICE;
   1034     }
   1035 
   1036     /*we currently don not support ASO*/
   1037     if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag)
   1038                     <= ps_dec->u2_cur_mb_addr) && (ps_dec->u4_first_slice_in_pic == 0))
   1039     {
   1040         return ERROR_CORRUPTED_SLICE;
   1041     }
   1042 
   1043     COPYTHECONTEXT("SH: first_mb_in_slice",u2_first_mb_in_slice);
   1044 
   1045     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   1046 
   1047     if(u4_temp > 9)
   1048         return ERROR_INV_SLC_TYPE_T;
   1049 
   1050     u1_slice_type = u4_temp;
   1051     COPYTHECONTEXT("SH: slice_type",(u1_slice_type));
   1052     /* Find Out the Slice Type is 5 to 9 or not then Set the Flag   */
   1053     /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/
   1054     /* will be of same type of current                            */
   1055     if(u1_slice_type > 4)
   1056     {
   1057         u1_slice_type -= 5;
   1058     }
   1059 
   1060     {
   1061         UWORD32 skip;
   1062 
   1063         if((ps_dec->i4_app_skip_mode == IVD_SKIP_PB)
   1064                         || (ps_dec->i4_dec_skip_mode == IVD_SKIP_PB))
   1065         {
   1066             UWORD32 u4_bit_stream_offset = 0;
   1067 
   1068             if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
   1069             {
   1070                 skip = 0;
   1071 
   1072                 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
   1073             }
   1074             else if((I_SLICE == u1_slice_type)
   1075                             && (1 >= ps_dec->ps_cur_sps->u1_num_ref_frames))
   1076             {
   1077                 skip = 0;
   1078 
   1079                 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
   1080             }
   1081             else
   1082             {
   1083                 skip = 1;
   1084             }
   1085 
   1086             /* If one frame worth of data is already skipped, do not skip the next one */
   1087             if((0 == u2_first_mb_in_slice) && (1 == ps_dec->u4_prev_nal_skipped))
   1088             {
   1089                 skip = 0;
   1090             }
   1091 
   1092             if(skip)
   1093             {
   1094                 ps_dec->u4_prev_nal_skipped = 1;
   1095                 ps_dec->i4_dec_skip_mode = IVD_SKIP_PB;
   1096                 return 0;
   1097             }
   1098             else
   1099             {
   1100                 /* If the previous NAL was skipped, then
   1101                  do not process that buffer in this call.
   1102                  Return to app and process it in the next call.
   1103                  This is necessary to handle cases where I/IDR is not complete in
   1104                  the current buffer and application intends to fill the remaining part of the bitstream
   1105                  later. This ensures we process only frame worth of data in every call */
   1106                 if(1 == ps_dec->u4_prev_nal_skipped)
   1107                 {
   1108                     ps_dec->u4_return_to_app = 1;
   1109                     return 0;
   1110                 }
   1111             }
   1112         }
   1113 
   1114     }
   1115 
   1116     u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   1117     if(u4_temp & MASK_ERR_PIC_SET_ID)
   1118         return ERROR_INV_SLICE_HDR_T;
   1119     /* discard slice if pic param is invalid */
   1120     COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp);
   1121     ps_pps = &ps_dec->ps_pps[u4_temp];
   1122     if(FALSE == ps_pps->u1_is_valid)
   1123     {
   1124         return ERROR_INV_SLICE_HDR_T;
   1125     }
   1126     ps_seq = ps_pps->ps_sps;
   1127     if(!ps_seq)
   1128         return ERROR_INV_SLICE_HDR_T;
   1129     if(FALSE == ps_seq->u1_is_valid)
   1130         return ERROR_INV_SLICE_HDR_T;
   1131 
   1132     /* Get the frame num */
   1133     u2_frame_num = ih264d_get_bits_h264(ps_bitstrm,
   1134                                          ps_seq->u1_bits_in_frm_num);
   1135 //    H264_DEC_DEBUG_PRINT("FRAME %d First MB in slice: %d\n", u2_frame_num, u2_first_mb_in_slice);
   1136 
   1137     COPYTHECONTEXT("SH: frame_num", u2_frame_num);
   1138 //    H264_DEC_DEBUG_PRINT("Second field: %d frame num: %d prv_frame_num: %d \n", ps_dec->u1_second_field, u2_frame_num, ps_dec->u2_prv_frame_num);
   1139     if(!ps_dec->u1_first_slice_in_stream && ps_dec->u4_first_slice_in_pic)
   1140     {
   1141         pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
   1142         pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
   1143 
   1144         ps_dec->u2_mbx = 0xffff;
   1145         ps_dec->u2_mby = 0;
   1146 
   1147         if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
   1148             ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
   1149 
   1150         if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
   1151             ps_dec->u2_prev_ref_frame_num = 0;
   1152 
   1153         if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
   1154         {
   1155             ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
   1156         }
   1157 
   1158         ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
   1159         ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
   1160         ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
   1161         if(ps_cur_slice->u1_nal_ref_idc)
   1162         {
   1163             ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
   1164             ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
   1165             ps_prev_poc->i4_delta_pic_order_cnt_bottom =
   1166                             ps_cur_poc->i4_delta_pic_order_cnt_bottom;
   1167             ps_prev_poc->i4_delta_pic_order_cnt[0] =
   1168                             ps_cur_poc->i4_delta_pic_order_cnt[0];
   1169             ps_prev_poc->i4_delta_pic_order_cnt[1] =
   1170                             ps_cur_poc->i4_delta_pic_order_cnt[1];
   1171             ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
   1172         }
   1173 
   1174         ps_dec->u2_total_mbs_coded = 0;
   1175     }
   1176     /* Get the field related flags  */
   1177     if(!ps_seq->u1_frame_mbs_only_flag)
   1178     {
   1179 
   1180         u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
   1181         COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag);
   1182         u1_bottom_field_flag = 0;
   1183 
   1184         if(u1_field_pic_flag)
   1185         {
   1186             ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
   1187             u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm);
   1188             COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag);
   1189 
   1190         }
   1191         else
   1192         {
   1193             ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
   1194         }
   1195     }
   1196     else
   1197     {
   1198         u1_field_pic_flag = 0;
   1199         u1_bottom_field_flag = 0;
   1200 
   1201         ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
   1202     }
   1203 
   1204     u1_nal_unit_type = SLICE_NAL;
   1205     if(u1_is_idr_slice)
   1206     {
   1207         u1_nal_unit_type = IDR_SLICE_NAL;
   1208         u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst,
   1209                                    pu4_bitstrm_buf);
   1210         if(u4_idr_pic_id > 65535)
   1211             return ERROR_INV_SLICE_HDR_T;
   1212         COPYTHECONTEXT("SH:  ", u4_idr_pic_id);
   1213     }
   1214 
   1215     /* read delta pic order count information*/
   1216     i_delta_poc[0] = i_delta_poc[1] = 0;
   1217     s_tmp_poc.i4_pic_order_cnt_lsb = 0;
   1218     s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
   1219     u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
   1220     if(u1_pic_order_cnt_type == 0)
   1221     {
   1222         i_temp = ih264d_get_bits_h264(
   1223                         ps_bitstrm,
   1224                         ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
   1225         if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb)
   1226             return ERROR_INV_SLICE_HDR_T;
   1227         s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
   1228         COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
   1229 
   1230         if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
   1231         {
   1232             s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(
   1233                             pu4_bitstrm_ofst, pu4_bitstrm_buf);
   1234             //if(s_tmp_poc.i4_delta_pic_order_cnt_bottom > ps_seq->i4_max_pic_order_cntLsb)
   1235             COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom",
   1236                             s_tmp_poc.i4_delta_pic_order_cnt_bottom);
   1237         }
   1238     }
   1239 
   1240     s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
   1241     s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
   1242     if(u1_pic_order_cnt_type == 1
   1243                     && (!ps_seq->u1_delta_pic_order_always_zero_flag))
   1244     {
   1245         s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst,
   1246                                                          pu4_bitstrm_buf);
   1247         COPYTHECONTEXT("SH: delta_pic_order_cnt[0]",
   1248                         s_tmp_poc.i4_delta_pic_order_cnt[0]);
   1249 
   1250         if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
   1251         {
   1252             s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(
   1253                             pu4_bitstrm_ofst, pu4_bitstrm_buf);
   1254             COPYTHECONTEXT("SH: delta_pic_order_cnt[1]",
   1255                             s_tmp_poc.i4_delta_pic_order_cnt[1]);
   1256         }
   1257     }
   1258 
   1259     if(ps_pps->u1_redundant_pic_cnt_present_flag)
   1260     {
   1261         u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
   1262         if(u4_temp > MAX_REDUNDANT_PIC_CNT)
   1263             return ERROR_INV_SLICE_HDR_T;
   1264         u1_redundant_pic_cnt = u4_temp;
   1265         COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt);
   1266     }
   1267 
   1268     /*--------------------------------------------------------------------*/
   1269     /* Check if the slice is part of new picture                          */
   1270     /*--------------------------------------------------------------------*/
   1271     /* First slice of a picture is always considered as part of new picture */
   1272     i1_is_end_of_poc = 1;
   1273     ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
   1274 
   1275     if(ps_dec->u4_first_slice_in_pic == 0)
   1276     {
   1277         i1_is_end_of_poc = ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc,
   1278                                             &s_tmp_poc, &ps_dec->s_cur_pic_poc,
   1279                                             ps_cur_slice, u1_pic_order_cnt_type,
   1280                                             u1_nal_unit_type, u4_idr_pic_id,
   1281                                             u1_field_pic_flag,
   1282                                             u1_bottom_field_flag);
   1283         if(i1_is_end_of_poc)
   1284         {
   1285             ps_dec->u1_first_slice_in_stream = 0;
   1286             return ERROR_INCOMPLETE_FRAME;
   1287         }
   1288 
   1289     }
   1290 
   1291     /*--------------------------------------------------------------------*/
   1292     /* Check for error in slice and parse the missing/corrupted MB's      */
   1293     /* as skip-MB's in an inserted P-slice                                */
   1294     /*--------------------------------------------------------------------*/
   1295     u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
   1296     prev_slice_err = 0;
   1297 
   1298     if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
   1299     {
   1300         if(u2_frame_num != ps_dec->u2_prv_frame_num
   1301                && ps_dec->u1_top_bottom_decoded != 0
   1302                    && ps_dec->u1_top_bottom_decoded
   1303                        != (TOP_FIELD_ONLY | BOT_FIELD_ONLY))
   1304         {
   1305             ps_dec->u1_dangling_field = 1;
   1306             if(ps_dec->u4_first_slice_in_pic)
   1307             {
   1308                 // first slice - dangling field
   1309                 prev_slice_err = 1;
   1310             }
   1311             else
   1312             {
   1313                 // last slice - dangling field
   1314                 prev_slice_err = 2;
   1315             }
   1316 
   1317             if(ps_dec->u1_top_bottom_decoded ==TOP_FIELD_ONLY)
   1318                 ps_cur_slice->u1_bottom_field_flag = 1;
   1319             else
   1320                 ps_cur_slice->u1_bottom_field_flag = 0;
   1321 
   1322             num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1323                     - ps_dec->u2_total_mbs_coded;
   1324             ps_cur_poc = &ps_dec->s_cur_pic_poc;
   1325 
   1326             u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL;
   1327         }
   1328         else if(ps_dec->u4_first_slice_in_pic)
   1329         {
   1330             if(u2_first_mb_in_slice > 0)
   1331             {
   1332                 // first slice - missing/header corruption
   1333                 prev_slice_err = 1;
   1334                 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
   1335                 ps_cur_poc = &s_tmp_poc;
   1336 
   1337                 // initializing slice parameters
   1338                 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
   1339                 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
   1340                 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
   1341                 ps_cur_slice->i4_pic_order_cnt_lsb =
   1342                         s_tmp_poc.i4_pic_order_cnt_lsb;
   1343                 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
   1344                 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
   1345                 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
   1346                 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
   1347                 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
   1348                         && (!u1_field_pic_flag);
   1349             }
   1350         }
   1351         else
   1352         {
   1353             /* since i1_is_end_of_poc is set ,means new frame num is encountered. so conceal the current frame
   1354              * completely */
   1355             prev_slice_err = 2;
   1356             num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs
   1357                             * ps_dec->u2_frm_wd_in_mbs)
   1358                             - ps_dec->u2_total_mbs_coded;
   1359             ps_cur_poc = &s_tmp_poc;
   1360         }
   1361     }
   1362     else
   1363     {
   1364         if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u2_total_mbs_coded)
   1365         {
   1366             // previous slice - missing/corruption
   1367             prev_slice_err = 2;
   1368             num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff)
   1369                     - ps_dec->u2_total_mbs_coded;
   1370             ps_cur_poc = &s_tmp_poc;
   1371         }
   1372         else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u2_total_mbs_coded)
   1373         {
   1374             return ERROR_CORRUPTED_SLICE;
   1375         }
   1376     }
   1377 
   1378     if(prev_slice_err)
   1379     {
   1380         ret = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err);
   1381 
   1382         if(ps_dec->u1_dangling_field == 1)
   1383         {
   1384             ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
   1385             ps_dec->u1_first_slice_in_stream = 0;
   1386             ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
   1387             return ERROR_DANGLING_FIELD_IN_PIC;
   1388         }
   1389 
   1390         if(prev_slice_err == 2)
   1391         {
   1392             ps_dec->u1_first_slice_in_stream = 0;
   1393             return ERROR_INCOMPLETE_FRAME;
   1394         }
   1395 
   1396         if(ps_dec->u2_total_mbs_coded
   1397                 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
   1398         {
   1399             /* return if all MBs in frame are parsed*/
   1400             ps_dec->u1_first_slice_in_stream = 0;
   1401             return ERROR_IN_LAST_SLICE_OF_PIC;
   1402         }
   1403 
   1404         if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
   1405         {
   1406             ih264d_err_pic_dispbuf_mgr(ps_dec);
   1407             return ERROR_NEW_FRAME_EXPECTED;
   1408         }
   1409 
   1410         if(ret != OK)
   1411             return ret;
   1412 
   1413         i1_is_end_of_poc = 0;
   1414     }
   1415 
   1416     if (ps_dec->u4_first_slice_in_pic == 0)
   1417     {
   1418         ps_dec->ps_parse_cur_slice++;
   1419         ps_dec->u2_cur_slice_num++;
   1420     }
   1421 
   1422     // in the case of single core increment ps_decode_cur_slice
   1423     if((ps_dec->u1_separate_parse == 0) && (ps_dec->u4_first_slice_in_pic == 0))
   1424     {
   1425         ps_dec->ps_decode_cur_slice++;
   1426     }
   1427     ps_dec->u1_slice_header_done = 0;
   1428 
   1429 
   1430     if(u1_field_pic_flag)
   1431     {
   1432         ps_dec->u2_prv_frame_num = u2_frame_num;
   1433     }
   1434 
   1435     if(ps_cur_slice->u1_mmco_equalto5)
   1436     {
   1437         WORD32 i4_temp_poc;
   1438         WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
   1439 
   1440         if(!ps_cur_slice->u1_field_pic_flag) // or a complementary field pair
   1441         {
   1442             i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
   1443             i4_bot_field_order_poc =
   1444                             ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
   1445             i4_temp_poc = MIN(i4_top_field_order_poc,
   1446                                      i4_bot_field_order_poc);
   1447         }
   1448         else if(!ps_cur_slice->u1_bottom_field_flag)
   1449             i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
   1450         else
   1451             i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
   1452 
   1453         ps_dec->ps_cur_pic->i4_top_field_order_cnt = i4_temp_poc
   1454                         - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
   1455         ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = i4_temp_poc
   1456                         - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
   1457         ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
   1458         ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
   1459     }
   1460     if(ps_dec->u4_first_slice_in_pic)
   1461     {
   1462         ret = ih264d_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num,
   1463                                           &ps_dec->s_prev_pic_poc,
   1464                                           &s_tmp_poc, ps_cur_slice, ps_pps,
   1465                                           u1_nal_ref_idc,
   1466                                           u1_bottom_field_flag,
   1467                                           u1_field_pic_flag, &i4_poc);
   1468         if(ret != OK)
   1469             return ret;
   1470         /* Display seq no calculations */
   1471         if(i4_poc >= ps_dec->i4_max_poc)
   1472             ps_dec->i4_max_poc = i4_poc;
   1473         /* IDR Picture or POC wrap around */
   1474         if(i4_poc == 0)
   1475         {
   1476             ps_dec->i4_prev_max_display_seq = ps_dec->i4_prev_max_display_seq
   1477                             + ps_dec->i4_max_poc
   1478                             + ps_dec->u1_max_dec_frame_buffering + 1;
   1479             ps_dec->i4_max_poc = 0;
   1480         }
   1481     }
   1482 
   1483     /*--------------------------------------------------------------------*/
   1484     /* Copy the values read from the bitstream to the slice header and then*/
   1485     /* If the slice is first slice in picture, then do Start of Picture   */
   1486     /* processing.                                                        */
   1487     /*--------------------------------------------------------------------*/
   1488     ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
   1489     ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
   1490     ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
   1491     ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
   1492     ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
   1493     ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
   1494     ps_cur_slice->u1_slice_type = u1_slice_type;
   1495     ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
   1496 
   1497     ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
   1498     ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
   1499     ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
   1500     ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
   1501 
   1502     if(ps_seq->u1_frame_mbs_only_flag)
   1503         ps_cur_slice->u1_direct_8x8_inference_flag =
   1504                         ps_seq->u1_direct_8x8_inference_flag;
   1505     else
   1506         ps_cur_slice->u1_direct_8x8_inference_flag = 1;
   1507 
   1508     if(u1_slice_type == B_SLICE)
   1509     {
   1510         ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(
   1511                         ps_bitstrm);
   1512         COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag",
   1513                         ps_cur_slice->u1_direct_spatial_mv_pred_flag);
   1514 
   1515         if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
   1516             ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
   1517         else
   1518             ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
   1519         if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
   1520             ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
   1521     }
   1522     else
   1523     {
   1524         if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
   1525             ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
   1526     }
   1527 
   1528     if(ps_dec->u4_first_slice_in_pic)
   1529     {
   1530         if(u2_first_mb_in_slice == 0)
   1531         {
   1532             ret = ih264d_start_of_pic(ps_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
   1533             if(ret != OK)
   1534                 return ret;
   1535         }
   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         if(ps_dec->u1_separate_parse == 1)
   1554         {
   1555             if(ps_dec->u4_dec_thread_created == 0)
   1556             {
   1557                 ithread_create(ps_dec->pv_dec_thread_handle, NULL,
   1558                                (void *)ih264d_decode_picture_thread,
   1559                                (void *)ps_dec);
   1560 
   1561                 ps_dec->u4_dec_thread_created = 1;
   1562             }
   1563 
   1564             if((ps_dec->u4_num_cores == 3) &&
   1565                             ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
   1566                             && (ps_dec->u4_bs_deblk_thread_created == 0))
   1567             {
   1568                 ps_dec->u4_start_recon_deblk = 0;
   1569                 ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
   1570                                (void *)ih264d_recon_deblk_thread,
   1571                                (void *)ps_dec);
   1572                 ps_dec->u4_bs_deblk_thread_created = 1;
   1573             }
   1574         }
   1575 
   1576     }
   1577 
   1578     /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
   1579     {
   1580         UWORD8 uc_nofield_nombaff;
   1581 
   1582 
   1583 
   1584         uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0)
   1585                         && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0)
   1586                         && (u1_slice_type != B_SLICE)
   1587                         && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
   1588 
   1589         /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
   1590 
   1591         if(uc_nofield_nombaff)
   1592         {
   1593             ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
   1594             ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
   1595         }
   1596         else
   1597         {
   1598             ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
   1599             ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
   1600         }
   1601 
   1602 
   1603     }
   1604 
   1605     /*
   1606      * Decide whether to decode the current picture or not
   1607      */
   1608     {
   1609         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
   1610         if(ps_err->u4_frm_sei_sync == u2_frame_num)
   1611         {
   1612             ps_err->u1_err_flag = ACCEPT_ALL_PICS;
   1613             ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
   1614         }
   1615         ps_err->u4_cur_frm = u2_frame_num;
   1616     }
   1617 
   1618     /* Decision for decoding if the picture is to be skipped */
   1619     {
   1620         WORD32 i4_skip_b_pic, i4_skip_p_pic;
   1621 
   1622         i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT)
   1623                         && (B_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
   1624 
   1625         i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT)
   1626                         && (P_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
   1627 
   1628         /**************************************************************/
   1629         /* Skip the B picture if skip mask is set for B picture and   */
   1630         /* Current B picture is a non reference B picture or there is */
   1631         /* no user for reference B picture                            */
   1632         /**************************************************************/
   1633         if(i4_skip_b_pic)
   1634         {
   1635             ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
   1636             /* Don't decode the picture in SKIP-B mode if that picture is B */
   1637             /* and also it is not to be used as a reference picture         */
   1638             ps_dec->u1_last_pic_not_decoded = 1;
   1639 
   1640             return OK;
   1641         }
   1642         /**************************************************************/
   1643         /* Skip the P picture if skip mask is set for P picture and   */
   1644         /* Current P picture is a non reference P picture or there is */
   1645         /* no user for reference P picture                            */
   1646         /**************************************************************/
   1647         if(i4_skip_p_pic)
   1648         {
   1649             ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
   1650             /* Don't decode the picture in SKIP-P mode if that picture is P */
   1651             /* and also it is not to be used as a reference picture         */
   1652             ps_dec->u1_last_pic_not_decoded = 1;
   1653 
   1654             return OK;
   1655         }
   1656     }
   1657 
   1658     {
   1659         UWORD16 u2_mb_x, u2_mb_y;
   1660 
   1661         ps_dec->i4_submb_ofst = ((u2_first_mb_in_slice
   1662                         << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE)
   1663                         - SUB_BLK_SIZE;
   1664         if(u2_first_mb_in_slice)
   1665         {
   1666             UWORD8 u1_mb_aff;
   1667             UWORD8 u1_field_pic;
   1668             UWORD16 u2_frm_wd_in_mbs;
   1669             u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
   1670             u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
   1671             u1_field_pic = ps_cur_slice->u1_field_pic_flag;
   1672 
   1673             {
   1674                 UWORD32 x_offset;
   1675                 UWORD32 y_offset;
   1676                 UWORD32 u4_frame_stride;
   1677                 tfr_ctxt_t *ps_trns_addr; // = &ps_dec->s_tran_addrecon_parse;
   1678 
   1679                 if(ps_dec->u1_separate_parse)
   1680                 {
   1681                     ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
   1682                 }
   1683                 else
   1684                 {
   1685                     ps_trns_addr = &ps_dec->s_tran_addrecon;
   1686                 }
   1687                 u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
   1688                 u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
   1689 
   1690                 u2_mb_y <<= u1_mb_aff;
   1691 
   1692                 if((u2_mb_x > u2_frm_wd_in_mbs - 1)
   1693                                 || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
   1694                 {
   1695                     return ERROR_CORRUPTED_SLICE;
   1696                 }
   1697 
   1698                 u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
   1699                 x_offset = u2_mb_x << 4;
   1700                 y_offset = (u2_mb_y * u4_frame_stride) << 4;
   1701 
   1702                 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset
   1703                                 + y_offset;
   1704 
   1705                 u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
   1706                 x_offset >>= 1;
   1707                 y_offset = (u2_mb_y * u4_frame_stride) << 3;
   1708 
   1709                 x_offset *= YUV420SP_FACTOR;
   1710 
   1711                 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset
   1712                                 + y_offset;
   1713                 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset
   1714                                 + y_offset;
   1715 
   1716                 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
   1717                 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
   1718                 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
   1719 
   1720 
   1721                 // assign the deblock structure pointers to start of slice
   1722                 if(ps_dec->u1_separate_parse == 1)
   1723                 {
   1724                     ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
   1725                                     + (u2_first_mb_in_slice << u1_mb_aff);
   1726                 }
   1727                 else
   1728                 {
   1729                         ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
   1730                                         + (u2_first_mb_in_slice << u1_mb_aff);
   1731                 }
   1732 
   1733                 ps_dec->u2_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
   1734 
   1735                 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv
   1736                                 + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
   1737             }
   1738         }
   1739         else
   1740         {
   1741             tfr_ctxt_t *ps_trns_addr;
   1742 
   1743             if(ps_dec->u1_separate_parse)
   1744             {
   1745                 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
   1746             }
   1747             else
   1748             {
   1749                 ps_trns_addr = &ps_dec->s_tran_addrecon;
   1750             }
   1751 
   1752             u2_mb_x = 0xffff;
   1753             u2_mb_y = 0;
   1754             // assign the deblock structure pointers to start of slice
   1755             ps_dec->u2_cur_mb_addr = 0;
   1756             ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
   1757             ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
   1758             ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
   1759             ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
   1760             ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
   1761 
   1762             ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
   1763             ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
   1764             ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
   1765 
   1766         }
   1767 
   1768         ps_dec->ps_part = ps_dec->ps_parse_part_params;
   1769 
   1770         ps_dec->u2_mbx =
   1771                         (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
   1772         ps_dec->u2_mby =
   1773                         (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
   1774         ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
   1775         ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1776         ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1777     }
   1778 
   1779     /* RBSP stop bit is used for CABAC decoding*/
   1780     ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode;
   1781 
   1782     ps_dec->u1_B = (u1_slice_type == B_SLICE);
   1783     ps_dec->u4_next_mb_skip = 0;
   1784 
   1785     ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice =
   1786                     ps_dec->ps_cur_slice->u2_first_mb_in_slice;
   1787     ps_dec->ps_parse_cur_slice->slice_type =
   1788                     ps_dec->ps_cur_slice->u1_slice_type;
   1789 
   1790 
   1791     ps_dec->u4_start_recon_deblk = 1;
   1792     {
   1793         WORD32 num_entries;
   1794         WORD32 size;
   1795         UWORD8 *pu1_buf;
   1796 
   1797         num_entries = MAX_FRAMES;
   1798         if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
   1799             (0 == ps_dec->i4_display_delay))
   1800         {
   1801             num_entries = 1;
   1802         }
   1803         num_entries = ((2 * num_entries) + 1);
   1804         num_entries *= 2;
   1805 
   1806 
   1807         size = num_entries * sizeof(void *);
   1808         size += PAD_MAP_IDX_POC * sizeof(void *);
   1809 
   1810         pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
   1811         pu1_buf += size * ps_dec->u2_cur_slice_num;
   1812         ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = ( void *)pu1_buf;
   1813     }
   1814 
   1815     if(ps_dec->u1_separate_parse)
   1816     {
   1817         ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
   1818     }
   1819     else
   1820     {
   1821         ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
   1822     }
   1823 
   1824     if(u1_slice_type == I_SLICE)
   1825     {
   1826         ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
   1827 
   1828         ret = ih264d_parse_islice(ps_dec, u2_first_mb_in_slice);
   1829 
   1830         if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
   1831             ps_dec->i4_pic_type = I_SLICE;
   1832 
   1833     }
   1834     else if(u1_slice_type == P_SLICE)
   1835     {
   1836         ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
   1837         ret = ih264d_parse_pslice(ps_dec, u2_first_mb_in_slice);
   1838         ps_dec->u1_pr_sl_type = u1_slice_type;
   1839         if(ps_dec->i4_pic_type != B_SLICE)
   1840             ps_dec->i4_pic_type = P_SLICE;
   1841     }
   1842     else if(u1_slice_type == B_SLICE)
   1843     {
   1844         ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
   1845         ret = ih264d_parse_bslice(ps_dec, u2_first_mb_in_slice);
   1846         ps_dec->u1_pr_sl_type = u1_slice_type;
   1847         ps_dec->i4_pic_type = B_SLICE;
   1848     }
   1849     else
   1850         return ERROR_INV_SLC_TYPE_T;
   1851 
   1852     if(ps_dec->u1_slice_header_done)
   1853     {
   1854         /* set to zero to indicate a valid slice has been decoded */
   1855         ps_dec->u1_first_slice_in_stream = 0;
   1856     }
   1857 
   1858     if(ret != OK)
   1859         return ret;
   1860 
   1861     /* storing last Mb X and MbY of the slice */
   1862     ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
   1863     ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
   1864 
   1865     /* End of Picture detection */
   1866 
   1867     if(ps_dec->u2_total_mbs_coded >= (ps_seq->u2_max_mb_addr + 1))
   1868     {
   1869         ps_dec->u1_pic_decode_done = 1;
   1870 
   1871     }
   1872 
   1873     {
   1874         dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
   1875         if((ps_err->u1_err_flag & REJECT_PB_PICS)
   1876                         && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
   1877         {
   1878             ps_err->u1_err_flag = ACCEPT_ALL_PICS;
   1879         }
   1880     }
   1881 
   1882     PRINT_BIN_BIT_RATIO(ps_dec)
   1883 
   1884     return ret;
   1885 }
   1886 
   1887