summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2016-04-26 16:20:31 +0530
committerHarish Mahendrakar <harish.mahendrakar@ittiam.com>2016-06-22 04:10:00 +0000
commitd5953ced23853f0f59200a59a6ef62dd8a15ef05 (patch)
tree1cb312b6f9b550a012971975ac0fd801f67fdec1
parente8463cdf28c28907ea08e23708b3019a3eed1555 (diff)
downloadandroid_external_libavc-d5953ced23853f0f59200a59a6ef62dd8a15ef05.tar.gz
android_external_libavc-d5953ced23853f0f59200a59a6ef62dd8a15ef05.tar.bz2
android_external_libavc-d5953ced23853f0f59200a59a6ef62dd8a15ef05.zip
Decoder: Added support for exporting VUI params
Bug: 27442922 Change-Id: I4bc3a9fb31ffea1e9e8ae32e5ed49fcc12fbdf42
-rw-r--r--decoder/ih264d.h39
-rw-r--r--decoder/ih264d_api.c104
-rw-r--r--decoder/ih264d_error_handler.h3
-rw-r--r--test/decoder/main.c23
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 */