diff --git a/dependencies/ih264d/decoder/ih264d_api.c b/dependencies/ih264d/decoder/ih264d_api.c index 69dfe6bd53..0f46fda8db 100644 --- a/dependencies/ih264d/decoder/ih264d_api.c +++ b/dependencies/ih264d/decoder/ih264d_api.c @@ -497,7 +497,8 @@ static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle, } if(ps_op->s_ivd_video_decode_op_t.u4_size - != sizeof(ih264d_video_decode_op_t)&& + != sizeof(ih264d_video_decode_op_t) && + ps_op->s_ivd_video_decode_op_t.u4_size != sizeof(ivd_video_decode_op_t) && ps_op->s_ivd_video_decode_op_t.u4_size != offsetof(ivd_video_decode_op_t, u4_output_present)) { ps_op->s_ivd_video_decode_op_t.u4_error_code |= 1 @@ -1994,7 +1995,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) { UWORD32 u4_size; u4_size = ps_dec_op->u4_size; - memset(ps_h264d_dec_op, 0, sizeof(ih264d_video_decode_op_t)); + memset(ps_h264d_dec_op, 0, ps_dec_op->u4_size); ps_dec_op->u4_size = u4_size; } diff --git a/dependencies/ih264d/decoder/ih264d_parse_slice.c b/dependencies/ih264d/decoder/ih264d_parse_slice.c index 266c69bf0c..65907d20cb 100644 --- a/dependencies/ih264d/decoder/ih264d_parse_slice.c +++ b/dependencies/ih264d/decoder/ih264d_parse_slice.c @@ -167,9 +167,7 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, { pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc; pocstruct_t *ps_cur_poc = ps_temp_poc; - pic_buffer_t *pic_buf; - ivd_video_decode_op_t * ps_dec_output = (ivd_video_decode_op_t *)ps_dec->pv_dec_out; dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; @@ -179,13 +177,10 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, /* high profile related declarations */ high_profile_tools_t s_high_profile; WORD32 ret; - H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); - /* check output buffer size given by the application */ if(check_app_out_buf_size(ps_dec) != IV_SUCCESS) return IVD_DISP_FRM_ZERO_OP_BUF_SIZE; - ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb; ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb; ps_prev_poc->i4_delta_pic_order_cnt_bottom = @@ -199,30 +194,20 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_prev_poc->u2_frame_num = u2_frame_num; ps_dec->i1_prev_mb_qp_delta = 0; ps_dec->i1_next_ctxt_idx = 0; - - ps_dec->u4_nmb_deblk = 0; if(ps_dec->u4_num_cores == 1) ps_dec->u4_nmb_deblk = 1; - - - if(ps_seq->u1_mb_aff_flag == 1) { ps_dec->u4_nmb_deblk = 0; if(ps_dec->u4_num_cores > 2) ps_dec->u4_num_cores = 2; } - ps_dec->u4_use_intrapred_line_copy = 0; - - - if (ps_seq->u1_mb_aff_flag == 0) { ps_dec->u4_use_intrapred_line_copy = 1; } - ps_dec->u4_app_disable_deblk_frm = 0; /* If degrade is enabled, set the degrade flags appropriately */ if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics) @@ -230,7 +215,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, WORD32 degrade_pic; ps_dec->i4_degrade_pic_cnt++; degrade_pic = 0; - /* If degrade is to be done in all frames, then do not check further */ switch(ps_dec->i4_degrade_pics) { @@ -243,18 +227,15 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, { if(ps_cur_slice->u1_slice_type != I_SLICE) degrade_pic = 1; - break; } case 2: { - /* If pic count hits non-degrade interval or it is an islice, then do not degrade */ if((ps_cur_slice->u1_slice_type != I_SLICE) && (ps_dec->i4_degrade_pic_cnt != ps_dec->i4_nondegrade_interval)) degrade_pic = 1; - break; } case 1: @@ -266,19 +247,16 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, } break; } - } if(degrade_pic) { if(ps_dec->i4_degrade_type & 0x2) ps_dec->u4_app_disable_deblk_frm = 1; - /* MC degrading is done only for non-ref pictures */ if(0 == ps_cur_slice->u1_nal_ref_idc) { if(ps_dec->i4_degrade_type & 0x4) ps_dec->i4_mv_frac_mask = 0; - if(ps_dec->i4_degrade_type & 0x8) ps_dec->i4_mv_frac_mask = 0; } @@ -286,7 +264,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, else ps_dec->i4_degrade_pic_cnt = 0; } - { dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; if((ps_cur_slice->u1_slice_type == I_SLICE) @@ -294,13 +271,11 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_err->u1_cur_pic_type = PIC_TYPE_I; else ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN; - if(ps_err->u1_pic_aud_i == PIC_TYPE_I) { ps_err->u1_cur_pic_type = PIC_TYPE_I; ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN; } - if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL) { if(ps_err->u1_err_flag) @@ -308,40 +283,34 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_err->u1_err_flag = ACCEPT_ALL_PICS; } } - if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending) { /* Reset the decoder picture buffers */ WORD32 j; for(j = 0; j < MAX_DISP_BUFS_NEW; j++) { - ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, j, BUF_MGR_REF); ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, - ps_dec->au1_pic_buf_id_mv_buf_id_map[j], + ps_dec->as_buf_id_info_map[j].mv_buf_id, BUF_MGR_REF); ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, j, BUF_MGR_IO); } - /* reset the decoder structure parameters related to buffer handling */ ps_dec->u1_second_field = 0; ps_dec->i4_cur_display_seq = 0; - /********************************************************************/ /* indicate in the decoder output i4_status that some frames are being */ /* dropped, so that it resets timestamp and wait for a new sequence */ /********************************************************************/ - ps_dec->s_prev_seq_params.u1_eoseq_pending = 0; } ret = ih264d_init_pic(ps_dec, u2_frame_num, i4_poc, ps_pps); if(ret != OK) return ret; - ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data; ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data; ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info; @@ -350,39 +319,30 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, UWORD16 pic_wd; UWORD16 pic_ht; UWORD32 num_mbs; - pic_wd = ps_dec->u2_pic_wd; pic_ht = ps_dec->u2_pic_ht; num_mbs = (pic_wd * pic_ht) >> 8; - if(ps_dec->pu1_dec_mb_map) { memset((void *)ps_dec->pu1_dec_mb_map, 0, num_mbs); } - if(ps_dec->pu1_recon_mb_map) { - memset((void *)ps_dec->pu1_recon_mb_map, 0, num_mbs); } - if(ps_dec->pu2_slice_num_map) { memset((void *)ps_dec->pu2_slice_num_map, 0, (num_mbs * sizeof(UWORD16))); } - } - ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); ps_dec->u2_cur_slice_num = 0; - /* Initialize all the HP toolsets to zero */ ps_dec->s_high_profile.u1_scaling_present = 0; ps_dec->s_high_profile.u1_transform8x8_present = 0; - /* Get Next Free Picture */ if(1 == ps_dec->u4_share_disp_buf) { @@ -396,7 +356,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, BUF_MGR_IO); ps_dec->u4_disp_buf_to_be_freed[i] = 0; ps_dec->u4_disp_buf_mapping[i] = 0; - } } if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded)) //ps_dec->u1_second_field)) @@ -409,37 +368,66 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free( (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, &cur_pic_buf_id); + /* In case of IDR slices, if there is no free picture buffer, then release + * all buffers from display and reference + */ + if((ps_cur_pic == NULL) && (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)) + { + WORD32 j; + for(j = 0; j < MAX_DISP_BUFS_NEW; j++) + { + ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, + j, + BUF_MGR_REF); + ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, + ps_dec->as_buf_id_info_map[j].mv_buf_id, + BUF_MGR_REF); + ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, + j, + BUF_MGR_IO); + } + ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free( + (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, + &cur_pic_buf_id); + } if(ps_cur_pic == NULL) { ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T; + ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC; return ERROR_UNAVAIL_PICBUF_T; } if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id]) { break; } - } ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, &cur_mv_buf_id); if(ps_col_mv == NULL) { ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T; + ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC; return ERROR_UNAVAIL_MVBUF_T; } - ps_dec->ps_cur_pic = ps_cur_pic; ps_dec->u1_pic_buf_id = cur_pic_buf_id; ps_cur_pic->u4_ts = ps_dec->u4_ts; memcpy(&ps_cur_pic->s_sei_pic, ps_dec->ps_sei, sizeof(sei)); - ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id; - ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id; - + ps_dec->as_buf_id_info_map[cur_pic_buf_id].mv_buf_id = cur_mv_buf_id; + if(ps_dec->u1_enable_mb_info) + { + UWORD32 mb_info_map_size = ps_dec->u4_total_mbs << 2; + ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_qp_map + = ps_dec->pu1_qp_map_base + cur_pic_buf_id * mb_info_map_size; + ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_mb_type_map + = ps_dec->pu1_mb_type_map_base + cur_pic_buf_id * mb_info_map_size; + memset(ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_qp_map, 0, mb_info_map_size); + memset(ps_dec->as_buf_id_info_map[cur_pic_buf_id].pu1_mb_type_map, 0, mb_info_map_size); + } ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag; ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv; ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0; - { /*make first entry of list0 and list1 point to cur pic, *so that if first slice is in error, ref pic struct will have valid entries*/ @@ -448,7 +436,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic; /* Initialize for field reference as well */ *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic; - *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][0]) = *ps_cur_pic; /* Initialize for field reference as well */ *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic; @@ -459,60 +446,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, /* Initialize for field reference as well */ *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic; } - - if(!ps_dec->ps_cur_pic) - { - WORD32 j; - H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n"); - for(j = 0; j < MAX_DISP_BUFS_NEW; j++) - { - - ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, - j, - BUF_MGR_REF); - ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, - ps_dec->au1_pic_buf_id_mv_buf_id_map[j], - BUF_MGR_REF); - ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, - j, - BUF_MGR_IO); - } - - ps_dec->i4_cur_display_seq = 0; - ps_dec->i4_prev_max_display_seq = 0; - ps_dec->i4_max_poc = 0; - - ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free( - (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, - &cur_pic_buf_id); - if(ps_cur_pic == NULL) - { - ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T; - return ERROR_UNAVAIL_PICBUF_T; - } - - ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, - &cur_mv_buf_id); - if(ps_col_mv == NULL) - { - ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T; - return ERROR_UNAVAIL_MVBUF_T; - } - - ps_dec->ps_cur_pic = ps_cur_pic; - ps_dec->u1_pic_buf_id = cur_pic_buf_id; - ps_cur_pic->u4_ts = ps_dec->u4_ts; - ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic; - - ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id; - ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id; - - ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag; - ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv; - ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0; - - } - ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag; ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE; H264_DEC_DEBUG_PRINT("got a buffer\n"); @@ -521,9 +454,7 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, { H264_DEC_DEBUG_PRINT("did not get a buffer\n"); } - ps_dec->u4_pic_buf_got = 1; - ps_dec->ps_cur_pic->i4_poc = i4_poc; ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num; ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num; @@ -532,7 +463,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_pps->i4_bottom_field_order_cnt; ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc; ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts; - ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic); if(u1_field_pic_flag && u1_bottom_field_flag) { @@ -553,13 +483,10 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, i4_bot_field_order_poc); ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc; } - ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag); - ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag << 2); - ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0]; //Increment by 2 ,so that left mb (mbaff decrements by 2) will always be valid ps_dec->ps_cur_mb_row += 2; @@ -567,7 +494,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, 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)); //Increment by 2 ,so that left mb (mbaff decrements by 2) will always be valid ps_dec->ps_top_mb_row += 2; - /* CHANGED CODE */ ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv; ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0]; @@ -590,30 +516,21 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_dec->u2_mv_2mb[0] = 0; ps_dec->u2_mv_2mb[1] = 0; ps_dec->u1_last_pic_not_decoded = 0; - ps_dec->u2_cur_slice_num_dec_thread = 0; ps_dec->u2_cur_slice_num_bs = 0; ps_dec->u4_intra_pred_line_ofst = 0; ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line; ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line; ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line; - ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line; ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line; ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line; - - - - - ps_dec->pu1_prev_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE); - ps_dec->pu1_prev_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR; ps_dec->pu1_prev_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE; - ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic; /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */ { @@ -631,9 +548,7 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, /* Set up the Parameter for DMA transfer */ { UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; - UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag; - UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4) % (ps_dec->u1_recon_mb_grp >> u1_mbaff)); UWORD16 ui16_lastmbs_widthY = @@ -642,28 +557,23 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, UWORD16 ui16_lastmbs_widthUV = uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp >> u1_mbaff) << 3); - ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1; ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2; ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3; - ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag; ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag; - if(u1_field_pic_flag) { ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y; ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv; } - /* Normal Increment of Pointer */ ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4) >> u1_mbaff); ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4) >> u1_mbaff); - /* End of Row Increment */ ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY + (PAD_LEN_Y_H << 1) @@ -673,7 +583,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, + (PAD_LEN_UV_H << 2) + ps_dec->s_tran_addrecon.u2_frm_wd_uv * ((15 << u1_mbaff) + u1_mbaff)); - /* Assign picture numbers to each frame/field */ /* only once per picture. */ ih264d_assign_pic_num(ps_dec); @@ -697,7 +606,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, { ret = ih264d_form_default_scaling_matrix(ps_dec); } - if(ps_pps->i4_transform_8x8_mode_flag) { ps_dec->s_high_profile.u1_transform8x8_present = 1; @@ -715,7 +623,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_dec->s_high_profile.u1_direct_8x8_inference_flag = ps_seq->u1_direct_8x8_inference_flag; ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt; - ps_dec->i1_recon_in_thread3_flag = 1; ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon; if(ps_dec->u1_separate_parse) @@ -729,18 +636,13 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon; } } - - ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon), ps_dec->u2_frm_wd_in_mbs, 0); - ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic; ps_dec->u4_cur_deblk_mb_num = 0; - ps_dec->u4_deblk_mb_x = 0; ps_dec->u4_deblk_mb_y = 0; ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; - ps_dec->u4_first_slice_in_pic = 0; H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); return OK; @@ -1435,28 +1337,13 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, i1_is_end_of_poc = 0; } - /* Increment only if the current slice has atleast 1 more MB */ - if (ps_dec->u4_first_slice_in_pic == 0 && - (ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice < - (UWORD32)(ps_dec->u2_total_mbs_coded >> ps_dec->ps_cur_slice->u1_mbaff_frame_flag))) - { - ps_dec->ps_parse_cur_slice++; - ps_dec->u2_cur_slice_num++; - // in the case of single core increment ps_decode_cur_slice - if(ps_dec->u1_separate_parse == 0) - { - ps_dec->ps_decode_cur_slice++; - } - } - - ps_dec->u1_slice_header_done = 0; - - + if(u1_field_pic_flag) { ps_dec->u2_prv_frame_num = u2_frame_num; } + if(ps_cur_slice->u1_mmco_equalto5) { WORD32 i4_temp_poc; @@ -1519,6 +1406,23 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, } } + /* Increment only if the current slice has atleast 1 more MB */ + if (ps_dec->u4_first_slice_in_pic == 0 && + (ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice < + (UWORD32)(ps_dec->u2_total_mbs_coded >> ps_dec->ps_cur_slice->u1_mbaff_frame_flag))) + { + ps_dec->ps_parse_cur_slice++; + ps_dec->u2_cur_slice_num++; + // in the case of single core increment ps_decode_cur_slice + if(ps_dec->u1_separate_parse == 0) + { + ps_dec->ps_decode_cur_slice++; + } + } + + ps_dec->u1_slice_header_done = 0; + + /*--------------------------------------------------------------------*/ /* Copy the values read from the bitstream to the slice header and then*/ /* If the slice is first slice in picture, then do Start of Picture */