diff --git a/common/ihevc_defs.h b/common/ihevc_defs.h index 5360ff2..5f469e6 100644 --- a/common/ihevc_defs.h +++ b/common/ihevc_defs.h @@ -294,10 +294,14 @@ typedef enum { /* CTB Size Range */ #define MAX_CTB_SIZE 64 #define MIN_CTB_SIZE 16 +#define LOG2_MAX_CTB_SIZE 6 +#define LOG2_MIN_CTB_SIZE 4 /* TU Size Range */ #define MAX_TU_SIZE 32 #define MIN_TU_SIZE 4 +#define LOG2_MAX_TU_SIZE 5 +#define LOG2_MIN_TU_SIZE 2 /* Max Transform Size */ #define MAX_TRANS_SIZE (MAX_TU_SIZE*MAX_TU_SIZE) @@ -305,11 +309,14 @@ typedef enum { /* PU Size Range */ #define MAX_PU_SIZE 64 #define MIN_PU_SIZE 4 +#define LOG2_MAX_PU_SIZE 6 +#define LOG2_MIN_PU_SIZE 2 /* CU Size Range */ #define MAX_CU_SIZE 64 #define MIN_CU_SIZE 8 - +#define LOG2_MAX_CU_SIZE 6 +#define LOG2_MIN_CU_SIZE 3 /* Number of max TU in a CTB row */ #define MAX_TU_IN_CTB_ROW ((MAX_CTB_SIZE / MIN_TU_SIZE)) diff --git a/decoder/ihevcd_parse_headers.c b/decoder/ihevcd_parse_headers.c index 8a09bb1..8743b8b 100644 --- a/decoder/ihevcd_parse_headers.c +++ b/decoder/ihevcd_parse_headers.c @@ -1381,17 +1381,37 @@ IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) } UEV_PARSE("log2_min_coding_block_size_minus3", value, ps_bitstrm); + if(value > (LOG2_MAX_CU_SIZE - 3)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_sps->i1_log2_min_coding_block_size = value + 3; UEV_PARSE("log2_diff_max_min_coding_block_size", value, ps_bitstrm); + if(value > (LOG2_MAX_CU_SIZE - LOG2_MIN_CU_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; UEV_PARSE("log2_min_transform_block_size_minus2", value, ps_bitstrm); + if(value > (LOG2_MAX_TU_SIZE - 2)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_sps->i1_log2_min_transform_block_size = value + 2; + if(ps_sps->i1_log2_min_transform_block_size >= ps_sps->i1_log2_min_coding_block_size) + { + return IHEVCD_INVALID_PARAMETER; + } UEV_PARSE("log2_diff_max_min_transform_block_size", value, ps_bitstrm); + if(value > (LOG2_MAX_TU_SIZE - LOG2_MIN_TU_SIZE)) + { + return IHEVCD_INVALID_PARAMETER; + } ps_sps->i1_log2_diff_max_min_transform_block_size = value; ps_sps->i1_log2_max_transform_block_size = ps_sps->i1_log2_min_transform_block_size +