aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2016-04-27 17:25:07 +0530
committerRay Essick <essick@google.com>2016-06-22 21:32:05 +0000
commit506045b5adf4a589f0988cb9a9ae72c0138c7bf0 (patch)
treee585622d9000435aa70eaa992f93a474ed22c0fe
parentf59bff7af5688b1c96cf6d09a5bb81065a86d597 (diff)
downloadlibhevc-506045b5adf4a589f0988cb9a9ae72c0138c7bf0.tar.gz
Added support for exporting SEI mastering display color params
Bug: 27442922 Change-Id: Id466d48070ed916f18ebed6d3cf592bdcd206b83
-rw-r--r--decoder/ihevcd_api.c108
-rw-r--r--decoder/ihevcd_cxa.h47
-rw-r--r--decoder/ihevcd_error.h5
-rw-r--r--test/decoder/main.c27
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) &&