diff options
Diffstat (limited to 'decoder')
-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-- | decoder/ihevcd_parse_headers.c | 36 | ||||
-rw-r--r-- | decoder/ihevcd_parse_slice.c | 1 | ||||
-rw-r--r-- | decoder/ihevcd_process_slice.c | 2 |
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; |