aboutsummaryrefslogtreecommitdiff
path: root/decoder
diff options
context:
space:
mode:
Diffstat (limited to 'decoder')
-rw-r--r--decoder/ihevcd_api.c108
-rw-r--r--decoder/ihevcd_cxa.h47
-rw-r--r--decoder/ihevcd_error.h5
-rw-r--r--decoder/ihevcd_parse_headers.c36
-rw-r--r--decoder/ihevcd_parse_slice.c1
-rw-r--r--decoder/ihevcd_process_slice.c2
6 files changed, 190 insertions, 9 deletions
diff --git a/decoder/ihevcd_api.c b/decoder/ihevcd_api.c
index f1185a2..4a96ba4 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;
@@ -3155,6 +3183,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:
@@ -3387,6 +3491,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/decoder/ihevcd_parse_headers.c b/decoder/ihevcd_parse_headers.c
index a50efb8..af9903a 100644
--- a/decoder/ihevcd_parse_headers.c
+++ b/decoder/ihevcd_parse_headers.c
@@ -694,13 +694,15 @@ static WORD32 ihevcd_parse_vui_parameters(bitstrm_t *ps_bitstrm,
ps_vui->u1_video_format = VID_FMT_UNSPECIFIED;
ps_vui->u1_video_full_range_flag = 0;
ps_vui->u1_colour_description_present_flag = 0;
+ ps_vui->u1_colour_primaries = 2;
+ ps_vui->u1_transfer_characteristics = 2;
+ ps_vui->u1_matrix_coefficients = 2;
+
if(ps_vui->u1_video_signal_type_present_flag)
{
BITS_PARSE("video_format", ps_vui->u1_video_format, ps_bitstrm, 3);
BITS_PARSE("video_full_range_flag", ps_vui->u1_video_full_range_flag, ps_bitstrm, 1);
BITS_PARSE("colour_description_present_flag", ps_vui->u1_colour_description_present_flag, ps_bitstrm, 1);
- ps_vui->u1_colour_primaries = 2;
- ps_vui->u1_transfer_characteristics = 2;
if(ps_vui->u1_colour_description_present_flag)
{
BITS_PARSE("colour_primaries", ps_vui->u1_colour_primaries, ps_bitstrm, 8);
@@ -1836,16 +1838,32 @@ IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec)
ps_pps->i1_tiles_enabled_flag = value;
/* When tiles are enabled and width or height is >= 4096,
- * CTB Size should at least be 32. 16x16 CTBs can result
- * in tile position greater than 255 for 4096,
+ * CTB Size should at least be 32 while if width or height is >= 8192,
+ * CTB Size should at least be 64 and so on. 16x16 CTBs can result
+ * in tile position greater than 255 for 4096 while 32x32 CTBs can result
+ * in tile position greater than 255 for 8192,
* which decoder does not support.
*/
- if((ps_pps->i1_tiles_enabled_flag) &&
- (ps_sps->i1_log2_ctb_size == 4) &&
- ((ps_sps->i2_pic_width_in_luma_samples >= 4096) ||
- (ps_sps->i2_pic_height_in_luma_samples >= 4096)))
+ if (ps_pps->i1_tiles_enabled_flag)
{
- return IHEVCD_INVALID_HEADER;
+ if((ps_sps->i1_log2_ctb_size == 4) &&
+ ((ps_sps->i2_pic_width_in_luma_samples >= 4096) ||
+ (ps_sps->i2_pic_height_in_luma_samples >= 4096)))
+ {
+ return IHEVCD_INVALID_HEADER;
+ }
+ if((ps_sps->i1_log2_ctb_size == 5) &&
+ ((ps_sps->i2_pic_width_in_luma_samples >= 8192) ||
+ (ps_sps->i2_pic_height_in_luma_samples >= 8192)))
+ {
+ return IHEVCD_INVALID_HEADER;
+ }
+ if((ps_sps->i1_log2_ctb_size == 6) &&
+ ((ps_sps->i2_pic_width_in_luma_samples >= 16384) ||
+ (ps_sps->i2_pic_height_in_luma_samples >= 16384)))
+ {
+ return IHEVCD_INVALID_HEADER;
+ }
}
BITS_PARSE("entropy_coding_sync_enabled_flag", value, ps_bitstrm, 1);
diff --git a/decoder/ihevcd_parse_slice.c b/decoder/ihevcd_parse_slice.c
index 771afe9..aedfbe7 100644
--- a/decoder/ihevcd_parse_slice.c
+++ b/decoder/ihevcd_parse_slice.c
@@ -3272,6 +3272,7 @@ IHEVCD_ERROR_T ihevcd_parse_slice_data(codec_t *ps_codec)
}
+ DATA_SYNC();
/* Update the parse status map */
{
diff --git a/decoder/ihevcd_process_slice.c b/decoder/ihevcd_process_slice.c
index dbb878c..72db2cc 100644
--- a/decoder/ihevcd_process_slice.c
+++ b/decoder/ihevcd_process_slice.c
@@ -189,6 +189,7 @@ void ihevcd_proc_map_check(process_ctxt_t *ps_proc, proc_type_t proc_type, WORD3
//NOP(128 * 16);
}
}
+ DATA_SYNC();
}
}
@@ -202,6 +203,7 @@ void ihevcd_proc_map_update(process_ctxt_t *ps_proc, proc_type_t proc_type, WORD
/* Update the current CTBs processing status */
if(ps_proc->i4_check_proc_status)
{
+ DATA_SYNC();
for(i = 0; i < nctb; i++)
{
sps_t *ps_sps = ps_proc->ps_sps;