diff options
author | Hamsalekha S <hamsalekha.s@ittiam.com> | 2015-07-10 13:41:00 +0530 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2015-07-31 18:52:32 +0000 |
commit | e789d1d2e2f9a8fca00a7bf8fab1afa892422127 (patch) | |
tree | b9d113d6c66da7b36098707dd69da355f105eac5 | |
parent | bbc83b16b9708ff71841c67e98cd973d5d65845a (diff) | |
download | android_external_libavc-e789d1d2e2f9a8fca00a7bf8fab1afa892422127.tar.gz android_external_libavc-e789d1d2e2f9a8fca00a7bf8fab1afa892422127.tar.bz2 android_external_libavc-e789d1d2e2f9a8fca00a7bf8fab1afa892422127.zip |
Decoder: Fixed issues shown by Valgrind
The slice header structure has now been initialized to 0
Fixed bug in closing of threads in the case of error.
Bug: 22860270
Change-Id: I777e0b73ad2f083c72be179984f5c1cb00ededb6
-rw-r--r-- | decoder/ih264d_api.c | 47 | ||||
-rw-r--r-- | decoder/ih264d_utils.c | 2 |
2 files changed, 29 insertions, 20 deletions
diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c index 6ea75c6..6fbd834 100644 --- a/decoder/ih264d_api.c +++ b/decoder/ih264d_api.c @@ -2589,7 +2589,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) UWORD32 cur_slice_is_nonref = 0; UWORD32 u4_next_is_aud; UWORD32 u4_first_start_code_found = 0; - WORD32 ret,api_ret_value = IV_SUCCESS; + WORD32 ret = 0,api_ret_value = IV_SUCCESS; WORD32 header_data_left = 0,frame_data_left = 0; UWORD8 *pu1_bitstrm_buf; ivd_video_decode_ip_t *ps_dec_ip; @@ -3019,24 +3019,12 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) ps_dec_op->u4_error_code = error | ret; api_ret_value = IV_FAIL; - if((ret == IVD_RES_CHANGED) || (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED)) + if((ret == IVD_RES_CHANGED) + || (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED) + || (ret == ERROR_UNAVAIL_PICBUF_T) + || (ret == ERROR_UNAVAIL_MVBUF_T)) { - /*dont consume the SPS*/ - ps_dec_op->u4_num_bytes_consumed -= bytes_consumed; - return IV_FAIL; - } - - if((ret == IVD_RES_CHANGED) || (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED)) - { - /*dont consume the SPS*/ - ps_dec_op->u4_num_bytes_consumed -= bytes_consumed; - return IV_FAIL; - } - - if((ret == ERROR_UNAVAIL_PICBUF_T) || (ret == ERROR_UNAVAIL_MVBUF_T)) - { - ps_dec_op->u4_num_bytes_consumed -= bytes_consumed; - return IV_FAIL; + break; } if((ret == ERROR_INCOMPLETE_FRAME) || (ret == ERROR_DANGLING_FIELD_IN_PIC)) @@ -3094,6 +3082,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) WORD32 num_mb_skipped; WORD32 prev_slice_err; pocstruct_t temp_poc; + WORD32 ret1; num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) - ps_dec->u2_total_mbs_coded; @@ -3103,15 +3092,33 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) else prev_slice_err = 2; - ret = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, ps_dec->u1_nal_unit_type == IDR_SLICE_NAL, ps_dec->ps_cur_slice->u2_frame_num, + ret1 = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, ps_dec->u1_nal_unit_type == IDR_SLICE_NAL, ps_dec->ps_cur_slice->u2_frame_num, &temp_poc, prev_slice_err); - if((ret == ERROR_UNAVAIL_PICBUF_T) || (ret == ERROR_UNAVAIL_MVBUF_T)) + if((ret1 == ERROR_UNAVAIL_PICBUF_T) || (ret1 == ERROR_UNAVAIL_MVBUF_T)) { return IV_FAIL; } } + if((ret == IVD_RES_CHANGED) + || (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED) + || (ret == ERROR_UNAVAIL_PICBUF_T) + || (ret == ERROR_UNAVAIL_MVBUF_T)) + { + + /* signal the decode thread */ + ih264d_signal_decode_thread(ps_dec); + /* close deblock thread if it is not closed yet */ + if(ps_dec->u4_num_cores == 3) + { + ih264d_signal_bs_deblk_thread(ps_dec); + } + /* dont consume bitstream */ + ps_dec_op->u4_num_bytes_consumed -= bytes_consumed; + return IV_FAIL; + } + if(ps_dec->u1_separate_parse) { diff --git a/decoder/ih264d_utils.c b/decoder/ih264d_utils.c index 1581bd6..84909ea 100644 --- a/decoder/ih264d_utils.c +++ b/decoder/ih264d_utils.c @@ -2080,6 +2080,8 @@ WORD16 ih264d_get_memory_dec_params(dec_struct_t * ps_dec) ps_dec->ps_mem_tab[MEM_REC_SLICE_NUM_MAP].pv_base; ps_dec->ps_dec_slice_buf = ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].pv_base; + memset(ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].pv_base, 0, + ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].u4_mem_size); pu1_buf = (UWORD8 *)ps_dec->ps_dec_slice_buf; pu1_buf += sizeof(dec_slice_struct_t) * u4_total_mbs; ps_dec->pv_map_ref_idx_to_poc_buf = (void *)pu1_buf; |