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