diff options
author | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2016-04-25 12:08:37 +0530 |
---|---|---|
committer | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2016-06-16 03:30:20 +0000 |
commit | 77985389f0ee19450c67284e2ac6263b184bdfb0 (patch) | |
tree | 84639d1c732bbb67b0728b8a2a279bc46a81c9ad | |
parent | 109dd2989fd5595bec81af5d2e625fc2bfee93a8 (diff) | |
download | libmpeg2-nougat-mr1-wear-release.tar.gz |
Added support for exporting seq header, seq extn and seq display extn infoandroid-wear-n-preview-2android-wear-7.1.1_r1android-n-preview-5android-n-iot-preview-2nougat-mr1-wear-releasen-iot-preview-2
Bug: 27442922
Change-Id: Idebc69a2bac22c61ec06176e563c93f80d103eee
-rw-r--r-- | decoder/impeg2d.h | 84 | ||||
-rw-r--r-- | decoder/impeg2d_api_main.c | 73 | ||||
-rw-r--r-- | decoder/impeg2d_dec_hdr.c | 10 | ||||
-rw-r--r-- | decoder/impeg2d_structs.h | 5 | ||||
-rw-r--r-- | test/decoder/main.c | 24 |
5 files changed, 193 insertions, 3 deletions
diff --git a/decoder/impeg2d.h b/decoder/impeg2d.h index 5567733..97094dc 100644 --- a/decoder/impeg2d.h +++ b/decoder/impeg2d.h @@ -167,6 +167,9 @@ typedef enum IMPEG2D_CMD_CTL_GET_BUFFER_DIMENSIONS = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x100, + /** Get Seq header/seq header extension info */ + IMPEG2D_CMD_CTL_GET_SEQ_INFO = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x101, + } IMPEG2D_CMD_CTL_SUB_CMDS; /*****************************************************************************/ @@ -509,6 +512,87 @@ typedef struct UWORD32 u4_buffer_ht[3]; } impeg2d_ctl_get_frame_dimensions_op_t; +typedef struct +{ + /** + * size + */ + UWORD32 u4_size; + + /** + * cmd + */ + IVD_API_COMMAND_TYPE_T e_cmd; + + /** + * sub cmd + */ + IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd; +} impeg2d_ctl_get_seq_info_ip_t; + +typedef struct +{ + /** + * size + */ + UWORD32 u4_size; + + /** + * error_code + */ + UWORD32 u4_error_code; + + /** + * aspect_ratio_information + */ + UWORD8 u1_aspect_ratio_information; + + /** + * frame_rate_code + */ + UWORD8 u1_frame_rate_code; + + /** + * frame_rate_extension_n + */ + UWORD8 u1_frame_rate_extension_n; + + /** + * frame_rate_extension_d + */ + UWORD8 u1_frame_rate_extension_d; + + /** + * video_format + */ + UWORD8 u1_video_format; + + /** + * colour_primaries + */ + UWORD8 u1_colour_primaries; + + /** + * transfer_characteristics + */ + UWORD8 u1_transfer_characteristics; + + /** + * matrix_coefficients + */ + UWORD8 u1_matrix_coefficients; + + /** + * display_horizontal_size + */ + UWORD16 u2_display_horizontal_size; + + /** + * display_vertical_size + */ + UWORD16 u2_display_vertical_size; + +} impeg2d_ctl_get_seq_info_op_t; #ifdef __cplusplus } /* closing brace for extern "C" */ #endif diff --git a/decoder/impeg2d_api_main.c b/decoder/impeg2d_api_main.c index 1bae457..5a6b36b 100644 --- a/decoder/impeg2d_api_main.c +++ b/decoder/impeg2d_api_main.c @@ -296,6 +296,44 @@ IV_API_CALL_STATUS_T impeg2d_api_set_num_cores(iv_obj_t *ps_dechdl, return IV_SUCCESS; } +IV_API_CALL_STATUS_T impeg2d_api_get_seq_info(iv_obj_t *ps_dechdl, + void *pv_api_ip, + void *pv_api_op) +{ + impeg2d_ctl_get_seq_info_ip_t *ps_ip; + impeg2d_ctl_get_seq_info_op_t *ps_op; + dec_state_t *ps_codec; + dec_state_multi_core_t *ps_dec_state_multi_core; + + ps_ip = (impeg2d_ctl_get_seq_info_ip_t *)pv_api_ip; + ps_op = (impeg2d_ctl_get_seq_info_op_t *)pv_api_op; + + ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle); + ps_codec = ps_dec_state_multi_core->ps_dec_state[0]; + UNUSED(ps_ip); + if(ps_codec->u2_header_done == 1) + { + ps_op->u1_aspect_ratio_information = ps_codec->u2_aspect_ratio_info; + ps_op->u1_frame_rate_code = ps_codec->u2_frame_rate_code; + ps_op->u1_frame_rate_extension_n = ps_codec->u2_frame_rate_extension_n; + ps_op->u1_frame_rate_extension_d = ps_codec->u2_frame_rate_extension_d; + ps_op->u1_video_format = ps_codec->u1_video_format; + ps_op->u1_colour_primaries = ps_codec->u1_colour_primaries; + ps_op->u1_transfer_characteristics = ps_codec->u1_transfer_characteristics; + ps_op->u1_matrix_coefficients = ps_codec->u1_matrix_coefficients; + ps_op->u2_display_horizontal_size = ps_codec->u2_display_horizontal_size; + ps_op->u2_display_vertical_size = ps_codec->u2_display_vertical_size; + ps_op->u4_error_code = IV_SUCCESS; + } + else + { + ps_op->u4_error_code = IV_FAIL; + } + + + return IV_SUCCESS; +} + /** ******************************************************************************* * @@ -2015,6 +2053,12 @@ IV_API_CALL_STATUS_T impeg2d_api_ctl(iv_obj_t *ps_dechdl, (void *)pv_api_op); break; + case IMPEG2D_CMD_CTL_GET_SEQ_INFO: + u4_error_code = impeg2d_api_get_seq_info(ps_dechdl, + (void *)pv_api_ip, + (void *)pv_api_op); + break; + case IMPEG2D_CMD_CTL_SET_PROCESSOR: u4_error_code = impeg2d_set_processor(ps_dechdl, (void *)pv_api_ip, (void *)pv_api_op); @@ -2874,7 +2918,36 @@ IV_API_CALL_STATUS_T impeg2d_api_check_struct_sanity(iv_obj_t *ps_handle, break; } + case IMPEG2D_CMD_CTL_GET_SEQ_INFO: + { + impeg2d_ctl_get_seq_info_ip_t *ps_ip; + impeg2d_ctl_get_seq_info_op_t *ps_op; + + ps_ip = + (impeg2d_ctl_get_seq_info_ip_t *)pv_api_ip; + ps_op = + (impeg2d_ctl_get_seq_info_op_t *)pv_api_op; + + if(ps_ip->u4_size + != sizeof(impeg2d_ctl_get_seq_info_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(impeg2d_ctl_get_seq_info_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 IMPEG2D_CMD_CTL_SET_NUM_CORES: { impeg2d_ctl_set_num_cores_ip_t *ps_ip; diff --git a/decoder/impeg2d_dec_hdr.c b/decoder/impeg2d_dec_hdr.c index e353e98..bfaf895 100644 --- a/decoder/impeg2d_dec_hdr.c +++ b/decoder/impeg2d_dec_hdr.c @@ -376,10 +376,14 @@ void impeg2d_dec_seq_disp_ext(dec_state_t *ps_dec) } */ - impeg2d_bit_stream_get(ps_stream,7); - if (impeg2d_bit_stream_get_bit(ps_stream) == 1) + impeg2d_bit_stream_get(ps_stream, 4); + ps_dec->u1_video_format = impeg2d_bit_stream_get(ps_stream, 3); + ps_dec->u1_colour_description = impeg2d_bit_stream_get(ps_stream, 1); + if(ps_dec->u1_colour_description) { - impeg2d_bit_stream_get(ps_stream,24); + ps_dec->u1_colour_primaries = impeg2d_bit_stream_get(ps_stream, 8); + ps_dec->u1_transfer_characteristics = impeg2d_bit_stream_get(ps_stream, 8); + ps_dec->u1_matrix_coefficients = impeg2d_bit_stream_get(ps_stream, 8); } /* display_horizontal_size and display_vertical_size */ diff --git a/decoder/impeg2d_structs.h b/decoder/impeg2d_structs.h index 743b043..b8fc3b5 100644 --- a/decoder/impeg2d_structs.h +++ b/decoder/impeg2d_structs.h @@ -248,6 +248,11 @@ typedef struct dec_state_struct_t /* Members related to display dimensions of bitstream */ /* The size values may not be returned right now. But they are read */ /* and can be returned if there is a requirement. */ + UWORD8 u1_video_format; + UWORD8 u1_colour_description; + UWORD8 u1_colour_primaries; + UWORD8 u1_transfer_characteristics; + UWORD8 u1_matrix_coefficients; UWORD16 u2_display_horizontal_size; UWORD16 u2_display_vertical_size; UWORD16 u2_aspect_ratio_info; diff --git a/test/decoder/main.c b/test/decoder/main.c index c344ec0..7a6db46 100644 --- a/test/decoder/main.c +++ b/test/decoder/main.c @@ -2598,6 +2598,30 @@ int main(WORD32 argc, CHAR *argv[]) s_ctl_get_frame_dimensions_op.u4_y_offset[0]); */ } + /*************************************************************************/ + /* Get Sequence Header/Seq Extn/Seq display extension info */ + /*************************************************************************/ + { + + impeg2d_ctl_get_seq_info_ip_t s_ctl_get_seq_info_ip; + impeg2d_ctl_get_seq_info_op_t s_ctl_get_seq_info_op; + + s_ctl_get_seq_info_ip.e_cmd = IVD_CMD_VIDEO_CTL; + s_ctl_get_seq_info_ip.e_sub_cmd = + (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_GET_SEQ_INFO; + s_ctl_get_seq_info_ip.u4_size = + sizeof(impeg2d_ctl_get_seq_info_ip_t); + s_ctl_get_seq_info_op.u4_size = + sizeof(impeg2d_ctl_get_seq_info_op_t); + + ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_get_seq_info_ip, + (void *)&s_ctl_get_seq_info_op); + if(IV_SUCCESS != ret) + { + sprintf(ac_error_str, "Error in Get Sequence Info"); + codec_exit(ac_error_str); + } + } /*************************************************************************/ |