Decoder: Moved end of pic processing to end of decode call am: 494561291a am: ba7f9e2aed am: 26bb8b98ee am: 89fa016b5f am: df2fa01c9e am: 7944003371 am: fd5c8e352a
am: 9432beb534
Change-Id: Icd9bf9c1786a5758cf8ec4f6a5b4b6a96daef1dd
This commit is contained in:
commit
20c2cfbc12
4 changed files with 78 additions and 108 deletions
|
|
@ -1765,15 +1765,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
|
||||||
|
|
||||||
ps_dec->i4_frametype = -1;
|
ps_dec->i4_frametype = -1;
|
||||||
ps_dec->i4_content_type = -1;
|
ps_dec->i4_content_type = -1;
|
||||||
/*
|
|
||||||
* For field pictures, set the bottom and top picture decoded u4_flag correctly.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
if((TOP_FIELD_ONLY | BOT_FIELD_ONLY) == ps_dec->u1_top_bottom_decoded)
|
|
||||||
{
|
|
||||||
ps_dec->u1_top_bottom_decoded = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ps_dec->u4_slice_start_code_found = 0;
|
ps_dec->u4_slice_start_code_found = 0;
|
||||||
|
|
||||||
/* In case the deocder is not in flush mode(in shared mode),
|
/* In case the deocder is not in flush mode(in shared mode),
|
||||||
|
|
@ -2327,10 +2319,6 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
|
||||||
{
|
{
|
||||||
/* Calling Function to deblock Picture and Display */
|
/* Calling Function to deblock Picture and Display */
|
||||||
ret = ih264d_deblock_display(ps_dec);
|
ret = ih264d_deblock_display(ps_dec);
|
||||||
if(ret != 0)
|
|
||||||
{
|
|
||||||
return IV_FAIL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2427,6 +2415,37 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((TOP_FIELD_ONLY | BOT_FIELD_ONLY) == ps_dec->u1_top_bottom_decoded)
|
||||||
|
{
|
||||||
|
ps_dec->u1_top_bottom_decoded = 0;
|
||||||
|
}
|
||||||
|
/*--------------------------------------------------------------------*/
|
||||||
|
/* Do End of Pic processing. */
|
||||||
|
/* Should be called only if frame was decoded in previous process call*/
|
||||||
|
/*--------------------------------------------------------------------*/
|
||||||
|
if(ps_dec->u4_pic_buf_got == 1)
|
||||||
|
{
|
||||||
|
if(1 == ps_dec->u1_last_pic_not_decoded)
|
||||||
|
{
|
||||||
|
ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
|
||||||
|
|
||||||
|
if(ret != OK)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = ih264d_end_of_pic(ps_dec);
|
||||||
|
if(ret != OK)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = ih264d_end_of_pic(ps_dec);
|
||||||
|
if(ret != OK)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*Data memory barrier instruction,so that yuv write by the library is complete*/
|
/*Data memory barrier instruction,so that yuv write by the library is complete*/
|
||||||
DATA_SYNC();
|
DATA_SYNC();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1459,7 +1459,7 @@ WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,
|
||||||
UWORD32 u1_mbaff = ps_slice->u1_mbaff_frame_flag;
|
UWORD32 u1_mbaff = ps_slice->u1_mbaff_frame_flag;
|
||||||
parse_part_params_t *ps_part_info;
|
parse_part_params_t *ps_part_info;
|
||||||
WORD32 ret;
|
WORD32 ret;
|
||||||
|
UNUSED(u1_is_idr_slice);
|
||||||
|
|
||||||
if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
|
if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
|
||||||
{
|
{
|
||||||
|
|
@ -1476,16 +1476,6 @@ WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,
|
||||||
{
|
{
|
||||||
/* first slice - missing/header corruption */
|
/* first slice - missing/header corruption */
|
||||||
ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
|
ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num;
|
||||||
|
|
||||||
|
|
||||||
if(!ps_dec->u1_first_slice_in_stream)
|
|
||||||
{
|
|
||||||
ih264d_end_of_pic(ps_dec, u1_is_idr_slice,
|
|
||||||
ps_dec->ps_cur_slice->u2_frame_num);
|
|
||||||
ps_dec->s_cur_pic_poc.u2_frame_num =
|
|
||||||
ps_dec->ps_cur_slice->u2_frame_num;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
WORD32 i, j, poc = 0;
|
WORD32 i, j, poc = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -935,15 +935,11 @@ WORD32 ih264d_deblock_display(dec_struct_t *ps_dec)
|
||||||
**************************************************************************
|
**************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec,
|
WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec)
|
||||||
UWORD8 u1_is_idr_slice,
|
|
||||||
UWORD16 u2_frame_num)
|
|
||||||
{
|
{
|
||||||
dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
|
dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
|
||||||
WORD32 ret;
|
WORD32 ret;
|
||||||
|
|
||||||
ps_dec->u2_mbx = 0xffff;
|
|
||||||
ps_dec->u2_mby = 0;
|
|
||||||
{
|
{
|
||||||
dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
|
dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
|
||||||
if(ps_err->u1_err_flag & REJECT_CUR_PIC)
|
if(ps_err->u1_err_flag & REJECT_CUR_PIC)
|
||||||
|
|
@ -957,43 +953,10 @@ WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec,
|
||||||
ret = ih264d_end_of_pic_processing(ps_dec);
|
ret = ih264d_end_of_pic_processing(ps_dec);
|
||||||
if(ret != OK)
|
if(ret != OK)
|
||||||
return ret;
|
return ret;
|
||||||
ps_dec->u2_total_mbs_coded = 0;
|
|
||||||
/*--------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------*/
|
||||||
/* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt */
|
/* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt */
|
||||||
/* Needed to detect end of picture */
|
/* Needed to detect end of picture */
|
||||||
/*--------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------*/
|
||||||
{
|
|
||||||
pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
|
|
||||||
pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
|
|
||||||
if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
|
|
||||||
ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
|
|
||||||
|
|
||||||
if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
|
|
||||||
ps_dec->u2_prev_ref_frame_num = 0;
|
|
||||||
|
|
||||||
if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
|
|
||||||
{
|
|
||||||
ret = ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
|
|
||||||
if(ret != OK)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
|
|
||||||
ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
|
|
||||||
ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
|
|
||||||
if(ps_cur_slice->u1_nal_ref_idc)
|
|
||||||
{
|
|
||||||
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 =
|
|
||||||
ps_cur_poc->i4_delta_pic_order_cnt_bottom;
|
|
||||||
ps_prev_poc->i4_delta_pic_order_cnt[0] =
|
|
||||||
ps_cur_poc->i4_delta_pic_order_cnt[0];
|
|
||||||
ps_prev_poc->i4_delta_pic_order_cnt[1] =
|
|
||||||
ps_cur_poc->i4_delta_pic_order_cnt[1];
|
|
||||||
ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
|
H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
|
||||||
|
|
||||||
|
|
@ -1159,7 +1122,43 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
|
||||||
|
|
||||||
COPYTHECONTEXT("SH: frame_num", u2_frame_num);
|
COPYTHECONTEXT("SH: frame_num", u2_frame_num);
|
||||||
// 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);
|
// 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);
|
||||||
|
if(!ps_dec->u1_first_slice_in_stream && (ps_dec->u4_first_slice_in_pic == 2))
|
||||||
|
{
|
||||||
|
pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
|
||||||
|
pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
|
||||||
|
|
||||||
|
ps_dec->u2_mbx = 0xffff;
|
||||||
|
ps_dec->u2_mby = 0;
|
||||||
|
|
||||||
|
if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
|
||||||
|
ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
|
||||||
|
|
||||||
|
if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
|
||||||
|
ps_dec->u2_prev_ref_frame_num = 0;
|
||||||
|
|
||||||
|
if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
|
||||||
|
{
|
||||||
|
ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
|
||||||
|
ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
|
||||||
|
ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
|
||||||
|
if(ps_cur_slice->u1_nal_ref_idc)
|
||||||
|
{
|
||||||
|
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 =
|
||||||
|
ps_cur_poc->i4_delta_pic_order_cnt_bottom;
|
||||||
|
ps_prev_poc->i4_delta_pic_order_cnt[0] =
|
||||||
|
ps_cur_poc->i4_delta_pic_order_cnt[0];
|
||||||
|
ps_prev_poc->i4_delta_pic_order_cnt[1] =
|
||||||
|
ps_cur_poc->i4_delta_pic_order_cnt[1];
|
||||||
|
ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps_dec->u2_total_mbs_coded = 0;
|
||||||
|
}
|
||||||
/* Get the field related flags */
|
/* Get the field related flags */
|
||||||
if(!ps_seq->u1_frame_mbs_only_flag)
|
if(!ps_seq->u1_frame_mbs_only_flag)
|
||||||
{
|
{
|
||||||
|
|
@ -1271,6 +1270,12 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
|
||||||
u1_nal_unit_type, u4_idr_pic_id,
|
u1_nal_unit_type, u4_idr_pic_id,
|
||||||
u1_field_pic_flag,
|
u1_field_pic_flag,
|
||||||
u1_bottom_field_flag);
|
u1_bottom_field_flag);
|
||||||
|
if(i1_is_end_of_poc)
|
||||||
|
{
|
||||||
|
ps_dec->u1_first_slice_in_stream = 0;
|
||||||
|
return ERROR_INCOMPLETE_FRAME;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------*/
|
||||||
|
|
@ -1425,49 +1430,6 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
|
||||||
}
|
}
|
||||||
ps_dec->u1_slice_header_done = 0;
|
ps_dec->u1_slice_header_done = 0;
|
||||||
|
|
||||||
/*--------------------------------------------------------------------*/
|
|
||||||
/* If the slice is part of new picture, do End of Pic processing. */
|
|
||||||
/*--------------------------------------------------------------------*/
|
|
||||||
if(!ps_dec->u1_first_slice_in_stream)
|
|
||||||
{
|
|
||||||
UWORD8 uc_mbs_exceed = 0;
|
|
||||||
|
|
||||||
if(ps_dec->u2_total_mbs_coded
|
|
||||||
== (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
|
|
||||||
{
|
|
||||||
/*u2_total_mbs_coded is forced to u2_max_mb_addr+ 1 at the end of decode ,so
|
|
||||||
,if it is first slice in pic dont consider u2_total_mbs_coded to detect new picture */
|
|
||||||
if(ps_dec->u4_first_slice_in_pic == 0)
|
|
||||||
uc_mbs_exceed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(i1_is_end_of_poc || uc_mbs_exceed)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(1 == ps_dec->u1_last_pic_not_decoded)
|
|
||||||
{
|
|
||||||
ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
|
|
||||||
|
|
||||||
if(ret != OK)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num);
|
|
||||||
if(ret != OK)
|
|
||||||
return ret;
|
|
||||||
#if WIN32
|
|
||||||
H264_DEC_DEBUG_PRINT(" ------ PIC SKIPPED ------\n");
|
|
||||||
#endif
|
|
||||||
return RET_LAST_SKIP;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num);
|
|
||||||
if(ret != OK)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(u1_field_pic_flag)
|
if(u1_field_pic_flag)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,7 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
|
||||||
UWORD8 u1_nal_ref_idc,
|
UWORD8 u1_nal_ref_idc,
|
||||||
dec_struct_t * ps_dec );
|
dec_struct_t * ps_dec );
|
||||||
|
|
||||||
WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec,
|
WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec);
|
||||||
UWORD8 u1_is_idr_slice,
|
|
||||||
UWORD16 u2_frame_num);
|
|
||||||
WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
|
WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
|
||||||
WORD32 i4_poc,
|
WORD32 i4_poc,
|
||||||
pocstruct_t *ps_temp_poc,
|
pocstruct_t *ps_temp_poc,
|
||||||
|
|
@ -53,4 +51,5 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
|
||||||
WORD32 ih264d_ref_idx_reordering(dec_struct_t * ps_dec, UWORD8 u1_isB);
|
WORD32 ih264d_ref_idx_reordering(dec_struct_t * ps_dec, UWORD8 u1_isB);
|
||||||
WORD32 ih264d_read_mmco_commands(dec_struct_t * ps_dec);
|
WORD32 ih264d_read_mmco_commands(dec_struct_t * ps_dec);
|
||||||
void ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec);
|
void ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec);
|
||||||
|
WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec);
|
||||||
#endif /* _IH264D_PARSE_SLICE_H_ */
|
#endif /* _IH264D_PARSE_SLICE_H_ */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue