diff options
-rw-r--r-- | decoder/ih264d.h | 39 | ||||
-rw-r--r-- | decoder/ih264d_api.c | 104 | ||||
-rw-r--r-- | decoder/ih264d_error_handler.h | 3 | ||||
-rw-r--r-- | test/decoder/main.c | 23 |
4 files changed, 168 insertions, 1 deletions
diff --git a/decoder/ih264d.h b/decoder/ih264d.h index 63a5ce1..7c76296 100644 --- a/decoder/ih264d.h +++ b/decoder/ih264d.h @@ -429,6 +429,45 @@ typedef struct{ UWORD32 u4_buffer_ht[3]; }ih264d_ctl_get_frame_dimensions_op_t; +typedef struct +{ + UWORD32 u4_size; + IVD_API_COMMAND_TYPE_T e_cmd; + IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd; +}ih264d_ctl_get_vui_params_ip_t; + +typedef struct +{ + UWORD32 u4_size; + UWORD32 u4_error_code; + UWORD8 u1_aspect_ratio_idc; + UWORD16 u2_sar_width; + UWORD16 u2_sar_height; + UWORD8 u1_overscan_appropriate_flag; + UWORD8 u1_video_format; + UWORD8 u1_video_full_range_flag; + UWORD8 u1_colour_primaries; + UWORD8 u1_tfr_chars; + UWORD8 u1_matrix_coeffs; + UWORD8 u1_cr_top_field; + UWORD8 u1_cr_bottom_field; + UWORD32 u4_num_units_in_tick; + UWORD32 u4_time_scale; + UWORD8 u1_fixed_frame_rate_flag; + UWORD8 u1_nal_hrd_params_present; + UWORD8 u1_vcl_hrd_params_present; + UWORD8 u1_low_delay_hrd_flag; + UWORD8 u1_pic_struct_present_flag; + UWORD8 u1_bitstream_restriction_flag; + UWORD8 u1_mv_over_pic_boundaries_flag; + UWORD32 u4_max_bytes_per_pic_denom; + UWORD32 u4_max_bits_per_mb_denom; + UWORD32 u4_log2_max_mv_length_horz; + UWORD32 u4_log2_max_mv_length_vert; + UWORD32 u4_num_reorder_frames; + UWORD32 u4_max_dec_frame_buffering; +}ih264d_ctl_get_vui_params_op_t; + #ifdef __cplusplus } /* closing brace for extern "C" */ #endif diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c index 35ea948..ad7cf6b 100644 --- a/decoder/ih264d_api.c +++ b/decoder/ih264d_api.c @@ -135,6 +135,10 @@ UWORD32 ih264d_get_extra_mem_external(UWORD32 width, UWORD32 height); WORD32 ih264d_get_frame_dimensions(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op); +WORD32 ih264d_get_vui_params(iv_obj_t *dec_hdl, + void *pv_api_ip, + void *pv_api_op); + WORD32 ih264d_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op); WORD32 ih264d_deblock_display(dec_struct_t *ps_dec); @@ -743,7 +747,36 @@ static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle, break; } + case IH264D_CMD_CTL_GET_VUI_PARAMS: + { + ih264d_ctl_get_vui_params_ip_t *ps_ip; + ih264d_ctl_get_vui_params_op_t *ps_op; + + ps_ip = + (ih264d_ctl_get_vui_params_ip_t *)pv_api_ip; + ps_op = + (ih264d_ctl_get_vui_params_op_t *)pv_api_op; + + if(ps_ip->u4_size + != sizeof(ih264d_ctl_get_vui_params_ip_t)) + { + ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; + ps_op->u4_error_code |= + IVD_IP_API_STRUCT_SIZE_INCORRECT; + return IV_FAIL; + } + if(ps_op->u4_size + != sizeof(ih264d_ctl_get_vui_params_op_t)) + { + ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM; + ps_op->u4_error_code |= + IVD_OP_API_STRUCT_SIZE_INCORRECT; + return IV_FAIL; + } + + break; + } case IH264D_CMD_CTL_SET_NUM_CORES: { ih264d_ctl_set_num_cores_ip_t *ps_ip; @@ -3164,6 +3197,11 @@ WORD32 ih264d_ctl(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) ret = ih264d_get_frame_dimensions(dec_hdl, (void *)pv_api_ip, (void *)pv_api_op); break; + case IH264D_CMD_CTL_GET_VUI_PARAMS: + ret = ih264d_get_vui_params(dec_hdl, (void *)pv_api_ip, + (void *)pv_api_op); + break; + case IH264D_CMD_CTL_SET_PROCESSOR: ret = ih264d_set_processor(dec_hdl, (void *)pv_api_ip, (void *)pv_api_op); @@ -3391,6 +3429,72 @@ WORD32 ih264d_get_frame_dimensions(iv_obj_t *dec_hdl, } +WORD32 ih264d_get_vui_params(iv_obj_t *dec_hdl, + void *pv_api_ip, + void *pv_api_op) +{ + ih264d_ctl_get_vui_params_ip_t *ps_ip; + ih264d_ctl_get_vui_params_op_t *ps_op; + dec_struct_t *ps_dec = dec_hdl->pv_codec_handle; + dec_seq_params_t *ps_sps; + vui_t *ps_vui; + WORD32 i; + UWORD32 u4_size; + + ps_ip = (ih264d_ctl_get_vui_params_ip_t *)pv_api_ip; + ps_op = (ih264d_ctl_get_vui_params_op_t *)pv_api_op; + UNUSED(ps_ip); + + u4_size = ps_op->u4_size; + memset(ps_op, 0, sizeof(ih264d_ctl_get_vui_params_op_t)); + ps_op->u4_size = u4_size; + + if(NULL == ps_dec->ps_cur_sps) + { + ps_op->u4_error_code = ERROR_VUI_PARAMS_NOT_FOUND; + return IV_FAIL; + } + + ps_sps = ps_dec->ps_cur_sps; + if((0 == ps_sps->u1_is_valid) + || (0 == ps_sps->u1_vui_parameters_present_flag)) + { + ps_op->u4_error_code = ERROR_VUI_PARAMS_NOT_FOUND; + return IV_FAIL; + } + + ps_vui = &ps_sps->s_vui; + + ps_op->u1_aspect_ratio_idc = ps_vui->u1_aspect_ratio_idc; + ps_op->u2_sar_width = ps_vui->u2_sar_width; + ps_op->u2_sar_height = ps_vui->u2_sar_height; + ps_op->u1_overscan_appropriate_flag = ps_vui->u1_overscan_appropriate_flag; + ps_op->u1_video_format = ps_vui->u1_video_format; + ps_op->u1_video_full_range_flag = ps_vui->u1_video_full_range_flag; + ps_op->u1_colour_primaries = ps_vui->u1_colour_primaries; + ps_op->u1_tfr_chars = ps_vui->u1_tfr_chars; + ps_op->u1_matrix_coeffs = ps_vui->u1_matrix_coeffs; + ps_op->u1_cr_top_field = ps_vui->u1_cr_top_field; + ps_op->u1_cr_bottom_field = ps_vui->u1_cr_bottom_field; + ps_op->u4_num_units_in_tick = ps_vui->u4_num_units_in_tick; + ps_op->u4_time_scale = ps_vui->u4_time_scale; + ps_op->u1_fixed_frame_rate_flag = ps_vui->u1_fixed_frame_rate_flag; + ps_op->u1_nal_hrd_params_present = ps_vui->u1_nal_hrd_params_present; + ps_op->u1_vcl_hrd_params_present = ps_vui->u1_vcl_hrd_params_present; + ps_op->u1_low_delay_hrd_flag = ps_vui->u1_low_delay_hrd_flag; + ps_op->u1_pic_struct_present_flag = ps_vui->u1_pic_struct_present_flag; + ps_op->u1_bitstream_restriction_flag = ps_vui->u1_bitstream_restriction_flag; + ps_op->u1_mv_over_pic_boundaries_flag = ps_vui->u1_mv_over_pic_boundaries_flag; + ps_op->u4_max_bytes_per_pic_denom = ps_vui->u4_max_bytes_per_pic_denom; + ps_op->u4_max_bits_per_mb_denom = ps_vui->u4_max_bits_per_mb_denom; + ps_op->u4_log2_max_mv_length_horz = ps_vui->u4_log2_max_mv_length_horz; + ps_op->u4_log2_max_mv_length_vert = ps_vui->u4_log2_max_mv_length_vert; + ps_op->u4_num_reorder_frames = ps_vui->u4_num_reorder_frames; + ps_op->u4_max_dec_frame_buffering = ps_vui->u4_max_dec_frame_buffering; + + return IV_SUCCESS; +} + WORD32 ih264d_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op) { ih264d_ctl_set_num_cores_ip_t *ps_ip; diff --git a/decoder/ih264d_error_handler.h b/decoder/ih264d_error_handler.h index 5b1bc84..586fe8a 100644 --- a/decoder/ih264d_error_handler.h +++ b/decoder/ih264d_error_handler.h @@ -112,7 +112,8 @@ typedef enum ERROR_PIC_NUM_IS_REPEATED = 0x92, ERROR_IN_LAST_SLICE_OF_PIC = 0x93, ERROR_NEW_FRAME_EXPECTED = 0x94, - ERROR_INCOMPLETE_FRAME = 0x95 + ERROR_INCOMPLETE_FRAME = 0x95, + ERROR_VUI_PARAMS_NOT_FOUND = 0x96 } h264_decoder_error_code_t; diff --git a/test/decoder/main.c b/test/decoder/main.c index 875ed3d..ea7fca3 100644 --- a/test/decoder/main.c +++ b/test/decoder/main.c @@ -2607,7 +2607,30 @@ int main(WORD32 argc, CHAR *argv[]) */ } + /*************************************************************************/ + /* Get VUI parameters */ + /*************************************************************************/ + { + + ih264d_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip; + ih264d_ctl_get_vui_params_op_t s_ctl_get_vui_params_op; + + s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL; + s_ctl_get_vui_params_ip.e_sub_cmd = + (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_VUI_PARAMS; + s_ctl_get_vui_params_ip.u4_size = + sizeof(ih264d_ctl_get_vui_params_ip_t); + s_ctl_get_vui_params_op.u4_size = + sizeof(ih264d_ctl_get_vui_params_op_t); + ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_get_vui_params_ip, + (void *)&s_ctl_get_vui_params_op); + if(IV_SUCCESS != ret) + { + sprintf(ac_error_str, "Error in Get VUI params"); + //codec_exit(ac_error_str); + } + } /*************************************************************************/ /* Set the decoder in frame decode mode. It was set in header decode */ |