diff options
author | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2016-04-27 17:25:07 +0530 |
---|---|---|
committer | Ray Essick <essick@google.com> | 2016-06-22 21:32:05 +0000 |
commit | 506045b5adf4a589f0988cb9a9ae72c0138c7bf0 (patch) | |
tree | e585622d9000435aa70eaa992f93a474ed22c0fe | |
parent | f59bff7af5688b1c96cf6d09a5bb81065a86d597 (diff) | |
download | libhevc-506045b5adf4a589f0988cb9a9ae72c0138c7bf0.tar.gz |
Added support for exporting SEI mastering display color params
Bug: 27442922
Change-Id: Id466d48070ed916f18ebed6d3cf592bdcd206b83
-rw-r--r-- | decoder/ihevcd_api.c | 108 | ||||
-rw-r--r-- | decoder/ihevcd_cxa.h | 47 | ||||
-rw-r--r-- | decoder/ihevcd_error.h | 5 | ||||
-rw-r--r-- | test/decoder/main.c | 27 |
4 files changed, 187 insertions, 0 deletions
diff --git a/decoder/ihevcd_api.c b/decoder/ihevcd_api.c index 5418fc0..c349fcb 100644 --- a/decoder/ihevcd_api.c +++ b/decoder/ihevcd_api.c @@ -758,6 +758,34 @@ static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle, break; } + case IHEVCD_CXA_CMD_CTL_GET_SEI_MASTERING_PARAMS: + { + ihevcd_cxa_ctl_get_sei_mastering_params_ip_t *ps_ip; + ihevcd_cxa_ctl_get_sei_mastering_params_op_t *ps_op; + + ps_ip = (ihevcd_cxa_ctl_get_sei_mastering_params_ip_t *)pv_api_ip; + ps_op = (ihevcd_cxa_ctl_get_sei_mastering_params_op_t *)pv_api_op; + + if(ps_ip->u4_size + != sizeof(ihevcd_cxa_ctl_get_sei_mastering_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(ihevcd_cxa_ctl_get_sei_mastering_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 IHEVCD_CXA_CMD_CTL_SET_NUM_CORES: { ihevcd_cxa_ctl_set_num_cores_ip_t *ps_ip; @@ -3144,6 +3172,82 @@ WORD32 ihevcd_get_vui_params(iv_obj_t *ps_codec_obj, ******************************************************************************* * * @brief +* Gets SEI mastering display color volume parameters +* +* @par Description: +* Gets SEI mastering display color volume parameters +* +* @param[in] ps_codec_obj +* Pointer to codec object at API level +* +* @param[in] pv_api_ip +* Pointer to input argument structure +* +* @param[out] pv_api_op +* Pointer to output argument structure +* +* @returns Status +* +* @remarks +* +* +******************************************************************************* +*/ +WORD32 ihevcd_get_sei_mastering_params(iv_obj_t *ps_codec_obj, + void *pv_api_ip, + void *pv_api_op) +{ + ihevcd_cxa_ctl_get_sei_mastering_params_ip_t *ps_ip; + ihevcd_cxa_ctl_get_sei_mastering_params_op_t *ps_op; + codec_t *ps_codec = (codec_t *)ps_codec_obj->pv_codec_handle; + sei_params_t *ps_sei; + mastering_dis_col_vol_sei_params_t *ps_mastering_dis_col_vol; + WORD32 i; + + ps_ip = (ihevcd_cxa_ctl_get_sei_mastering_params_ip_t *)pv_api_ip; + ps_op = (ihevcd_cxa_ctl_get_sei_mastering_params_op_t *)pv_api_op; + UNUSED(ps_ip); + if(NULL == ps_codec->ps_disp_buf) + { + ps_op->u4_error_code = IHEVCD_SEI_MASTERING_PARAMS_NOT_FOUND; + return IV_FAIL; + } + ps_sei = &ps_codec->ps_disp_buf->s_sei_params; + if((0 == ps_sei->i4_sei_mastering_disp_colour_vol_params_present_flags) + || (0 == ps_sei->i1_sei_parameters_present_flag)) + { + ps_op->u4_error_code = IHEVCD_SEI_MASTERING_PARAMS_NOT_FOUND; + return IV_FAIL; + } + + ps_mastering_dis_col_vol = &ps_sei->s_mastering_dis_col_vol_sei_params; + + for(i = 0; i < 3; i++) + { + ps_op->au2_display_primaries_x[i] = + ps_mastering_dis_col_vol->au2_display_primaries_x[i]; + + ps_op->au2_display_primaries_y[i] = + ps_mastering_dis_col_vol->au2_display_primaries_y[i]; + } + + ps_op->u2_white_point_x = ps_mastering_dis_col_vol->u2_white_point_x; + + ps_op->u2_white_point_y = ps_mastering_dis_col_vol->u2_white_point_y; + + ps_op->u4_max_display_mastering_luminance = + ps_mastering_dis_col_vol->u4_max_display_mastering_luminance; + + ps_op->u4_min_display_mastering_luminance = + ps_mastering_dis_col_vol->u4_min_display_mastering_luminance; + + return IV_SUCCESS; +} + +/** +******************************************************************************* +* +* @brief * Sets Processor type * * @par Description: @@ -3376,6 +3480,10 @@ WORD32 ihevcd_ctl(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op) ret = ihevcd_get_vui_params(ps_codec_obj, (void *)pv_api_ip, (void *)pv_api_op); break; + case IHEVCD_CXA_CMD_CTL_GET_SEI_MASTERING_PARAMS: + ret = ihevcd_get_sei_mastering_params(ps_codec_obj, (void *)pv_api_ip, + (void *)pv_api_op); + break; case IHEVCD_CXA_CMD_CTL_SET_PROCESSOR: ret = ihevcd_set_processor(ps_codec_obj, (void *)pv_api_ip, (void *)pv_api_op); diff --git a/decoder/ihevcd_cxa.h b/decoder/ihevcd_cxa.h index c23d1e7..21b2023 100644 --- a/decoder/ihevcd_cxa.h +++ b/decoder/ihevcd_cxa.h @@ -270,6 +270,9 @@ typedef enum /** Get VUI parameters */ IHEVCD_CXA_CMD_CTL_GET_VUI_PARAMS = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x101, + /** Get SEI Mastering display color volume parameters */ + IHEVCD_CXA_CMD_CTL_GET_SEI_MASTERING_PARAMS = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x102, + /** Enable/disable GPU, supported on select platforms */ IHEVCD_CXA_CMD_CTL_GPU_ENABLE_DISABLE = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x200, @@ -966,6 +969,50 @@ typedef struct { UWORD8 au1_cpb_cnt_minus1[6]; }ihevcd_cxa_ctl_get_vui_params_op_t; +typedef struct +{ + UWORD32 u4_size; + IVD_API_COMMAND_TYPE_T e_cmd; + IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd; +}ihevcd_cxa_ctl_get_sei_mastering_params_ip_t; + +typedef struct +{ + UWORD32 u4_size; + UWORD32 u4_error_code; + + /** + * Array to store the display_primaries_x values + */ + UWORD16 au2_display_primaries_x[3]; + + /** + * Array to store the display_primaries_y values + */ + UWORD16 au2_display_primaries_y[3]; + + /** + * Variable to store the white point x value + */ + UWORD16 u2_white_point_x; + + /** + * Variable to store the white point y value + */ + UWORD16 u2_white_point_y; + + /** + * Variable to store the max display mastering luminance value + */ + UWORD32 u4_max_display_mastering_luminance; + + /** + * Variable to store the min display mastering luminance value + */ + UWORD32 u4_min_display_mastering_luminance; + +}ihevcd_cxa_ctl_get_sei_mastering_params_op_t; + #ifdef __cplusplus } /* closing brace for extern "C" */ #endif diff --git a/decoder/ihevcd_error.h b/decoder/ihevcd_error.h index 7d2b255..429d4cc 100644 --- a/decoder/ihevcd_error.h +++ b/decoder/ihevcd_error.h @@ -123,5 +123,10 @@ typedef enum */ IHEVCD_VUI_PARAMS_NOT_FOUND, + /** + * SEI mastering parameters not found + */ + IHEVCD_SEI_MASTERING_PARAMS_NOT_FOUND, + }IHEVCD_ERROR_T; #endif /* _IHEVCD_ERROR_H_ */ diff --git a/test/decoder/main.c b/test/decoder/main.c index 680d7c7..87219a7 100644 --- a/test/decoder/main.c +++ b/test/decoder/main.c @@ -2870,6 +2870,33 @@ int main(WORD32 argc, CHAR *argv[]) } } + /*************************************************************************/ + /* Get SEI mastering display color volume parameters */ + /*************************************************************************/ + if(1 == s_video_decode_op.u4_output_present) + { + + ihevcd_cxa_ctl_get_sei_mastering_params_ip_t s_ctl_get_sei_mastering_params_ip; + ihevcd_cxa_ctl_get_sei_mastering_params_op_t s_ctl_get_sei_mastering_params_op; + + s_ctl_get_sei_mastering_params_ip.e_cmd = IVD_CMD_VIDEO_CTL; + s_ctl_get_sei_mastering_params_ip.e_sub_cmd = + (IVD_CONTROL_API_COMMAND_TYPE_T)IHEVCD_CXA_CMD_CTL_GET_SEI_MASTERING_PARAMS; + s_ctl_get_sei_mastering_params_ip.u4_size = + sizeof(ihevcd_cxa_ctl_get_sei_mastering_params_ip_t); + s_ctl_get_sei_mastering_params_op.u4_size = + sizeof(ihevcd_cxa_ctl_get_sei_mastering_params_op_t); + + ret = ivd_cxa_api_function((iv_obj_t *)codec_obj, + (void *)&s_ctl_get_sei_mastering_params_ip, + (void *)&s_ctl_get_sei_mastering_params_op); + if(IV_SUCCESS != ret) + { + sprintf(ac_error_str, "Error in Get SEI mastering params"); + //codec_exit(ac_error_str); + } + + } if((1 == s_app_ctx.display) && |