From a78887bcffbc2995cf9ed72e0697acf560875e9e Mon Sep 17 00:00:00 2001 From: Harish Mahendrakar Date: Wed, 1 Jun 2016 13:31:45 +0530 Subject: Decoder: Fix slice number increment for error clips Bug: 28673410 --- decoder/ih264d_api.c | 1 + decoder/ih264d_parse_headers.c | 6 ++++++ decoder/ih264d_parse_pslice.c | 5 ++++- decoder/ih264d_parse_slice.c | 6 ++++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c index e2fa322..bcdd376 100644 --- a/decoder/ih264d_api.c +++ b/decoder/ih264d_api.c @@ -1901,6 +1901,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) ps_dec->u4_dec_thread_created = 0; ps_dec->u4_bs_deblk_thread_created = 0; ps_dec->u4_cur_bs_mb_num = 0; + ps_dec->u4_start_recon_deblk = 0; DEBUG_THREADS_PRINTF(" Starting process call\n"); diff --git a/decoder/ih264d_parse_headers.c b/decoder/ih264d_parse_headers.c index 94ec8a8..1d97071 100644 --- a/decoder/ih264d_parse_headers.c +++ b/decoder/ih264d_parse_headers.c @@ -1038,6 +1038,12 @@ WORD32 ih264d_parse_nal_unit(iv_obj_t *dec_hdl, H264_DEC_DEBUG_PRINT("\nForbidden bit set in Nal Unit, Let's try\n"); } u1_nal_unit_type = NAL_UNIT_TYPE(u1_first_byte); + // if any other nal unit other than slice nal is encountered in between a + // frame break out of loop without consuming header + if((ps_dec->u2_total_mbs_coded != 0) && (u1_nal_unit_type > IDR_SLICE_NAL)) + { + return ERROR_INCOMPLETE_FRAME; + } ps_dec->u1_nal_unit_type = u1_nal_unit_type; u1_nal_ref_idc = (UWORD8)(NAL_REF_IDC(u1_first_byte)); //Skip all NALUs if SPS and PPS are not decoded diff --git a/decoder/ih264d_parse_pslice.c b/decoder/ih264d_parse_pslice.c index a589d84..ca5c393 100644 --- a/decoder/ih264d_parse_pslice.c +++ b/decoder/ih264d_parse_pslice.c @@ -1550,6 +1550,7 @@ WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, } } } + ps_dec->u4_first_slice_in_pic = 0; } else { @@ -1842,11 +1843,13 @@ WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice); - ps_dec->u2_cur_slice_num++; /* incremented here only if first slice is inserted */ if(ps_dec->u4_first_slice_in_pic != 0) + { ps_dec->ps_parse_cur_slice++; + ps_dec->u2_cur_slice_num++; + } ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; diff --git a/decoder/ih264d_parse_slice.c b/decoder/ih264d_parse_slice.c index 5ff92f8..73bc45d 100644 --- a/decoder/ih264d_parse_slice.c +++ b/decoder/ih264d_parse_slice.c @@ -374,6 +374,7 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, 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; @@ -573,7 +574,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, ps_dec->u2_mv_2mb[1] = 0; ps_dec->u1_last_pic_not_decoded = 0; - ps_dec->u2_cur_slice_num = 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; @@ -1425,7 +1425,10 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, } if (ps_dec->u4_first_slice_in_pic == 0) + { ps_dec->ps_parse_cur_slice++; + ps_dec->u2_cur_slice_num++; + } ps_dec->u1_slice_header_done = 0; @@ -1908,7 +1911,6 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, if(ret != OK) return ret; - ps_dec->u2_cur_slice_num++; /* storing last Mb X and MbY of the slice */ ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; -- cgit v1.2.3 From 7554755536019e439433c515eeb44e701fb3bfb2 Mon Sep 17 00:00:00 2001 From: Harish Mahendrakar Date: Thu, 26 May 2016 10:46:21 +0530 Subject: Decoder: Do not conceal slices with invalid SPS/PPS Bug: 28835995 --- decoder/ih264d_api.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c index bcdd376..cef51b0 100644 --- a/decoder/ih264d_api.c +++ b/decoder/ih264d_api.c @@ -2066,8 +2066,10 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) if((ret == IVD_RES_CHANGED) || (ret == IVD_MEM_ALLOC_FAILED) || (ret == ERROR_UNAVAIL_PICBUF_T) - || (ret == ERROR_UNAVAIL_MVBUF_T)) + || (ret == ERROR_UNAVAIL_MVBUF_T) + || (ret == ERROR_INV_SPS_PPS_T)) { + ps_dec->u4_slice_start_code_found = 0; break; } @@ -2149,7 +2151,8 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) if((ret == IVD_RES_CHANGED) || (ret == IVD_MEM_ALLOC_FAILED) || (ret == ERROR_UNAVAIL_PICBUF_T) - || (ret == ERROR_UNAVAIL_MVBUF_T)) + || (ret == ERROR_UNAVAIL_MVBUF_T) + || (ret == ERROR_INV_SPS_PPS_T)) { /* signal the decode thread */ -- cgit v1.2.3 From 326fe991a4b7971e8aeaf4ac775491dd8abd85bb Mon Sep 17 00:00:00 2001 From: Harish Mahendrakar Date: Mon, 13 Jun 2016 11:58:50 +0530 Subject: Decoder: Initialize first_pb_nal_in_pic for error slices first_pb_nal_in_pic was uninitialized for error clips Bug: 29023649 Change-Id: Ie4e0a94059c5f675bf619e31534846e2c2ca58ae --- decoder/ih264d_api.c | 1 + decoder/ih264d_parse_slice.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c index cef51b0..801960b 100644 --- a/decoder/ih264d_api.c +++ b/decoder/ih264d_api.c @@ -1895,6 +1895,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) ps_dec->cur_dec_mb_num = 0; ps_dec->cur_recon_mb_num = 0; ps_dec->u4_first_slice_in_pic = 2; + ps_dec->u1_first_pb_nal_in_pic = 1; ps_dec->u1_slice_header_done = 0; ps_dec->u1_dangling_field = 0; diff --git a/decoder/ih264d_parse_slice.c b/decoder/ih264d_parse_slice.c index 73bc45d..911b11d 100644 --- a/decoder/ih264d_parse_slice.c +++ b/decoder/ih264d_parse_slice.c @@ -940,7 +940,6 @@ WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec, dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; WORD32 ret; - ps_dec->u1_first_pb_nal_in_pic = 1; ps_dec->u2_mbx = 0xffff; ps_dec->u2_mby = 0; { -- cgit v1.2.3