diff --git a/decoder/ih264d_defs.h b/decoder/ih264d_defs.h index 73604f1..aeb2520 100644 --- a/decoder/ih264d_defs.h +++ b/decoder/ih264d_defs.h @@ -602,8 +602,9 @@ enum #define DISP_BOT_FLD_FIRST 2 /** Misc error resilience requirements*/ -#define MASK_LOG2_WEIGHT_DENOM 0xFFFFFFF8 -#define MASK_PRED_WEIGHT_OFFSET 0xFFFFFF00 +#define MAX_LOG2_WEIGHT_DENOM 7 +#define PRED_WEIGHT_MIN (-128) +#define PRED_WEIGHT_MAX 127 #define MAX_REDUNDANT_PIC_CNT 127 diff --git a/decoder/ih264d_parse_bslice.c b/decoder/ih264d_parse_bslice.c index 0af4214..b7d3d52 100644 --- a/decoder/ih264d_parse_bslice.c +++ b/decoder/ih264d_parse_bslice.c @@ -34,6 +34,7 @@ */ #include +#include "ih264_defs.h" #include "ih264d_bitstrm.h" #include "ih264d_defs.h" #include "ih264d_debug.h" @@ -1600,13 +1601,13 @@ WORD32 ih264d_parse_bslice(dec_struct_t * ps_dec, UWORD16 u2_first_mb_in_slice) } /* Read slice_qp_delta */ - i_temp = ps_pps->u1_pic_init_qp - + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp < 0) || (i_temp > 51)) + WORD64 i8_temp = (WORD64)ps_pps->u1_pic_init_qp + + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); + if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) { return ERROR_INV_RANGE_QP_T; } - ps_slice->u1_slice_qp = i_temp; + ps_slice->u1_slice_qp = i8_temp; COPYTHECONTEXT("SH: slice_qp_delta", (WORD8)(ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp)); diff --git a/decoder/ih264d_parse_headers.c b/decoder/ih264d_parse_headers.c index 793f604..2b277b9 100644 --- a/decoder/ih264d_parse_headers.c +++ b/decoder/ih264d_parse_headers.c @@ -35,6 +35,7 @@ #include "ih264_typedefs.h" #include "ih264_macros.h" #include "ih264_platform_macros.h" +#include "ih264_defs.h" #include "ih264d_bitstrm.h" #include "ih264d_structs.h" #include "ih264d_parse_cavlc.h" @@ -363,20 +364,21 @@ WORD32 ih264d_parse_pps(dec_struct_t * ps_dec, dec_bit_stream_t * ps_bitstrm) if(ps_pps->u1_wted_bipred_idc > MAX_WEIGHT_BIPRED_IDC) return ERROR_INV_SPS_PPS_T; - i_temp = 26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); + WORD64 i8_temp = (WORD64)26 + + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp < 0) || (i_temp > 51)) + if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T; - ps_pps->u1_pic_init_qp = i_temp; + ps_pps->u1_pic_init_qp = i8_temp; COPYTHECONTEXT("PPS: pic_init_qp_minus26",ps_pps->u1_pic_init_qp - 26); - i_temp = 26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); + i8_temp = (WORD64)26 + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp < 0) || (i_temp > 51)) + if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T; - ps_pps->u1_pic_init_qs = i_temp; + ps_pps->u1_pic_init_qs = i8_temp; COPYTHECONTEXT("PPS: pic_init_qs_minus26",ps_pps->u1_pic_init_qs - 26); i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); diff --git a/decoder/ih264d_parse_islice.c b/decoder/ih264d_parse_islice.c index 46a87d1..0b8111a 100644 --- a/decoder/ih264d_parse_islice.c +++ b/decoder/ih264d_parse_islice.c @@ -33,9 +33,10 @@ * \author NS ************************************************************************** */ +#include +#include "ih264_defs.h" #include "ih264d_error_handler.h" #include "ih264d_debug.h" -#include #include "ih264d_bitstrm.h" #include "ih264d_defs.h" #include "ih264d_debug.h" @@ -1399,11 +1400,11 @@ WORD32 ih264d_parse_islice(dec_struct_t *ps_dec, /* G050 */ /* Read slice_qp_delta */ - i_temp = ps_pps->u1_pic_init_qp - + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp < 0) || (i_temp > 51)) + WORD64 i8_temp = (WORD64)ps_pps->u1_pic_init_qp + + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); + if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T; - ps_slice->u1_slice_qp = i_temp; + ps_slice->u1_slice_qp = i8_temp; COPYTHECONTEXT("SH: slice_qp_delta", ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp); diff --git a/decoder/ih264d_parse_pslice.c b/decoder/ih264d_parse_pslice.c index 43979dc..fa2a2a8 100644 --- a/decoder/ih264d_parse_pslice.c +++ b/decoder/ih264d_parse_pslice.c @@ -35,6 +35,7 @@ */ #include +#include "ih264_defs.h" #include "ih264d_bitstrm.h" #include "ih264d_defs.h" #include "ih264d_debug.h" @@ -2130,13 +2131,13 @@ WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice) } /* Read slice_qp_delta */ - i_temp = ps_pps->u1_pic_init_qp - + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp < 0) || (i_temp > 51)) + WORD64 i8_temp = (WORD64)ps_pps->u1_pic_init_qp + + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); + if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) { return ERROR_INV_RANGE_QP_T; } - ps_cur_slice->u1_slice_qp = i_temp; + ps_cur_slice->u1_slice_qp = i8_temp; COPYTHECONTEXT("SH: slice_qp_delta", (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp)); diff --git a/decoder/ih264d_process_pslice.c b/decoder/ih264d_process_pslice.c index ed4cbbe..39000ad 100644 --- a/decoder/ih264d_process_pslice.c +++ b/decoder/ih264d_process_pslice.c @@ -829,7 +829,7 @@ WORD32 ih264d_parse_pred_weight_table(dec_slice_params_t * ps_cur_slice, WORD32 i_temp; u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if(u4_temp & MASK_LOG2_WEIGHT_DENOM) + if(u4_temp > MAX_LOG2_WEIGHT_DENOM) { return ERROR_PRED_WEIGHT_TABLE_T; } @@ -838,7 +838,7 @@ WORD32 ih264d_parse_pred_weight_table(dec_slice_params_t * ps_cur_slice, ui32_y_def_weight_ofst = (1 << uc_luma_log2_weight_denom); u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if(u4_temp & MASK_LOG2_WEIGHT_DENOM) + if(u4_temp > MAX_LOG2_WEIGHT_DENOM) { return ERROR_PRED_WEIGHT_TABLE_T; } @@ -864,14 +864,14 @@ WORD32 ih264d_parse_pred_weight_table(dec_slice_params_t * ps_cur_slice, { i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET) + if((i_temp < PRED_WEIGHT_MIN) || (i_temp > PRED_WEIGHT_MAX)) return ERROR_PRED_WEIGHT_TABLE_T; c_weight = i_temp; COPYTHECONTEXT("SH: luma_weight_l0",c_weight); i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET) + if((i_temp < PRED_WEIGHT_MIN) || (i_temp > PRED_WEIGHT_MAX)) return ERROR_PRED_WEIGHT_TABLE_T; c_offset = i_temp; COPYTHECONTEXT("SH: luma_offset_l0",c_offset); @@ -894,14 +894,14 @@ WORD32 ih264d_parse_pred_weight_table(dec_slice_params_t * ps_cur_slice, { i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET) + if((i_temp < PRED_WEIGHT_MIN) || (i_temp > PRED_WEIGHT_MAX)) return ERROR_PRED_WEIGHT_TABLE_T; c_weightCb = i_temp; COPYTHECONTEXT("SH: chroma_weight_l0",c_weightCb); i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET) + if((i_temp < PRED_WEIGHT_MIN) || (i_temp > PRED_WEIGHT_MAX)) return ERROR_PRED_WEIGHT_TABLE_T; c_offsetCb = i_temp; COPYTHECONTEXT("SH: chroma_weight_l0",c_offsetCb); @@ -911,14 +911,14 @@ WORD32 ih264d_parse_pred_weight_table(dec_slice_params_t * ps_cur_slice, i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET) + if((i_temp < PRED_WEIGHT_MIN) || (i_temp > PRED_WEIGHT_MAX)) return ERROR_PRED_WEIGHT_TABLE_T; c_weightCr = i_temp; COPYTHECONTEXT("SH: chroma_weight_l0",c_weightCr); i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); - if((i_temp + 128) & MASK_PRED_WEIGHT_OFFSET) + if((i_temp < PRED_WEIGHT_MIN) || (i_temp > PRED_WEIGHT_MAX)) return ERROR_PRED_WEIGHT_TABLE_T; c_offsetCr = i_temp; COPYTHECONTEXT("SH: chroma_weight_l0",c_offsetCr);