diff options
Diffstat (limited to 'decoder')
-rw-r--r-- | decoder/ihevcd_api.c | 22 | ||||
-rw-r--r-- | decoder/ihevcd_bitstream.c | 2 | ||||
-rw-r--r-- | decoder/ihevcd_cxa.h | 5 | ||||
-rw-r--r-- | decoder/ihevcd_decode.c | 10 | ||||
-rw-r--r-- | decoder/ihevcd_get_mv.c | 8 | ||||
-rw-r--r-- | decoder/ihevcd_nal.c | 2 | ||||
-rw-r--r-- | decoder/ihevcd_parse_headers.c | 398 | ||||
-rw-r--r-- | decoder/ihevcd_parse_residual.c | 4 | ||||
-rw-r--r-- | decoder/ihevcd_parse_slice.c | 8 | ||||
-rw-r--r-- | decoder/ihevcd_parse_slice_header.c | 121 | ||||
-rw-r--r-- | decoder/ihevcd_process_slice.c | 8 | ||||
-rw-r--r-- | decoder/ihevcd_ref_list.c | 2 | ||||
-rw-r--r-- | decoder/ihevcd_sao.c | 30 |
13 files changed, 480 insertions, 140 deletions
diff --git a/decoder/ihevcd_api.c b/decoder/ihevcd_api.c index 8abef0f..134ed31 100644 --- a/decoder/ihevcd_api.c +++ b/decoder/ihevcd_api.c @@ -1169,6 +1169,7 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj, pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(iv_obj_t)); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, sizeof(iv_obj_t)); *pps_codec_obj = (iv_obj_t *)pv_buf; ps_create_op->s_ivd_create_op_t.pv_handle = *pps_codec_obj; @@ -1205,6 +1206,7 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj, size = MAX_PROCESS_THREADS * ithread_get_handle_size(); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); for(i = 0; i < MAX_PROCESS_THREADS; i++) { @@ -1217,6 +1219,7 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj, size = MIN_BITSBUF_SIZE; pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size + 16); //Alloc extra for parse optimization RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size + 16); ps_codec->pu1_bitsbuf_static = pv_buf; ps_codec->u4_bitsbuf_size_static = size; @@ -1224,24 +1227,28 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj, size = sizeof(buf_mgr_t); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pv_disp_buf_mgr = pv_buf; /* size for holding dpb manager context */ size = sizeof(dpb_mgr_t); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pv_dpb_mgr = pv_buf; /* size for holding buffer manager context */ size = sizeof(buf_mgr_t); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pv_pic_buf_mgr = pv_buf; /* size for holding mv buffer manager context */ size = sizeof(buf_mgr_t); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pv_mv_buf_mgr = pv_buf; size = MAX_VPS_CNT * sizeof(vps_t); @@ -1277,6 +1284,7 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj, size = (MAX_SPS_CNT + MAX_PPS_CNT) * size * sizeof(WORD16); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pi2_scaling_mat = (WORD16 *)pv_buf; @@ -1287,6 +1295,7 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj, size = BUF_MGR_MAX_CNT * sizeof(pic_buf_t); pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pv_pic_buf_base = (UWORD8 *)pv_buf; /* TO hold scratch buffers needed for each SAO context */ @@ -1298,6 +1307,7 @@ WORD32 ihevcd_allocate_static_bufs(iv_obj_t **pps_codec_obj, pu1_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pu1_buf), IV_FAIL); + memset(pu1_buf, 0, size); for(i = 0; i < MAX_PROCESS_THREADS; i++) { @@ -1607,6 +1617,7 @@ WORD32 ihevcd_allocate_dynamic_bufs(codec_t *ps_codec) pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pv_proc_jobq_buf = pv_buf; ps_codec->i4_proc_jobq_buf_size = size; @@ -1914,6 +1925,7 @@ WORD32 ihevcd_allocate_dynamic_bufs(codec_t *ps_codec) { pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size + 16); //Alloc extra for parse optimization RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size + 16); ps_codec->pu1_bitsbuf_dynamic = pv_buf; ps_codec->u4_bitsbuf_size_dynamic = size; } @@ -1950,6 +1962,7 @@ WORD32 ihevcd_allocate_dynamic_bufs(codec_t *ps_codec) pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); + memset(pv_buf, 0, size); ps_codec->pv_mv_bank_buf_base = pv_buf; ps_codec->i4_total_mv_bank_size = size; @@ -1969,7 +1982,7 @@ WORD32 ihevcd_allocate_dynamic_bufs(codec_t *ps_codec) size = ihevcd_get_total_pic_buf_size(ps_codec, wd, ht); pv_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pv_buf), IV_FAIL); - + memset(pv_buf, 0, size); ps_codec->i4_total_pic_buf_size = size; ps_codec->pu1_ref_pic_buf_base = (UWORD8 *)pv_buf; @@ -2112,7 +2125,7 @@ WORD32 ihevcd_create(iv_obj_t *ps_codec_obj, } } ps_create_op->s_ivd_create_op_t.u4_error_code = IVD_MEM_ALLOC_FAILED; - ps_create_op->s_ivd_create_op_t.u4_error_code = 1 << IVD_FATALERROR; + ps_create_op->s_ivd_create_op_t.u4_error_code |= 1 << IVD_FATALERROR; return IV_FAIL; } @@ -2229,6 +2242,7 @@ WORD32 ihevcd_set_display_frame(iv_obj_t *ps_codec_obj, pu1_chroma_buf = ps_codec->pf_aligned_alloc(pv_mem_ctxt, 128, size); RETURN_IF((NULL == pu1_chroma_buf), IV_FAIL); + memset(pu1_chroma_buf, 0, size); ps_codec->pu1_cur_chroma_ref_buf = pu1_chroma_buf; } @@ -3140,7 +3154,7 @@ WORD32 ihevcd_get_vui_params(iv_obj_t *ps_codec_obj, ps_op->u4_vui_num_units_in_tick = ps_vui->u4_vui_num_units_in_tick; ps_op->u4_vui_time_scale = ps_vui->u4_vui_time_scale; ps_op->u1_poc_proportional_to_timing_flag = ps_vui->u1_poc_proportional_to_timing_flag; - ps_op->u1_num_ticks_poc_diff_one_minus1 = ps_vui->u1_num_ticks_poc_diff_one_minus1; + ps_op->u4_num_ticks_poc_diff_one_minus1 = ps_vui->u4_num_ticks_poc_diff_one_minus1; ps_op->u1_bitstream_restriction_flag = ps_vui->u1_bitstream_restriction_flag; ps_op->u1_tiles_fixed_structure_flag = ps_vui->u1_tiles_fixed_structure_flag; ps_op->u1_motion_vectors_over_pic_boundaries_flag = ps_vui->u1_motion_vectors_over_pic_boundaries_flag; @@ -3175,7 +3189,7 @@ WORD32 ihevcd_get_vui_params(iv_obj_t *ps_codec_obj, { ps_op->au1_fixed_pic_rate_general_flag[i] = ps_vui->s_vui_hrd_parameters.au1_fixed_pic_rate_general_flag[i]; ps_op->au1_fixed_pic_rate_within_cvs_flag[i] = ps_vui->s_vui_hrd_parameters.au1_fixed_pic_rate_within_cvs_flag[i]; - ps_op->au1_elemental_duration_in_tc_minus1[i] = ps_vui->s_vui_hrd_parameters.au1_elemental_duration_in_tc_minus1[i]; + ps_op->au2_elemental_duration_in_tc_minus1[i] = ps_vui->s_vui_hrd_parameters.au2_elemental_duration_in_tc_minus1[i]; ps_op->au1_low_delay_hrd_flag[i] = ps_vui->s_vui_hrd_parameters.au1_low_delay_hrd_flag[i]; ps_op->au1_cpb_cnt_minus1[i] = ps_vui->s_vui_hrd_parameters.au1_cpb_cnt_minus1[i]; } diff --git a/decoder/ihevcd_bitstream.c b/decoder/ihevcd_bitstream.c index 3b8d24f..21f1b2e 100644 --- a/decoder/ihevcd_bitstream.c +++ b/decoder/ihevcd_bitstream.c @@ -247,8 +247,8 @@ void ihevcd_bits_seek(bitstrm_t *ps_bitstrm, WORD32 numbits) * then subtract abs_numbits from offset and add 32 and move cur_word to nxt_word * and load cur_word appropriately and decrement pu4_buf */ - ps_bitstrm->u4_bit_ofst -= abs_numbits; ps_bitstrm->u4_bit_ofst += 32; + ps_bitstrm->u4_bit_ofst -= abs_numbits; ps_bitstrm->pu4_buf--; val = *(ps_bitstrm->pu4_buf - 2); diff --git a/decoder/ihevcd_cxa.h b/decoder/ihevcd_cxa.h index 21b2023..f81a7eb 100644 --- a/decoder/ihevcd_cxa.h +++ b/decoder/ihevcd_cxa.h @@ -45,6 +45,7 @@ extern "C" { /*****************************************************************************/ /* Constant Macros */ /*****************************************************************************/ +#define IVD_ERROR_MASK 0xFF /*****************************************************************************/ /* Function Macros */ @@ -787,7 +788,7 @@ typedef struct { * num_ticks_poc_diff_one_minus1 plus 1 specifies the number of clock ticks * corresponding to a difference of poc values equal to 1 */ - UWORD8 u1_num_ticks_poc_diff_one_minus1; + UWORD32 u4_num_ticks_poc_diff_one_minus1; /** * 1, specifies that the following cvs bitstream restriction parameters are present @@ -955,7 +956,7 @@ typedef struct { * element units that specify HRD output times of consecutive pictures in output order is constrained * refer to Table E-6 */ - UWORD8 au1_elemental_duration_in_tc_minus1[6]; + UWORD16 au2_elemental_duration_in_tc_minus1[6]; /** * specifies the HRD operational mode diff --git a/decoder/ihevcd_decode.c b/decoder/ihevcd_decode.c index d2ea7a5..1295687 100644 --- a/decoder/ihevcd_decode.c +++ b/decoder/ihevcd_decode.c @@ -137,6 +137,10 @@ static UWORD32 ihevcd_map_error(IHEVCD_ERROR_T e_error) case IHEVCD_NUM_EXTRA_DISP_UNSUPPORTED: case IHEVCD_INSUFFICIENT_MEM_MVBANK: case IHEVCD_INSUFFICIENT_MEM_PICBUF: + case IHEVCD_UNSUPPORTED_CHROMA_FMT_IDC: + case IHEVCD_UNSUPPORTED_BIT_DEPTH: + case IVD_MEM_ALLOC_FAILED: + case IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED: error_code |= 1 << IVD_FATALERROR; break; case IHEVCD_INVALID_DISP_STRD: @@ -144,8 +148,6 @@ static UWORD32 ihevcd_map_error(IHEVCD_ERROR_T e_error) case IHEVCD_UNSUPPORTED_VPS_ID: case IHEVCD_UNSUPPORTED_SPS_ID: case IHEVCD_UNSUPPORTED_PPS_ID: - case IHEVCD_UNSUPPORTED_CHROMA_FMT_IDC: - case IHEVCD_UNSUPPORTED_BIT_DEPTH: case IHEVCD_BUF_MGR_ERROR: case IHEVCD_NO_FREE_MVBANK: case IHEVCD_NO_FREE_PICBUF: @@ -389,6 +391,8 @@ WORD32 ihevcd_decode(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op) /* Initialize error code */ ps_codec->i4_error_code = 0; + /* Initialize bytes remaining */ + ps_codec->i4_bytes_remaining = 0; ps_dec_ip = (ivd_video_decode_ip_t *)pv_api_ip; ps_dec_op = (ivd_video_decode_op_t *)pv_api_op; @@ -715,7 +719,7 @@ WORD32 ihevcd_decode(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op) /* Free any dynamic buffers that are allocated */ ihevcd_free_dynamic_bufs(ps_codec); ps_codec->i4_error_code = IVD_MEM_ALLOC_FAILED; - ps_dec_op->u4_error_code |= 1 << IVD_FATALERROR; + ps_dec_op->u4_error_code = 1 << IVD_FATALERROR; ps_dec_op->u4_error_code |= IVD_MEM_ALLOC_FAILED; return IV_FAIL; diff --git a/decoder/ihevcd_get_mv.c b/decoder/ihevcd_get_mv.c index 25ddbd9..5914ed4 100644 --- a/decoder/ihevcd_get_mv.c +++ b/decoder/ihevcd_get_mv.c @@ -509,13 +509,17 @@ WORD32 ihevcd_get_mv_ctb(mv_ctxt_t *ps_mv_ctxt, WORD32 ctb_row, ctb_col, index_pic_map, index_nbr_map; WORD32 first_pu_of_ctb; first_pu_of_ctb = pu4_nbr_pu_idx[1 + nbr_pu_idx_strd]; + UWORD32 cur_ctb_ht_in_min_pu = MIN(((ps_sps->i2_pic_height_in_luma_samples + - (ps_mv_ctxt->i4_ctb_y << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu); + UWORD32 cur_ctb_wd_in_min_pu = MIN(((ps_sps->i2_pic_width_in_luma_samples + - (ps_mv_ctxt->i4_ctb_x << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu); index_pic_map = 0 * ctb_size_in_min_pu + 0; index_nbr_map = (0 + 1) * nbr_pu_idx_strd + (0 + 1); - for(ctb_row = 0; ctb_row < ctb_size_in_min_pu; ctb_row++) + for(ctb_row = 0; ctb_row < cur_ctb_ht_in_min_pu; ctb_row++) { - for(ctb_col = 0; ctb_col < ctb_size_in_min_pu; ctb_col++) + for(ctb_col = 0; ctb_col < cur_ctb_wd_in_min_pu; ctb_col++) { pu1_pic_pu_map_ctb[index_pic_map + ctb_col] = pu4_nbr_pu_idx[index_nbr_map + ctb_col] - first_pu_of_ctb; diff --git a/decoder/ihevcd_nal.c b/decoder/ihevcd_nal.c index d00050d..18d9a5d 100644 --- a/decoder/ihevcd_nal.c +++ b/decoder/ihevcd_nal.c @@ -301,7 +301,7 @@ IHEVCD_ERROR_T ihevcd_nal_unit_header(bitstrm_t *ps_bitstrm, nal_header_t *ps_na unused = ihevcd_bits_get(ps_bitstrm, 6); /* Syntax : nuh_temporal_id_plus1 */ - ps_nal->i1_nuh_temporal_id = ihevcd_bits_get(ps_bitstrm, 3) - 1; + ps_nal->i1_nuh_temporal_id = (WORD32)ihevcd_bits_get(ps_bitstrm, 3) - 1; return ret; diff --git a/decoder/ihevcd_parse_headers.c b/decoder/ihevcd_parse_headers.c index 09f343c..e16a9e6 100644 --- a/decoder/ihevcd_parse_headers.c +++ b/decoder/ihevcd_parse_headers.c @@ -42,6 +42,8 @@ #include <stdlib.h> #include <string.h> #include <assert.h> +#include <limits.h> +#include <stdint.h> #include "ihevc_typedefs.h" #include "iv.h" @@ -150,17 +152,27 @@ WORD32 ihevcd_parse_pred_wt_ofst(bitstrm_t *ps_bitstrm, { IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; WORD32 value; + UWORD32 u4_value; WORD32 i; pred_wt_ofst_t *ps_wt_ofst = &ps_slice_hdr->s_wt_ofst; UNUSED(ps_pps); - UEV_PARSE("luma_log2_weight_denom", value, ps_bitstrm); - ps_wt_ofst->i1_luma_log2_weight_denom = value; + UEV_PARSE("luma_log2_weight_denom", u4_value, ps_bitstrm); + if(u4_value > 7) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_wt_ofst->i1_luma_log2_weight_denom = u4_value; if(ps_sps->i1_chroma_format_idc != 0) { SEV_PARSE("delta_chroma_log2_weight_denom", value, ps_bitstrm); + if(((ps_wt_ofst->i1_luma_log2_weight_denom + value) < 0) || + ((ps_wt_ofst->i1_luma_log2_weight_denom + value) > 7)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i1_chroma_log2_weight_denom = ps_wt_ofst->i1_luma_log2_weight_denom + value; } @@ -194,11 +206,18 @@ WORD32 ihevcd_parse_pred_wt_ofst(bitstrm_t *ps_bitstrm, if(ps_wt_ofst->i1_luma_weight_l0_flag[i]) { SEV_PARSE("delta_luma_weight_l0[ i ]", value, ps_bitstrm); - + if( value < -128 || value > 127 ) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_luma_weight_l0[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom) + value; SEV_PARSE("luma_offset_l0[ i ]", value, ps_bitstrm); + if( value < -128 || value > 127 ) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_luma_offset_l0[i] = value; } @@ -212,20 +231,36 @@ WORD32 ihevcd_parse_pred_wt_ofst(bitstrm_t *ps_bitstrm, WORD32 ofst; WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1)); SEV_PARSE("delta_chroma_weight_l0[ i ][ j ]", value, ps_bitstrm); + if(value < -128 || value > 127) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_chroma_weight_l0_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value; SEV_PARSE("delta_chroma_offset_l0[ i ][ j ]", value, ps_bitstrm); + if( value < -512 || value > 511 ) + { + return IHEVCD_INVALID_PARAMETER; + } ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l0_cb[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); ofst = value - ofst + shift; ps_wt_ofst->i2_chroma_offset_l0_cb[i] = CLIP_S8(ofst); SEV_PARSE("delta_chroma_weight_l0[ i ][ j ]", value, ps_bitstrm); + if(value < -128 || value > 127) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_chroma_weight_l0_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value; SEV_PARSE("delta_chroma_offset_l0[ i ][ j ]", value, ps_bitstrm); + if( value < -512 || value > 511 ) + { + return IHEVCD_INVALID_PARAMETER; + } ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l0_cr[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); ofst = value - ofst + shift; @@ -270,11 +305,18 @@ WORD32 ihevcd_parse_pred_wt_ofst(bitstrm_t *ps_bitstrm, if(ps_wt_ofst->i1_luma_weight_l1_flag[i]) { SEV_PARSE("delta_luma_weight_l1[ i ]", value, ps_bitstrm); - + if( value < -128 || value > 127 ) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_luma_weight_l1[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom) + value; SEV_PARSE("luma_offset_l1[ i ]", value, ps_bitstrm); + if( value < -128 || value > 127 ) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_luma_offset_l1[i] = value; } @@ -289,20 +331,36 @@ WORD32 ihevcd_parse_pred_wt_ofst(bitstrm_t *ps_bitstrm, WORD32 ofst; WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1)); SEV_PARSE("delta_chroma_weight_l1[ i ][ j ]", value, ps_bitstrm); + if(value < -128 || value > 127) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_chroma_weight_l1_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value;; SEV_PARSE("delta_chroma_offset_l1[ i ][ j ]", value, ps_bitstrm); + if( value < -512 || value > 511 ) + { + return IHEVCD_INVALID_PARAMETER; + } ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l1_cb[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); ofst = value - ofst + shift; ps_wt_ofst->i2_chroma_offset_l1_cb[i] = CLIP_S8(ofst);; SEV_PARSE("delta_chroma_weight_l1[ i ][ j ]", value, ps_bitstrm); + if(value < -128 || value > 127) + { + return IHEVCD_INVALID_PARAMETER; + } ps_wt_ofst->i2_chroma_weight_l1_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value; SEV_PARSE("delta_chroma_offset_l1[ i ][ j ]", value, ps_bitstrm); + if( value < -512 || value > 511 ) + { + return IHEVCD_INVALID_PARAMETER; + } ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l1_cr[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); ofst = value - ofst + shift; @@ -358,7 +416,7 @@ IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm, stref_picset_t *ps_stref_picset) { IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; - WORD32 value; + UWORD32 value; stref_picset_t *ps_stref_picset_ref; WORD32 delta_idx, delta_rps; WORD32 r_idx; @@ -383,6 +441,10 @@ IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm, if(idx == num_short_term_ref_pic_sets) { UEV_PARSE("delta_idx_minus1", value, ps_bitstrm); + if(value > num_short_term_ref_pic_sets - 1) + { + return IHEVCD_INVALID_PARAMETER; + } delta_idx = value + 1; } else @@ -398,6 +460,10 @@ IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm, delta_rps_sign = value; UEV_PARSE("abs_delta_rps_minus1", value, ps_bitstrm); + if(value > 32767) + { + return IHEVCD_INVALID_PARAMETER; + } abs_delta_rps = value + 1; delta_rps = (1 - 2 * delta_rps_sign) * (abs_delta_rps); @@ -492,16 +558,18 @@ IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm, WORD32 poc; UEV_PARSE("num_negative_pics", value, ps_bitstrm); + if(value > MAX_DPB_SIZE - 1) + { + return IHEVCD_INVALID_PARAMETER; + } ps_stref_picset->i1_num_neg_pics = value; - ps_stref_picset->i1_num_neg_pics = CLIP3(ps_stref_picset->i1_num_neg_pics, - 0, - MAX_DPB_SIZE - 1); UEV_PARSE("num_positive_pics", value, ps_bitstrm); + if(value > (MAX_DPB_SIZE - 1 - ps_stref_picset->i1_num_neg_pics)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_stref_picset->i1_num_pos_pics = value; - ps_stref_picset->i1_num_pos_pics = CLIP3(ps_stref_picset->i1_num_pos_pics, - 0, - (MAX_DPB_SIZE - 1 - ps_stref_picset->i1_num_neg_pics)); ps_stref_picset->i1_num_delta_pocs = ps_stref_picset->i1_num_neg_pics + @@ -511,7 +579,11 @@ IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm, for(i = 0; i < ps_stref_picset->i1_num_neg_pics; i++) { UEV_PARSE("delta_poc_s0_minus1", value, ps_bitstrm); - poc = prev_poc - (value + 1); + if(value > 32767) + { + return IHEVCD_INVALID_PARAMETER; + } + poc = prev_poc - ((WORD32)(value + 1)); prev_poc = poc; ps_stref_picset->ai2_delta_poc[i] = poc; @@ -525,6 +597,10 @@ IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm, i++) { UEV_PARSE("delta_poc_s1_minus1", value, ps_bitstrm); + if(value > 32767) + { + return IHEVCD_INVALID_PARAMETER; + } poc = prev_poc + (value + 1); prev_poc = poc; ps_stref_picset->ai2_delta_poc[i] = poc; @@ -551,12 +627,27 @@ static WORD32 ihevcd_parse_sub_layer_hrd_parameters(bitstrm_t *ps_bitstrm, for(i = 0; i <= cpb_cnt; i++) { UEV_PARSE("bit_rate_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i], ps_bitstrm); + if(ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i] > UINT_MAX - 1) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("cpb_size_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i], ps_bitstrm); - + if(ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i] > UINT_MAX - 1) + { + return IHEVCD_INVALID_PARAMETER; + } if(sub_pic_cpb_params_present_flag) { UEV_PARSE("cpb_size_du_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i], ps_bitstrm); + if(ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i] > UINT_MAX - 1) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("bit_rate_du_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i], ps_bitstrm); + if(ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i] > UINT_MAX - 1) + { + return IHEVCD_INVALID_PARAMETER; + } } BITS_PARSE("cbr_flag[ i ]", ps_sub_layer_hrd_params->au1_cbr_flag[i], ps_bitstrm, 1); } @@ -624,7 +715,7 @@ static WORD32 ihevcd_parse_hrd_parameters(bitstrm_t *ps_bitstrm, BITS_PARSE("fixed_pic_rate_general_flag[ i ]", ps_hrd->au1_fixed_pic_rate_general_flag[i], ps_bitstrm, 1); ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i] = 1; - ps_hrd->au1_elemental_duration_in_tc_minus1[i] = 0; + ps_hrd->au2_elemental_duration_in_tc_minus1[i] = 0; ps_hrd->au1_low_delay_hrd_flag[i] = 0; ps_hrd->au1_cpb_cnt_minus1[i] = 0; @@ -633,7 +724,11 @@ static WORD32 ihevcd_parse_hrd_parameters(bitstrm_t *ps_bitstrm, if(ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i]) { - UEV_PARSE("elemental_duration_in_tc_minus1[ i ]", ps_hrd->au1_elemental_duration_in_tc_minus1[i], ps_bitstrm); + UEV_PARSE("elemental_duration_in_tc_minus1[ i ]", ps_hrd->au2_elemental_duration_in_tc_minus1[i], ps_bitstrm); + if(ps_hrd->au2_elemental_duration_in_tc_minus1[i] > 2047) + { + return IHEVCD_INVALID_PARAMETER; + } } else { @@ -641,10 +736,13 @@ static WORD32 ihevcd_parse_hrd_parameters(bitstrm_t *ps_bitstrm, } if(!ps_hrd->au1_low_delay_hrd_flag[i]) + { UEV_PARSE("cpb_cnt_minus1[ i ]", ps_hrd->au1_cpb_cnt_minus1[i], ps_bitstrm); - - if(ps_hrd->au1_cpb_cnt_minus1[i] >= (MAX_CPB_CNT - 1)) - return IHEVCD_INVALID_PARAMETER; + if(ps_hrd->au1_cpb_cnt_minus1[i] > (MAX_CPB_CNT - 1)) + { + return IHEVCD_INVALID_PARAMETER; + } + } if(ps_hrd->u1_nal_hrd_parameters_present_flag) ihevcd_parse_sub_layer_hrd_parameters(ps_bitstrm, @@ -791,7 +889,15 @@ static WORD32 ihevcd_parse_vui_parameters(bitstrm_t *ps_bitstrm, if(ps_vui->u1_chroma_loc_info_present_flag) { UEV_PARSE("chroma_sample_loc_type_top_field", ps_vui->u1_chroma_sample_loc_type_top_field, ps_bitstrm); + if(ps_vui->u1_chroma_sample_loc_type_top_field > CHROMA_FMT_IDC_YUV444_PLANES + 1) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("chroma_sample_loc_type_bottom_field", ps_vui->u1_chroma_sample_loc_type_bottom_field, ps_bitstrm); + if(ps_vui->u1_chroma_sample_loc_type_bottom_field > CHROMA_FMT_IDC_YUV444_PLANES + 1) + { + return IHEVCD_INVALID_PARAMETER; + } } BITS_PARSE("neutral_chroma_indication_flag", ps_vui->u1_neutral_chroma_indication_flag, ps_bitstrm, 1); @@ -817,8 +923,13 @@ static WORD32 ihevcd_parse_vui_parameters(bitstrm_t *ps_bitstrm, BITS_PARSE("vui_time_scale", ps_vui->u4_vui_time_scale, ps_bitstrm, 32); BITS_PARSE("vui_poc_proportional_to_timing_flag", ps_vui->u1_poc_proportional_to_timing_flag, ps_bitstrm, 1); if(ps_vui->u1_poc_proportional_to_timing_flag) - UEV_PARSE("vui_num_ticks_poc_diff_one_minus1", ps_vui->u1_num_ticks_poc_diff_one_minus1, ps_bitstrm); - + { + UEV_PARSE("vui_num_ticks_poc_diff_one_minus1", ps_vui->u4_num_ticks_poc_diff_one_minus1, ps_bitstrm); + if(ps_vui->u4_num_ticks_poc_diff_one_minus1 > UINT_MAX - 1) + { + return IHEVCD_INVALID_PARAMETER; + } + } BITS_PARSE("vui_hrd_parameters_present_flag", ps_vui->u1_vui_hrd_parameters_present_flag, ps_bitstrm, 1); if(ps_vui->u1_vui_hrd_parameters_present_flag) { @@ -843,10 +954,30 @@ static WORD32 ihevcd_parse_vui_parameters(bitstrm_t *ps_bitstrm, BITS_PARSE("restricted_ref_pic_lists_flag", ps_vui->u1_restricted_ref_pic_lists_flag, ps_bitstrm, 1); UEV_PARSE("min_spatial_segmentation_idc", ps_vui->u4_min_spatial_segmentation_idc, ps_bitstrm); + if(ps_vui->u4_min_spatial_segmentation_idc > 4095) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("max_bytes_per_pic_denom", ps_vui->u1_max_bytes_per_pic_denom, ps_bitstrm); + if(ps_vui->u1_max_bytes_per_pic_denom > 16) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("max_bits_per_min_cu_denom", ps_vui->u1_max_bits_per_mincu_denom, ps_bitstrm); + if(ps_vui->u1_max_bits_per_mincu_denom > 16) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("log2_max_mv_length_horizontal", ps_vui->u1_log2_max_mv_length_horizontal, ps_bitstrm); + if(ps_vui->u1_max_bits_per_mincu_denom > 16) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("log2_max_mv_length_vertical", ps_vui->u1_log2_max_mv_length_vertical, ps_bitstrm); + if(ps_vui->u1_max_bits_per_mincu_denom > 15) + { + return IHEVCD_INVALID_PARAMETER; + } } return ret; @@ -1036,6 +1167,7 @@ IHEVCD_ERROR_T ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_ WORD32 size_id; WORD32 matrix_id; WORD32 value, dc_value = 0; + UWORD32 u4_value; WORD32 next_coef; WORD32 coef_num; WORD32 i, j, offset; @@ -1058,13 +1190,16 @@ IHEVCD_ERROR_T ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_ if(!scaling_list_pred_mode_flag) { WORD32 num_elements; - UEV_PARSE("scaling_list_pred_matrix_id_delta", value, + UEV_PARSE("scaling_list_pred_matrix_id_delta", u4_value, ps_bitstrm); - value = CLIP3(value, 0, matrix_id); + if(u4_value > matrix_id) + { + return IHEVCD_INVALID_PARAMETER; + } num_elements = (1 << (4 + (size_id << 1))); - if(0 != value) - memcpy(pi2_scaling_mat_offset, pi2_scaling_mat_offset - value * num_elements, num_elements * sizeof(WORD16)); + if(0 != u4_value) + memmove(pi2_scaling_mat_offset, pi2_scaling_mat_offset - u4_value * num_elements, num_elements * sizeof(WORD16)); } else { @@ -1075,7 +1210,10 @@ IHEVCD_ERROR_T ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_ { SEV_PARSE("scaling_list_dc_coef_minus8", value, ps_bitstrm); - + if(value < -7 || value > 247) + { + return IHEVCD_INVALID_PARAMETER; + } next_coef = value + 8; dc_value = next_coef; } @@ -1087,6 +1225,10 @@ IHEVCD_ERROR_T ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_ { SEV_PARSE("scaling_list_delta_coef", scaling_list_delta_coef, ps_bitstrm); + if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255)) + { + return IHEVCD_INVALID_PARAMETER; + } next_coef = (next_coef + scaling_list_delta_coef + 256) % 256; pi2_scaling_mat_offset[scan_table[i]] = next_coef; @@ -1100,6 +1242,10 @@ IHEVCD_ERROR_T ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_ { SEV_PARSE("scaling_list_delta_coef", scaling_list_delta_coef, ps_bitstrm); + if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255)) + { + return IHEVCD_INVALID_PARAMETER; + } next_coef = (next_coef + scaling_list_delta_coef + 256) % 256; @@ -1120,6 +1266,10 @@ IHEVCD_ERROR_T ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_ { SEV_PARSE("scaling_list_delta_coef", scaling_list_delta_coef, ps_bitstrm); + if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255)) + { + return IHEVCD_INVALID_PARAMETER; + } next_coef = (next_coef + scaling_list_delta_coef + 256) % 256; @@ -1169,7 +1319,7 @@ IHEVCD_ERROR_T ihevcd_parse_vps(codec_t *ps_codec) { IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; WORD32 i; - WORD32 value; + UWORD32 value; WORD32 vps_id; vps_t *ps_vps; bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm; @@ -1196,6 +1346,10 @@ IHEVCD_ERROR_T ihevcd_parse_vps(codec_t *ps_codec) BITS_PARSE("vps_max_sub_layers_minus1", value, ps_bitstrm, 3); + if(value > SPS_MAX_SUB_LAYERS - 1) + { + return IHEVCD_INVALID_PARAMETER; + } ps_vps->i1_vps_max_sub_layers = value + 1; ASSERT(ps_vps->i1_vps_max_sub_layers < VPS_MAX_SUB_LAYERS); @@ -1216,13 +1370,25 @@ IHEVCD_ERROR_T ihevcd_parse_vps(codec_t *ps_codec) for(; i < ps_vps->i1_vps_max_sub_layers; i++) { UEV_PARSE("vps_max_dec_pic_buffering[i]", value, ps_bitstrm); + if(value > MAX_DPB_SIZE) + { + return IHEVCD_INVALID_PARAMETER; + } ps_vps->ai1_vps_max_dec_pic_buffering[i] = value; /* vps_num_reorder_pics (no max) used in print in order to match with HM */ UEV_PARSE("vps_num_reorder_pics[i]", value, ps_bitstrm); + if(value >= ps_vps->ai1_vps_max_dec_pic_buffering[i]) + { + return IHEVCD_INVALID_PARAMETER; + } ps_vps->ai1_vps_max_num_reorder_pics[i] = value; UEV_PARSE("vps_max_latency_increase[i]", value, ps_bitstrm); + if(value > UINT_MAX - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_vps->ai1_vps_max_latency_increase[i] = value; } @@ -1232,6 +1398,10 @@ IHEVCD_ERROR_T ihevcd_parse_vps(codec_t *ps_codec) //ps_vps->i1_vps_max_layer_id = value; UEV_PARSE("vps_num_layer_sets_minus1", value, ps_bitstrm); + if(value > 1023) + { + return IHEVCD_INVALID_PARAMETER; + } //ps_vps->i1_vps_num_layer_sets = value + 1; BITS_PARSE("vps_timing_info_present_flag", value, ps_bitstrm, 1); @@ -1267,7 +1437,7 @@ IHEVCD_ERROR_T ihevcd_parse_vps(codec_t *ps_codec) IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) { IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; - WORD32 value; + UWORD32 value; WORD32 i; WORD32 vps_id; @@ -1281,12 +1451,18 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) BITS_PARSE("video_parameter_set_id", value, ps_bitstrm, 4); + if(value > MAX_VPS_CNT - 1) + { + return IHEVCD_INVALID_PARAMETER; + } vps_id = value; - vps_id = CLIP3(vps_id, 0, MAX_VPS_CNT - 1); BITS_PARSE("sps_max_sub_layers_minus1", value, ps_bitstrm, 3); + if(value > SPS_MAX_SUB_LAYERS - 1) + { + return IHEVCD_INVALID_PARAMETER; + } sps_max_sub_layers = value + 1; - sps_max_sub_layers = CLIP3(sps_max_sub_layers, 1, 7); BITS_PARSE("sps_temporal_id_nesting_flag", value, ps_bitstrm, 1); sps_temporal_id_nesting_flag = value; @@ -1297,7 +1473,6 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) UEV_PARSE("seq_parameter_set_id", value, ps_bitstrm); sps_id = value; - if((sps_id >= MAX_SPS_CNT) || (sps_id < 0)) { if(ps_codec->i4_sps_done) @@ -1322,6 +1497,10 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) memcpy(&ps_sps->s_ptl, &s_ptl, sizeof(profile_tier_lvl_info_t)); UEV_PARSE("chroma_format_idc", value, ps_bitstrm); + if(value > 3) + { + return IHEVCD_INVALID_PARAMETER; + } ps_sps->i1_chroma_format_idc = value; if(ps_sps->i1_chroma_format_idc != CHROMA_FMT_IDC_YUV420) @@ -1341,9 +1520,17 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) } UEV_PARSE("pic_width_in_luma_samples", value, ps_bitstrm); + if(value > INT16_MAX) + { + return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; + } ps_sps->i2_pic_width_in_luma_samples = value; UEV_PARSE("pic_height_in_luma_samples", value, ps_bitstrm); + if(value > INT16_MAX) + { + return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; + } ps_sps->i2_pic_height_in_luma_samples = value; if((0 >= ps_sps->i2_pic_width_in_luma_samples) || (0 >= ps_sps->i2_pic_height_in_luma_samples)) @@ -1356,28 +1543,28 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) { UEV_PARSE("pic_crop_left_offset", value, ps_bitstrm); - if (value < 0 || value >= ps_sps->i2_pic_width_in_luma_samples) + if (value >= ps_sps->i2_pic_width_in_luma_samples) { return IHEVCD_INVALID_PARAMETER; } ps_sps->i2_pic_crop_left_offset = value; UEV_PARSE("pic_crop_right_offset", value, ps_bitstrm); - if (value < 0 || value >= ps_sps->i2_pic_width_in_luma_samples) + if (value >= ps_sps->i2_pic_width_in_luma_samples) { return IHEVCD_INVALID_PARAMETER; } ps_sps->i2_pic_crop_right_offset = value; UEV_PARSE("pic_crop_top_offset", value, ps_bitstrm); - if (value < 0 || value >= ps_sps->i2_pic_height_in_luma_samples) + if (value >= ps_sps->i2_pic_height_in_luma_samples) { return IHEVCD_INVALID_PARAMETER; } ps_sps->i2_pic_crop_top_offset = value; UEV_PARSE("pic_crop_bottom_offset", value, ps_bitstrm); - if (value < 0 || value >= ps_sps->i2_pic_height_in_luma_samples) + if (value >= ps_sps->i2_pic_height_in_luma_samples) { return IHEVCD_INVALID_PARAMETER; } @@ -1401,11 +1588,12 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) return IHEVCD_UNSUPPORTED_BIT_DEPTH; UEV_PARSE("log2_max_pic_order_cnt_lsb_minus4", value, ps_bitstrm); - if(value < 0 || value > 12) + if(value > 12) return IHEVCD_INVALID_PARAMETER; ps_sps->i1_log2_max_pic_order_cnt_lsb = value + 4; BITS_PARSE("sps_sub_layer_ordering_info_present_flag", value, ps_bitstrm, 1); + ps_sps->i1_sps_sub_layer_ordering_info_present_flag = value; @@ -1413,20 +1601,24 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) for(; i < ps_sps->i1_sps_max_sub_layers; i++) { UEV_PARSE("max_dec_pic_buffering", value, ps_bitstrm); - if(value < 0 || (value + 1) > MAX_DPB_SIZE) + if(value > (MAX_DPB_SIZE - 1)) { return IHEVCD_INVALID_PARAMETER; } ps_sps->ai1_sps_max_dec_pic_buffering[i] = value + 1; UEV_PARSE("num_reorder_pics", value, ps_bitstrm); - if(value < 0 || value > ps_sps->ai1_sps_max_dec_pic_buffering[i]) + if(value >= ps_sps->ai1_sps_max_dec_pic_buffering[i]) { return IHEVCD_INVALID_PARAMETER; } ps_sps->ai1_sps_max_num_reorder_pics[i] = value; UEV_PARSE("max_latency_increase", value, ps_bitstrm); + if(value > UINT_MAX - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_sps->ai1_sps_max_latency_increase[i] = value; } @@ -1464,15 +1656,25 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) return IHEVCD_INVALID_PARAMETER; } ps_sps->i1_log2_min_coding_block_size = value + 3; + if((ps_sps->i2_pic_width_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0) || + (ps_sps->i2_pic_height_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0)) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("log2_diff_max_min_coding_block_size", value, ps_bitstrm); - if(value > (LOG2_MAX_CU_SIZE - LOG2_MIN_CU_SIZE)) + if(value > (LOG2_MAX_CU_SIZE - ps_sps->i1_log2_min_coding_block_size)) { return IHEVCD_INVALID_PARAMETER; } ps_sps->i1_log2_diff_max_min_coding_block_size = value; ctb_log2_size_y = ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size; + + if((ctb_log2_size_y < LOG2_MIN_CTB_SIZE) || (ctb_log2_size_y > LOG2_MAX_CTB_SIZE)) + { + return IHEVCD_INVALID_PARAMETER; + } /* Check if CTB size is different in case of multiple SPS with same ID */ { sps_t *ps_sps_old = (ps_codec->s_parse.ps_sps_base + sps_id); @@ -1486,6 +1688,8 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) return (IHEVCD_ERROR_T)IVD_RES_CHANGED; } } + ps_sps->i1_log2_ctb_size = ctb_log2_size_y; + UEV_PARSE("log2_min_transform_block_size_minus2", value, ps_bitstrm); if(value > (LOG2_MAX_TU_SIZE - 2)) { @@ -1498,7 +1702,7 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) } UEV_PARSE("log2_diff_max_min_transform_block_size", value, ps_bitstrm); - if(value > (LOG2_MAX_TU_SIZE - LOG2_MIN_TU_SIZE)) + if(value > (LOG2_MAX_TU_SIZE - ps_sps->i1_log2_min_transform_block_size)) { return IHEVCD_INVALID_PARAMETER; } @@ -1507,23 +1711,7 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) ps_sps->i1_log2_max_transform_block_size = ps_sps->i1_log2_min_transform_block_size + ps_sps->i1_log2_diff_max_min_transform_block_size; - if ((ps_sps->i1_log2_max_transform_block_size < 0) || - (ps_sps->i1_log2_max_transform_block_size > MIN(ctb_log2_size_y, 5))) - { - return IHEVCD_INVALID_PARAMETER; - } - - ps_sps->i1_log2_ctb_size = ps_sps->i1_log2_min_coding_block_size + - ps_sps->i1_log2_diff_max_min_coding_block_size; - - if((ps_sps->i1_log2_min_coding_block_size < 3) || - (ps_sps->i1_log2_min_transform_block_size < 2) || - (ps_sps->i1_log2_diff_max_min_transform_block_size < 0) || - (ps_sps->i1_log2_max_transform_block_size > ps_sps->i1_log2_ctb_size) || - (ps_sps->i1_log2_ctb_size < 4) || - (ps_sps->i1_log2_ctb_size > 6) || - (ps_sps->i2_pic_width_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0) || - (ps_sps->i2_pic_height_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0)) + if(ps_sps->i1_log2_max_transform_block_size > ps_sps->i1_log2_ctb_size) { return IHEVCD_INVALID_PARAMETER; } @@ -1532,14 +1720,14 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) ps_sps->i1_log2_diff_max_min_pcm_coding_block_size = 0; UEV_PARSE("max_transform_hierarchy_depth_inter", value, ps_bitstrm); - if(value < 0 || value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size)) + if(value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size)) { return IHEVCD_INVALID_PARAMETER; } ps_sps->i1_max_transform_hierarchy_depth_inter = value; UEV_PARSE("max_transform_hierarchy_depth_intra", value, ps_bitstrm); - if(value < 0 || value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size)) + if(value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size)) { return IHEVCD_INVALID_PARAMETER; } @@ -1581,16 +1769,24 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) ps_sps->i1_pcm_sample_bit_depth_chroma = value + 1; UEV_PARSE("log2_min_pcm_coding_block_size_minus3", value, ps_bitstrm); + if(value < (ps_sps->i1_log2_min_coding_block_size - 3) || value > (MIN(ctb_log2_size_y, 5) - 3)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_sps->i1_log2_min_pcm_coding_block_size = value + 3; UEV_PARSE("log2_diff_max_min_pcm_coding_block_size", value, ps_bitstrm); + if(value > MIN(ctb_log2_size_y, 5) - ps_sps->i1_log2_min_pcm_coding_block_size) + { + return IHEVCD_INVALID_PARAMETER; + } ps_sps->i1_log2_diff_max_min_pcm_coding_block_size = value; BITS_PARSE("pcm_loop_filter_disable_flag", value, ps_bitstrm, 1); ps_sps->i1_pcm_loop_filter_disable_flag = value; } UEV_PARSE("num_short_term_ref_pic_sets", value, ps_bitstrm); - if(value < 0 || value > MAX_STREF_PICS_SPS) + if(value > MAX_STREF_PICS_SPS) { return IHEVCD_INVALID_PARAMETER; } @@ -1611,7 +1807,7 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) if(ps_sps->i1_long_term_ref_pics_present_flag) { UEV_PARSE("num_long_term_ref_pics_sps", value, ps_bitstrm); - if(value < 0 || value > MAX_LTREF_PICS_SPS) + if(value > MAX_LTREF_PICS_SPS) { return IHEVCD_INVALID_PARAMETER; } @@ -1845,7 +2041,8 @@ void ihevcd_copy_sps(codec_t *ps_codec, WORD32 sps_id, WORD32 sps_id_ref) IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) { IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; - WORD32 value; + UWORD32 value; + WORD32 i4_value; WORD32 pps_id; pps_t *ps_pps; @@ -1873,8 +2070,11 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) ps_pps->i1_pps_id = pps_id; UEV_PARSE("seq_parameter_set_id", value, ps_bitstrm); + if(value > MAX_SPS_CNT - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_pps->i1_sps_id = value; - ps_pps->i1_sps_id = CLIP3(ps_pps->i1_sps_id, 0, MAX_SPS_CNT - 2); ps_sps = (ps_codec->s_parse.ps_sps_base + ps_pps->i1_sps_id); @@ -1909,13 +2109,25 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) ps_pps->i1_cabac_init_present_flag = value; UEV_PARSE("num_ref_idx_l0_default_active_minus1", value, ps_bitstrm); + if(value > MAX_DPB_SIZE - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_pps->i1_num_ref_idx_l0_default_active = value + 1; UEV_PARSE("num_ref_idx_l1_default_active_minus1", value, ps_bitstrm); + if(value > MAX_DPB_SIZE - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_pps->i1_num_ref_idx_l1_default_active = value + 1; - SEV_PARSE("pic_init_qp_minus26", value, ps_bitstrm); - ps_pps->i1_pic_init_qp = value + 26; + SEV_PARSE("pic_init_qp_minus26", i4_value, ps_bitstrm); + if(i4_value < -26 || i4_value > 25) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_pps->i1_pic_init_qp = i4_value + 26; BITS_PARSE("constrained_intra_pred_flag", value, ps_bitstrm, 1); ps_pps->i1_constrained_intra_pred_flag = value; @@ -1929,6 +2141,10 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) if(ps_pps->i1_cu_qp_delta_enabled_flag) { UEV_PARSE("diff_cu_qp_delta_depth", value, ps_bitstrm); + if(value > ps_sps->i1_log2_diff_max_min_coding_block_size) + { + return IHEVCD_INVALID_PARAMETER; + } ps_pps->i1_diff_cu_qp_delta_depth = value; } else @@ -1937,12 +2153,20 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) } ps_pps->i1_log2_min_cu_qp_delta_size = ps_sps->i1_log2_ctb_size - ps_pps->i1_diff_cu_qp_delta_depth; /* Print different */ - SEV_PARSE("cb_qp_offset", value, ps_bitstrm); - ps_pps->i1_pic_cb_qp_offset = value; + SEV_PARSE("cb_qp_offset", i4_value, ps_bitstrm); + if(i4_value < -12 || i4_value > 12) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_pps->i1_pic_cb_qp_offset = i4_value; /* Print different */ - SEV_PARSE("cr_qp_offset", value, ps_bitstrm); - ps_pps->i1_pic_cr_qp_offset = value; + SEV_PARSE("cr_qp_offset", i4_value, ps_bitstrm); + if(i4_value < -12 || i4_value > 12) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_pps->i1_pic_cr_qp_offset = i4_value; /* Print different */ BITS_PARSE("slicelevel_chroma_qp_flag", value, ps_bitstrm, 1); @@ -2019,7 +2243,7 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) { - WORD32 start; + UWORD32 start; WORD32 i, j; @@ -2058,7 +2282,7 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) start += value; if((start > ps_sps->i2_pic_wd_in_ctb) || - (value <= 0)) + (value == 0)) return IHEVCD_INVALID_HEADER; } @@ -2098,7 +2322,7 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) start += value; if((start > ps_sps->i2_pic_ht_in_ctb) || - (value <= 0)) + (value == 0)) return IHEVCD_INVALID_HEADER; } } @@ -2146,11 +2370,19 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) if(!ps_pps->i1_pic_disable_deblocking_filter_flag) { - SEV_PARSE("pps_beta_offset_div2", value, ps_bitstrm); - ps_pps->i1_beta_offset_div2 = value; + SEV_PARSE("pps_beta_offset_div2", i4_value, ps_bitstrm); + if(i4_value < -6 || i4_value > 6) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_pps->i1_beta_offset_div2 = i4_value; - SEV_PARSE("pps_tc_offset_div2", value, ps_bitstrm); - ps_pps->i1_tc_offset_div2 = value; + SEV_PARSE("pps_tc_offset_div2", i4_value, ps_bitstrm); + if(i4_value < -6 || i4_value > 6) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_pps->i1_tc_offset_div2 = i4_value; } } @@ -2167,6 +2399,10 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) BITS_PARSE("lists_modification_present_flag", value, ps_bitstrm, 1); ps_pps->i1_lists_modification_present_flag = value; UEV_PARSE("log2_parallel_merge_level_minus2", value, ps_bitstrm); + if(value > (ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_pps->i1_log2_parallel_merge_level = value + 2; BITS_PARSE("slice_header_extension_present_flag", value, ps_bitstrm, 1); @@ -2235,6 +2471,10 @@ IHEVCD_ERROR_T ihevcd_parse_buffering_period_sei(codec_t *ps_codec, ps_parse->s_sei_params.i1_buf_period_params_present_flag = 1; UEV_PARSE("bp_seq_parameter_set_id", value, ps_bitstrm); + if(value > MAX_SPS_CNT - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_buf_period_sei_params->u1_bp_seq_parameter_set_id = value; if(!ps_vui_hdr->u1_sub_pic_cpb_params_present_flag) @@ -2427,6 +2667,10 @@ IHEVCD_ERROR_T ihevcd_parse_pic_timing_sei(codec_t *ps_codec, sps_t *ps_sps) UWORD32 array_size; UEV_PARSE("num_decoding_units_minus1", value, ps_bitstrm); + if(value > (ps_sps->i4_pic_size_in_ctb -1)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_pic_timing->u4_num_decoding_units_minus1 = value; num_units_minus1 = ps_pic_timing->u4_num_decoding_units_minus1; @@ -2452,6 +2696,10 @@ IHEVCD_ERROR_T ihevcd_parse_pic_timing_sei(codec_t *ps_codec, sps_t *ps_sps) for(i = 0; i <= ps_pic_timing->u4_num_decoding_units_minus1; i++) { UEV_PARSE("num_nalus_in_du_minus1", value, ps_bitstrm); + if(value > (ps_sps->i4_pic_size_in_ctb -1)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_pic_timing->au4_num_nalus_in_du_minus1[i] = value; if((!ps_pic_timing->u1_du_common_cpb_removal_delay_flag) diff --git a/decoder/ihevcd_parse_residual.c b/decoder/ihevcd_parse_residual.c index 6e2a39c..0a39f99 100644 --- a/decoder/ihevcd_parse_residual.c +++ b/decoder/ihevcd_parse_residual.c @@ -721,7 +721,7 @@ WORD32 ihevcd_parse_residual_coding(codec_t *ps_codec, /* If there are zero coeffs, then shift by as many zero coeffs and decrement n */ clz = CLZ(u4_sig_coeff_map_shift); u4_sig_coeff_map_shift <<= clz; - n -= clz; + n -= (WORD32)clz; }while(u4_sig_coeff_map_shift); } /* At this level u4_sig_coeff_map is non-zero i.e. has atleast one non-zero coeff */ @@ -883,7 +883,7 @@ WORD32 ihevcd_parse_residual_coding(codec_t *ps_codec, /* If there are zero coeffs, then shift by as many zero coeffs and decrement n */ clz = CLZ(u4_sig_coeff_map_shift); u4_sig_coeff_map_shift <<= clz; - n -= clz; + n -= (WORD32)clz; }while(u4_sig_coeff_map_shift); diff --git a/decoder/ihevcd_parse_slice.c b/decoder/ihevcd_parse_slice.c index aedfbe7..a3e1e69 100644 --- a/decoder/ihevcd_parse_slice.c +++ b/decoder/ihevcd_parse_slice.c @@ -3168,13 +3168,17 @@ IHEVCD_ERROR_T ihevcd_parse_slice_data(codec_t *ps_codec) WORD32 ctb_row, ctb_col, index_pic_map, index_nbr_map; WORD32 first_pu_of_ctb; first_pu_of_ctb = pu4_nbr_pu_idx[1 + nbr_pu_idx_strd]; + UWORD32 cur_ctb_ht_in_min_pu = MIN(((ps_sps->i2_pic_height_in_luma_samples + - (ps_codec->s_parse.i4_ctb_y << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu); + UWORD32 cur_ctb_wd_in_min_pu = MIN(((ps_sps->i2_pic_width_in_luma_samples + - (ps_codec->s_parse.i4_ctb_x << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu); index_pic_map = 0 * ctb_size_in_min_pu + 0; index_nbr_map = (0 + 1) * nbr_pu_idx_strd + (0 + 1); - for(ctb_row = 0; ctb_row < ctb_size_in_min_pu; ctb_row++) + for(ctb_row = 0; ctb_row < cur_ctb_ht_in_min_pu; ctb_row++) { - for(ctb_col = 0; ctb_col < ctb_size_in_min_pu; ctb_col++) + for(ctb_col = 0; ctb_col < cur_ctb_wd_in_min_pu; ctb_col++) { pu1_pic_pu_map_ctb[index_pic_map + ctb_col] = pu4_nbr_pu_idx[index_nbr_map + ctb_col] - first_pu_of_ctb; diff --git a/decoder/ihevcd_parse_slice_header.c b/decoder/ihevcd_parse_slice_header.c index f08aa64..c161fc4 100644 --- a/decoder/ihevcd_parse_slice_header.c +++ b/decoder/ihevcd_parse_slice_header.c @@ -218,7 +218,8 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, nal_header_t *ps_nal) { IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; - WORD32 value; + UWORD32 value; + WORD32 i4_value; WORD32 i, j; WORD32 sps_id; @@ -233,7 +234,7 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, WORD32 no_output_of_prior_pics_flag = 0; WORD8 i1_nal_unit_type = ps_nal->i1_nal_unit_type; WORD32 num_poc_total_curr = 0; - WORD32 slice_address; + UWORD32 slice_address; WORD32 prev_slice_incomplete_flag = 0; if(ps_codec->i4_slice_error == 1) @@ -250,7 +251,10 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, BITS_PARSE("no_output_of_prior_pics_flag", no_output_of_prior_pics_flag, ps_bitstrm, 1); } UEV_PARSE("pic_parameter_set_id", pps_id, ps_bitstrm); - pps_id = CLIP3(pps_id, 0, MAX_PPS_CNT - 2); + if(pps_id < 0 || pps_id > MAX_PPS_CNT - 2) + { + return IHEVCD_INVALID_PARAMETER; + } /* Get the current PPS structure */ ps_pps = ps_codec->s_parse.ps_pps_base + pps_id; @@ -357,7 +361,7 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, slice_address = value; /* If slice address is greater than the number of CTBs in a picture, * ignore the slice */ - if(value >= ps_sps->i4_pic_size_in_ctb || value <= 0) + if(value >= ps_sps->i4_pic_size_in_ctb || value == 0) return IHEVCD_IGNORE_SLICE; } else @@ -378,6 +382,10 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, //slice_reserved_undetermined_flag[ i ] } UEV_PARSE("slice_type", value, ps_bitstrm); + if(value > 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i1_slice_type = value; /* If the picture is IRAP, slice type must be equal to ISLICE */ @@ -456,16 +464,18 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, if(ps_sps->i1_num_long_term_ref_pics_sps > 0) { UEV_PARSE("num_long_term_sps", value, ps_bitstrm); + if(value > ps_sps->i1_num_long_term_ref_pics_sps) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i1_num_long_term_sps = value; - - ps_slice_hdr->i1_num_long_term_sps = CLIP3(ps_slice_hdr->i1_num_long_term_sps, - 0, MAX_DPB_SIZE - num_neg_pics - num_pos_pics); } UEV_PARSE("num_long_term_pics", value, ps_bitstrm); + if((value + ps_slice_hdr->i1_num_long_term_sps + num_neg_pics + num_pos_pics) > (MAX_DPB_SIZE - 1)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i1_num_long_term_pics = value; - ps_slice_hdr->i1_num_long_term_pics = CLIP3(ps_slice_hdr->i1_num_long_term_pics, - 0, MAX_DPB_SIZE - num_neg_pics - num_pos_pics - - ps_slice_hdr->i1_num_long_term_sps); for(i = 0; i < (ps_slice_hdr->i1_num_long_term_sps + ps_slice_hdr->i1_num_long_term_pics); i++) @@ -566,11 +576,19 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, if(ps_slice_hdr->i1_num_ref_idx_active_override_flag) { UEV_PARSE("num_ref_idx_l0_active_minus1", value, ps_bitstrm); + if(value > MAX_DPB_SIZE - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i1_num_ref_idx_l0_active = value + 1; if(BSLICE == ps_slice_hdr->i1_slice_type) { UEV_PARSE("num_ref_idx_l1_active_minus1", value, ps_bitstrm); + if(value > MAX_DPB_SIZE - 2) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i1_num_ref_idx_l1_active = value + 1; } @@ -578,16 +596,12 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, else { ps_slice_hdr->i1_num_ref_idx_l0_active = ps_pps->i1_num_ref_idx_l0_default_active; - if(BSLICE == ps_slice_hdr->i1_slice_type) { ps_slice_hdr->i1_num_ref_idx_l1_active = ps_pps->i1_num_ref_idx_l1_default_active; } } - ps_slice_hdr->i1_num_ref_idx_l0_active = CLIP3(ps_slice_hdr->i1_num_ref_idx_l0_active, 0, MAX_DPB_SIZE - 1); - ps_slice_hdr->i1_num_ref_idx_l1_active = CLIP3(ps_slice_hdr->i1_num_ref_idx_l1_active, 0, MAX_DPB_SIZE - 1); - if(0 == num_poc_total_curr) return IHEVCD_IGNORE_SLICE; if((ps_pps->i1_lists_modification_present_flag) && (num_poc_total_curr > 1)) @@ -628,11 +642,25 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, (!ps_slice_hdr->i1_collocated_from_l0_flag && (ps_slice_hdr->i1_num_ref_idx_l1_active > 1))) { UEV_PARSE("collocated_ref_idx", value, ps_bitstrm); + if((PSLICE == ps_slice_hdr->i1_slice_type || BSLICE == ps_slice_hdr->i1_slice_type) && + ps_slice_hdr->i1_collocated_from_l0_flag) + { + if(value >= ps_slice_hdr->i1_num_ref_idx_l0_active) + { + return IHEVCD_INVALID_PARAMETER; + } + } + if(BSLICE == ps_slice_hdr->i1_slice_type && !ps_slice_hdr->i1_collocated_from_l0_flag) + { + if(value >= ps_slice_hdr->i1_num_ref_idx_l1_active) + { + return IHEVCD_INVALID_PARAMETER; + } + } ps_slice_hdr->i1_collocated_ref_idx = value; } } - ps_slice_hdr->i1_collocated_ref_idx = CLIP3(ps_slice_hdr->i1_collocated_ref_idx, 0, MAX_DPB_SIZE - 1); if((ps_pps->i1_weighted_pred_flag && (PSLICE == ps_slice_hdr->i1_slice_type)) || (ps_pps->i1_weighted_bipred_flag && (BSLICE == ps_slice_hdr->i1_slice_type))) @@ -640,20 +668,35 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, ihevcd_parse_pred_wt_ofst(ps_bitstrm, ps_sps, ps_pps, ps_slice_hdr); } UEV_PARSE("five_minus_max_num_merge_cand", value, ps_bitstrm); + if(value > 4) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i1_max_num_merge_cand = 5 - value; } - ps_slice_hdr->i1_max_num_merge_cand = CLIP3(ps_slice_hdr->i1_max_num_merge_cand, 1, 5); - SEV_PARSE("slice_qp_delta", value, ps_bitstrm); - ps_slice_hdr->i1_slice_qp_delta = value; + SEV_PARSE("slice_qp_delta", i4_value, ps_bitstrm); + if((i4_value + ps_pps->i1_pic_init_qp) < 0 || (i4_value + ps_pps->i1_pic_init_qp) > MAX_HEVC_QP) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_slice_hdr->i1_slice_qp_delta = i4_value; if(ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag) { - SEV_PARSE("slice_cb_qp_offset", value, ps_bitstrm); - ps_slice_hdr->i1_slice_cb_qp_offset = value; + SEV_PARSE("slice_cb_qp_offset", i4_value, ps_bitstrm); + if(i4_value < -12 || i4_value > 12) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_slice_hdr->i1_slice_cb_qp_offset = i4_value; - SEV_PARSE("slice_cr_qp_offset", value, ps_bitstrm); - ps_slice_hdr->i1_slice_cr_qp_offset = value; + SEV_PARSE("slice_cr_qp_offset", i4_value, ps_bitstrm); + if(i4_value < -12 || i4_value > 12) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_slice_hdr->i1_slice_cr_qp_offset = i4_value; } ps_slice_hdr->i1_deblocking_filter_override_flag = 0; @@ -680,11 +723,19 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, if(!ps_slice_hdr->i1_slice_disable_deblocking_filter_flag) { - SEV_PARSE("beta_offset_div2", value, ps_bitstrm); - ps_slice_hdr->i1_beta_offset_div2 = value; + SEV_PARSE("beta_offset_div2", i4_value, ps_bitstrm); + if(i4_value < -6 || i4_value > 6) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_slice_hdr->i1_beta_offset_div2 = i4_value; - SEV_PARSE("tc_offset_div2", value, ps_bitstrm); - ps_slice_hdr->i1_tc_offset_div2 = value; + SEV_PARSE("tc_offset_div2", i4_value, ps_bitstrm); + if(i4_value < -6 || i4_value > 6) + { + return IHEVCD_INVALID_PARAMETER; + } + ps_slice_hdr->i1_tc_offset_div2 = i4_value; } } @@ -819,24 +870,30 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, if((ps_pps->i1_tiles_enabled_flag) && (ps_pps->i1_entropy_coding_sync_enabled_flag)) { - max_num_entry_point_offsets = ps_pps->i1_num_tile_columns * (ps_sps->i2_pic_ht_in_ctb - 1); + max_num_entry_point_offsets = ps_pps->i1_num_tile_columns * ps_sps->i2_pic_ht_in_ctb - 1; } else if(ps_pps->i1_tiles_enabled_flag) { - max_num_entry_point_offsets = ps_pps->i1_num_tile_columns * ps_pps->i1_num_tile_rows; + max_num_entry_point_offsets = ps_pps->i1_num_tile_columns * ps_pps->i1_num_tile_rows - 1 ; } else { max_num_entry_point_offsets = (ps_sps->i2_pic_ht_in_ctb - 1); } - ps_slice_hdr->i4_num_entry_point_offsets = CLIP3(ps_slice_hdr->i4_num_entry_point_offsets, - 0, max_num_entry_point_offsets); + if(ps_slice_hdr->i4_num_entry_point_offsets < 0 || ps_slice_hdr->i4_num_entry_point_offsets > max_num_entry_point_offsets) + { + return IHEVCD_INVALID_PARAMETER; + } } if(ps_slice_hdr->i4_num_entry_point_offsets > 0) { UEV_PARSE("offset_len_minus1", value, ps_bitstrm); + if(value > 31) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i1_offset_len = value + 1; for(i = 0; i < ps_slice_hdr->i4_num_entry_point_offsets; i++) @@ -853,6 +910,10 @@ IHEVCD_ERROR_T ihevcd_parse_slice_header(codec_t *ps_codec, if(ps_pps->i1_slice_header_extension_present_flag) { UEV_PARSE("slice_header_extension_length", value, ps_bitstrm); + if(value > 256) + { + return IHEVCD_INVALID_PARAMETER; + } ps_slice_hdr->i2_slice_header_extension_length = value; diff --git a/decoder/ihevcd_process_slice.c b/decoder/ihevcd_process_slice.c index 72db2cc..c5af08e 100644 --- a/decoder/ihevcd_process_slice.c +++ b/decoder/ihevcd_process_slice.c @@ -760,13 +760,17 @@ IHEVCD_ERROR_T ihevcd_process(process_ctxt_t *ps_proc) WORD32 ctb_row, ctb_col, index_pic_map, index_nbr_map; WORD32 first_pu_of_ctb; first_pu_of_ctb = pu4_nbr_pu_idx[1 + nbr_pu_idx_strd]; + UWORD32 cur_ctb_ht_in_min_pu = MIN(((ps_sps->i2_pic_height_in_luma_samples + - (ps_proc->i4_ctb_y << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu); + UWORD32 cur_ctb_wd_in_min_pu = MIN(((ps_sps->i2_pic_width_in_luma_samples + - (ps_proc->i4_ctb_x << ps_sps->i1_log2_ctb_size)) / MIN_PU_SIZE), ctb_size_in_min_pu); index_pic_map = 0 * ctb_size_in_min_pu + 0; index_nbr_map = (0 + 1) * nbr_pu_idx_strd + (0 + 1); - for(ctb_row = 0; ctb_row < ctb_size_in_min_pu; ctb_row++) + for(ctb_row = 0; ctb_row < cur_ctb_ht_in_min_pu; ctb_row++) { - for(ctb_col = 0; ctb_col < ctb_size_in_min_pu; ctb_col++) + for(ctb_col = 0; ctb_col < cur_ctb_wd_in_min_pu; ctb_col++) { pu1_pic_pu_map_ctb[index_pic_map + ctb_col] = pu4_nbr_pu_idx[index_nbr_map + ctb_col] - first_pu_of_ctb; diff --git a/decoder/ihevcd_ref_list.c b/decoder/ihevcd_ref_list.c index 0fe6aa4..5f8e135 100644 --- a/decoder/ihevcd_ref_list.c +++ b/decoder/ihevcd_ref_list.c @@ -188,7 +188,7 @@ WORD32 ihevcd_ref_list(codec_t *ps_codec, pps_t *ps_pps, sps_t *ps_sps, slice_he i4_poc_lt = ps_slice_hdr->ai4_poc_lsb_lt[i]; if(ps_slice_hdr->ai1_delta_poc_msb_present_flag[i]) { - i4_poc_lt += i4_pic_order_cnt_val - ps_slice_hdr->ai1_delta_poc_msb_cycle_lt[i] * u4_max_poc_lsb - ps_slice_hdr->i4_pic_order_cnt_lsb; + i4_poc_lt += i4_pic_order_cnt_val - ps_slice_hdr->ai1_delta_poc_msb_cycle_lt[i] * (WORD32)u4_max_poc_lsb - ps_slice_hdr->i4_pic_order_cnt_lsb; } if(ps_slice_hdr->ai1_used_by_curr_pic_lt_flag[i]) diff --git a/decoder/ihevcd_sao.c b/decoder/ihevcd_sao.c index dc852c6..3940b6a 100644 --- a/decoder/ihevcd_sao.c +++ b/decoder/ihevcd_sao.c @@ -274,7 +274,7 @@ void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt) u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) * min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu); } } @@ -337,7 +337,7 @@ void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt) u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag)); pu1_src_tmp += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd); pu1_src_copy += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd); - tmp_wd -= CTZ(u4_no_loop_filter_flag) * min_cu; + tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) * min_cu); } else { @@ -352,7 +352,7 @@ void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt) u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) * min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu); } } @@ -407,7 +407,7 @@ void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt) u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag)); pu1_src_tmp += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd); pu1_src_copy += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd); - tmp_wd -= CTZ(u4_no_loop_filter_flag) * min_cu; + tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) * min_cu); } else { @@ -422,7 +422,7 @@ void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt) u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) * min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu); } } @@ -491,7 +491,7 @@ void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt) u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag)); pu1_src_tmp += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd); pu1_src_copy += MIN((WORD32)CTZ(u4_no_loop_filter_flag), tmp_wd); - tmp_wd -= CTZ(u4_no_loop_filter_flag) * min_cu; + tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) * min_cu); } else { @@ -506,7 +506,7 @@ void ihevcd_sao_ctb(sao_ctxt_t *ps_sao_ctxt) u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); pu1_src_tmp += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); pu1_src_copy += MIN((WORD32)CTZ(~u4_no_loop_filter_flag), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) * min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) * min_cu); } } @@ -669,7 +669,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) { pu1_src_tmp_luma += MIN((WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_luma += MIN((WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag)); } else @@ -683,7 +683,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) } pu1_src_tmp_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); } } @@ -748,7 +748,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) { pu1_src_tmp_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag)); } else @@ -763,7 +763,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) pu1_src_tmp_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); } } @@ -3392,7 +3392,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) { pu1_src_tmp_luma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_luma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag)); } else @@ -3406,7 +3406,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) } pu1_src_tmp_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_luma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); } } @@ -3470,7 +3470,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) { pu1_src_tmp_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_chroma += MIN(((WORD32)CTZ(u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(u4_no_loop_filter_flag)); } else @@ -3485,7 +3485,7 @@ void ihevcd_sao_shift_ctb(sao_ctxt_t *ps_sao_ctxt) pu1_src_tmp_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); pu1_src_backup_chroma += MIN(((WORD32)CTZ(~u4_no_loop_filter_flag) << log2_min_cu), tmp_wd); - tmp_wd -= CTZ(~u4_no_loop_filter_flag) << log2_min_cu; + tmp_wd -= (WORD32)(CTZ(~u4_no_loop_filter_flag) << log2_min_cu); u4_no_loop_filter_flag >>= (CTZ(~u4_no_loop_filter_flag)); } } |