Decoder: Added support for exporting VUI params

Bug: 27442922

Change-Id: I4bc3a9fb31ffea1e9e8ae32e5ed49fcc12fbdf42
This commit is contained in:
Harish Mahendrakar 2016-04-26 16:20:31 +05:30
parent e8463cdf28
commit d5953ced23
4 changed files with 168 additions and 1 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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 */