Encoder: Fixed unaligned access of i1_ref_idx and u1_mv in cabac context
am: 0a69e08c39
Change-Id: I5b6c330440b5219da31bf5f7e07b01fb65d8804a
diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c
index 859efe0..6fe3916 100644
--- a/decoder/ih264d_api.c
+++ b/decoder/ih264d_api.c
@@ -2173,12 +2173,16 @@
else
prev_slice_err = 2;
+ if(ps_dec->u4_first_slice_in_pic && (ps_dec->u2_total_mbs_coded == 0))
+ prev_slice_err = 1;
+
ret1 = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, ps_dec->u1_nal_unit_type == IDR_SLICE_NAL, ps_dec->ps_cur_slice->u2_frame_num,
&temp_poc, prev_slice_err);
- if((ret1 == ERROR_UNAVAIL_PICBUF_T) || (ret1 == ERROR_UNAVAIL_MVBUF_T))
+ if((ret1 == ERROR_UNAVAIL_PICBUF_T) || (ret1 == ERROR_UNAVAIL_MVBUF_T) ||
+ (ret1 == ERROR_INV_SPS_PPS_T))
{
- return IV_FAIL;
+ ret = ret1;
}
}
diff --git a/decoder/ih264d_inter_pred.c b/decoder/ih264d_inter_pred.c
index 01f2e01..b99a77c 100644
--- a/decoder/ih264d_inter_pred.c
+++ b/decoder/ih264d_inter_pred.c
@@ -474,7 +474,7 @@
UWORD8 i1_mc_wd, u1_dma_ht, u1_dma_wd, u1_dx, u1_dy;
pred_info_t * ps_pred ;
dec_slice_params_t * const ps_cur_slice = ps_dec->ps_cur_slice;
- const UWORD8 u1_slice_type = ps_cur_slice->u1_slice_type;
+ const UWORD8 u1_slice_type = ps_dec->ps_decode_cur_slice->slice_type;
UWORD8 u1_pod_bot, u1_pod_top;
/* load the pictype for pod u4_flag & chroma motion vector derivation */
@@ -1013,7 +1013,7 @@
UWORD32 u2_dest_wd_y, u2_dest_wd_uv;
UWORD32 u2_row_buf_wd_y = 0;
UWORD32 u2_row_buf_wd_uv = 0;
- UWORD32 u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd;
+ UWORD32 u2_log2Y_crwd;
UWORD32 u4_wd_y, u4_ht_y, u1_dir, u4_wd_uv;
UWORD32 u4_ht_uv;
UWORD8 *pu1_temp_mc_buffer = ps_dec->pu1_temp_mc_buffer;
@@ -1039,8 +1039,7 @@
ps_pred_y_back = ps_pred;
ps_pred_cr_forw = ps_pred;
- if(ps_dec->u1_separate_parse)
- u2_log2Y_crwd = ps_dec->ps_decode_cur_slice->u2_log2Y_crwd;
+ u2_log2Y_crwd = ps_dec->ps_decode_cur_slice->u2_log2Y_crwd;
if(!u1_pic_fld)
{
diff --git a/decoder/ih264d_parse_pslice.c b/decoder/ih264d_parse_pslice.c
index c712ed5..dfd1ba8 100644
--- a/decoder/ih264d_parse_pslice.c
+++ b/decoder/ih264d_parse_pslice.c
@@ -1489,10 +1489,27 @@
if(ps_dec->ps_cur_pic != NULL)
poc = ps_dec->ps_cur_pic->i4_poc + 2;
- j = 0;
+ j = -1;
for(i = 0; i < MAX_NUM_PIC_PARAMS; i++)
+ {
if(ps_dec->ps_pps[i].u1_is_valid == TRUE)
- j = i;
+ {
+ if(ps_dec->ps_pps[i].ps_sps->u1_is_valid == TRUE)
+ {
+ j = i;
+ break;
+ }
+ }
+ }
+
+ //if valid SPS PPS is not found return error
+ if(j == -1)
+ {
+ return ERROR_INV_SPS_PPS_T;
+ }
+
+ /* call ih264d_start_of_pic only if it was not called earlier*/
+ if(ps_dec->u4_pic_buf_got == 0)
{
//initialize slice params required by ih264d_start_of_pic to valid values
ps_dec->ps_cur_slice->u1_slice_type = P_SLICE;
@@ -1563,7 +1580,8 @@
&& ps_parse_cur_slice == ps_dec->ps_parse_cur_slice)
{
// Slice data corrupted
- u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb;
+ // in the case of mbaff, conceal from the even mb.
+ u1_num_mbs = (ps_dec->u4_num_mbs_cur_nmb >> u1_mbaff ) << u1_mbaff;
if(u1_num_mbs)
{
diff --git a/decoder/ih264d_parse_slice.c b/decoder/ih264d_parse_slice.c
index 22a7d0b..f7e1fba 100644
--- a/decoder/ih264d_parse_slice.c
+++ b/decoder/ih264d_parse_slice.c
@@ -441,6 +441,8 @@
/*make first entry of list0 point to cur pic,so that if first Islice is in error, ref pic struct will have valid entries*/
ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
*(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
+ /* Initialize for field reference as well */
+ *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
}
if(!ps_dec->ps_cur_pic)
@@ -1415,6 +1417,11 @@
ps_dec->u2_cur_slice_num++;
}
+ // in the case of single core increment ps_decode_cur_slice
+ if((ps_dec->u1_separate_parse == 0) && (ps_dec->u4_first_slice_in_pic == 0))
+ {
+ ps_dec->ps_decode_cur_slice++;
+ }
ps_dec->u1_slice_header_done = 0;
/*--------------------------------------------------------------------*/
diff --git a/encoder/ih264e.h b/encoder/ih264e.h
index 15a9d8f..4de0b17 100644
--- a/encoder/ih264e.h
+++ b/encoder/ih264e.h
@@ -484,6 +484,137 @@
}ih264e_video_encode_op_t;
+/*****************************************************************************/
+/* Video usability information */
+/*****************************************************************************/
+typedef struct
+{
+ /** size of the structure */
+ UWORD32 u4_size;
+
+ /** Command type : IVE_CMD_VIDEO_CTL */
+ IVE_API_COMMAND_TYPE_T e_cmd;
+
+ /** Sub command type : IVE_CMD_CTL_SET_GOP_PARAMS */
+ IVE_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
+
+ /** indicates the presence of aspect_ratio */
+ UWORD8 u1_aspect_ratio_info_present_flag;
+
+ /** specifies the aspect ratio of the luma samples */
+ UWORD8 u1_aspect_ratio_idc;
+
+ /** width of the luma samples. user dependent */
+ UWORD16 u2_sar_width;
+
+ /** Height of the luma samples. user dependent */
+ UWORD16 u2_sar_height;
+
+ /** if 1, specifies that the overscan_appropriate_flag is present
+ * if 0, the preferred display method for the video signal is unspecified */
+ UWORD8 u1_overscan_info_present_flag;
+
+ /** if 1,indicates that the cropped decoded pictures output
+ * are suitable for display using overscan */
+ UWORD8 u1_overscan_appropriate_flag;
+
+ /** if 1 specifies that video_format, video_full_range_flag and
+ * colour_description_present_flag are present */
+ UWORD8 u1_video_signal_type_present_flag;
+
+ /** pal, secam, ntsc, ... */
+ UWORD8 u1_video_format;
+
+ /** indicates the black level and range of the luma and chroma signals */
+ UWORD8 u1_video_full_range_flag;
+
+ /** if 1,specifies that colour_primaries, transfer_characteristics
+ * and matrix_coefficients are present */
+ UWORD8 u1_colour_description_present_flag;
+
+ /** indicates the chromaticity coordinates of the source primaries */
+ UWORD8 u1_colour_primaries;
+
+ /** indicates the opto-electronic transfer characteristic of the source picture */
+ UWORD8 u1_transfer_characteristics;
+
+ /** the matrix coefficients used in deriving luma and chroma signals
+ * from the green, blue, and red primaries */
+ UWORD8 u1_matrix_coefficients;
+
+ /** if 1, specifies that chroma_sample_loc_type_top_field and
+ * chroma_sample_loc_type_bottom_field are present */
+ UWORD8 u1_chroma_loc_info_present_flag;
+
+ /** location of chroma samples */
+ UWORD8 u1_chroma_sample_loc_type_top_field;
+ UWORD8 u1_chroma_sample_loc_type_bottom_field;
+
+ /** Indicates the presence of the num_units_in_ticks, time_scale flag */
+ UWORD8 u1_vui_timing_info_present_flag;
+
+ /** Number of units that correspond to one increment of the
+ * clock. Indicates the resolution */
+ UWORD32 u4_vui_num_units_in_tick;
+
+ /** The number of time units that pass in one second */
+ UWORD32 u4_vui_time_scale;
+
+ /** Flag indicating that time difference between two frames is a constant */
+ UWORD8 u1_fixed_frame_rate_flag;
+
+ /** Indicates the presence of NAL HRD parameters */
+ UWORD8 u1_nal_hrd_parameters_present_flag;
+
+ /** Indicates the presence of VCL HRD parameters */
+ UWORD8 u1_vcl_hrd_parameters_present_flag;
+
+ /** Specifies the HRD operational mode */
+ UWORD8 u1_low_delay_hrd_flag;
+
+ /** Indicates presence of SEI messages which include pic_struct syntax element */
+ UWORD8 u1_pic_struct_present_flag;
+
+ /** 1, specifies that the following cvs bitstream restriction parameters are present */
+ UWORD8 u1_bitstream_restriction_flag;
+
+ /** if 0, indicates that no pel outside the pic boundaries and
+ * no sub-pels derived using pels outside the pic boundaries is used for inter prediction */
+ UWORD8 u1_motion_vectors_over_pic_boundaries_flag;
+
+ /** Indicates a number of bytes not exceeded by the sum of the sizes of the VCL NAL units
+ * associated with any coded picture */
+ UWORD8 u1_max_bytes_per_pic_denom;
+
+ /** Indicates an upper bound for the number of bits of coding_unit() data */
+ UWORD8 u1_max_bits_per_mb_denom;
+
+ /** Indicate the maximum absolute value of a decoded horizontal MV component
+ * in quarter-pel luma units */
+ UWORD8 u1_log2_max_mv_length_horizontal;
+
+ /** Indicate the maximum absolute value of a decoded vertical MV component
+ * in quarter-pel luma units */
+ UWORD8 u1_log2_max_mv_length_vertical;
+
+ /** Max number of frames that are not synchronized in display and decode order */
+ UWORD8 u1_num_reorder_frames;
+
+ /** specifies required size of the HRD DPB in units of frame buffers */
+ UWORD8 u1_max_dec_frame_buffering;
+
+}ih264e_vui_ip_t;
+
+typedef struct
+{
+ /** size of the structure */
+ UWORD32 u4_size;
+
+ /** Return error code */
+ UWORD32 u4_error_code;
+}ih264e_vui_op_t;
+
+
/* The enum values should not have greater than 8 bits as this is assigned to WORD8 */
typedef enum
{
diff --git a/encoder/ih264e_api.c b/encoder/ih264e_api.c
index 1c9a48b..e0c9f83 100644
--- a/encoder/ih264e_api.c
+++ b/encoder/ih264e_api.c
@@ -1609,6 +1609,30 @@
break;
}
+ case IVE_CMD_CTL_SET_VUI_PARAMS:
+ {
+ ih264e_vui_ip_t *ps_ip = pv_api_ip;
+ ih264e_vui_op_t *ps_op = pv_api_op;
+
+ if(ps_ip->u4_size != sizeof(ih264e_vui_ip_t))
+ {
+ ps_op->u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
+ ps_op->u4_error_code |=
+ IVE_ERR_IP_CTL_SET_VUI_STRUCT_SIZE_INCORRECT;
+ return IV_FAIL;
+ }
+
+ if(ps_op->u4_size != sizeof(ih264e_vui_op_t))
+ {
+ ps_op->u4_error_code |= 1 << IVE_UNSUPPORTEDPARAM;
+ ps_op->u4_error_code |=
+ IVE_ERR_OP_CTL_SET_VUI_STRUCT_SIZE_INCORRECT;
+ return IV_FAIL;
+ }
+
+ break;
+ }
+
case IVE_CMD_CTL_SET_ENC_MODE:
{
ih264e_ctl_set_enc_mode_ip_t *ps_ip = pv_api_ip;
@@ -2210,7 +2234,10 @@
{
ps_codec->s_cfg.u4_num_cores = ps_cfg->u4_num_cores;
}
-
+ else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_VUI_PARAMS)
+ {
+ ps_codec->s_cfg.s_vui = ps_cfg->s_vui;
+ }
/* reset RC model */
if (u4_init_rc)
{
@@ -5217,7 +5244,90 @@
return IV_SUCCESS;
}
+/**
+ *******************************************************************************
+ *
+ * @brief
+ * Sets vui params
+ *
+ * @par Description:
+ * Video usability information
+ *
+ * @param[in] pv_api_ip
+ * Pointer to input argument structure
+ *
+ * @param[out] pv_api_op
+ * Pointer to output argument structure
+ *
+ * @param[out] ps_cfg
+ * Pointer to config structure to be updated
+ *
+ * @returns error status
+ *
+ * @remarks none
+ *
+ *******************************************************************************
+ */
+static WORD32 ih264e_set_vui_params(void *pv_api_ip,
+ void *pv_api_op,
+ cfg_params_t *ps_cfg)
+{
+ /* ctrl call I/O structures */
+ ih264e_vui_ip_t *ps_ip = pv_api_ip;
+ ih264e_vui_op_t *ps_op = pv_api_op;
+ vui_t *ps_vui = &ps_cfg->s_vui;
+ ps_op->u4_error_code = 0;
+
+ ps_vui->u1_aspect_ratio_info_present_flag =
+ ps_ip->u1_aspect_ratio_info_present_flag;
+ ps_vui->u1_aspect_ratio_idc = ps_ip->u1_aspect_ratio_idc;
+ ps_vui->u2_sar_width = ps_ip->u2_sar_width;
+ ps_vui->u2_sar_height = ps_ip->u2_sar_height;
+ ps_vui->u1_overscan_info_present_flag =
+ ps_ip->u1_overscan_info_present_flag;
+ ps_vui->u1_overscan_appropriate_flag = ps_ip->u1_overscan_appropriate_flag;
+ ps_vui->u1_video_signal_type_present_flag =
+ ps_ip->u1_video_signal_type_present_flag;
+ ps_vui->u1_video_format = ps_ip->u1_video_format;
+ ps_vui->u1_video_full_range_flag = ps_ip->u1_video_full_range_flag;
+ ps_vui->u1_colour_description_present_flag =
+ ps_ip->u1_colour_description_present_flag;
+ ps_vui->u1_colour_primaries = ps_ip->u1_colour_primaries;
+ ps_vui->u1_transfer_characteristics = ps_ip->u1_transfer_characteristics;
+ ps_vui->u1_matrix_coefficients = ps_ip->u1_matrix_coefficients;
+ ps_vui->u1_chroma_loc_info_present_flag =
+ ps_ip->u1_chroma_loc_info_present_flag;
+ ps_vui->u1_chroma_sample_loc_type_top_field =
+ ps_ip->u1_chroma_sample_loc_type_top_field;
+ ps_vui->u1_chroma_sample_loc_type_bottom_field =
+ ps_ip->u1_chroma_sample_loc_type_bottom_field;
+ ps_vui->u1_vui_timing_info_present_flag =
+ ps_ip->u1_vui_timing_info_present_flag;
+ ps_vui->u4_vui_num_units_in_tick = ps_ip->u4_vui_num_units_in_tick;
+ ps_vui->u4_vui_time_scale = ps_ip->u4_vui_time_scale;
+ ps_vui->u1_fixed_frame_rate_flag = ps_ip->u1_fixed_frame_rate_flag;
+ ps_vui->u1_nal_hrd_parameters_present_flag =
+ ps_ip->u1_nal_hrd_parameters_present_flag;
+ ps_vui->u1_vcl_hrd_parameters_present_flag =
+ ps_ip->u1_vcl_hrd_parameters_present_flag;
+ ps_vui->u1_low_delay_hrd_flag = ps_ip->u1_low_delay_hrd_flag;
+ ps_vui->u1_pic_struct_present_flag = ps_ip->u1_pic_struct_present_flag;
+ ps_vui->u1_bitstream_restriction_flag =
+ ps_ip->u1_bitstream_restriction_flag;
+ ps_vui->u1_motion_vectors_over_pic_boundaries_flag =
+ ps_ip->u1_motion_vectors_over_pic_boundaries_flag;
+ ps_vui->u1_max_bytes_per_pic_denom = ps_ip->u1_max_bytes_per_pic_denom;
+ ps_vui->u1_max_bits_per_mb_denom = ps_ip->u1_max_bits_per_mb_denom;
+ ps_vui->u1_log2_max_mv_length_horizontal =
+ ps_ip->u1_log2_max_mv_length_horizontal;
+ ps_vui->u1_log2_max_mv_length_vertical =
+ ps_ip->u1_log2_max_mv_length_vertical;
+ ps_vui->u1_num_reorder_frames = ps_ip->u1_num_reorder_frames;
+ ps_vui->u1_max_dec_frame_buffering = ps_ip->u1_max_dec_frame_buffering;
+
+ return IV_SUCCESS;
+}
/**
*******************************************************************************
*
@@ -5441,6 +5551,10 @@
ret = ih264_set_deblock_params(pv_api_ip, pv_api_op, ps_cfg);
break;
+ case IVE_CMD_CTL_SET_VUI_PARAMS:
+ ret = ih264e_set_vui_params(pv_api_ip, pv_api_op, ps_cfg);
+ break;
+
case IVE_CMD_CTL_RESET:
/* invalidate config param struct as it is being served right away */
diff --git a/encoder/ih264e_encode_header.c b/encoder/ih264e_encode_header.c
index 6cb5220..3626a63 100644
--- a/encoder/ih264e_encode_header.c
+++ b/encoder/ih264e_encode_header.c
@@ -160,54 +160,255 @@
WORD32 return_status = IH264E_SUCCESS;
/* aspect_ratio_info_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_aspect_ratio_info_present_flag, 1, return_status, "aspect_ratio_info_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_aspect_ratio_info_present_flag, 1,
+ return_status, "aspect_ratio_info_present_flag");
+ if(ps_vui->u1_aspect_ratio_info_present_flag)
+ { /* aspect_ratio_idc */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_aspect_ratio_idc, 8, return_status,
+ "aspect_ratio_idc");
+ if(255 == ps_vui->u1_aspect_ratio_idc) /* Extended_SAR */
+ { /* sar_width */
+ PUT_BITS(ps_bitstrm, ps_vui->u2_sar_width, 16, return_status,
+ "sar_width");
+ /* sar_height */
+ PUT_BITS(ps_bitstrm, ps_vui->u2_sar_height, 16, return_status,
+ "sar_height");
+ }
+
+ }
/* overscan_info_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_overscan_info_present_flag, 1, return_status, "overscan_info_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_overscan_info_present_flag, 1,
+ return_status, "overscan_info_present_flag");
+ if(ps_vui->u1_overscan_info_present_flag)
+ {
+ /* overscan_appropriate_flag */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_overscan_appropriate_flag, 1,
+ return_status, "overscan_appropriate_flag");
+
+ }
/* video_signal_type_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_video_signal_type_present_flag, 1, return_status, "video_signal_type_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_video_signal_type_present_flag, 1,
+ return_status, "video_signal_type_present_flag");
+
+ if(ps_vui->u1_video_signal_type_present_flag)
+ { /* video_format */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_video_format, 3, return_status,
+ "video_format");
+
+ /* video_full_range_flag */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_video_full_range_flag, 1, return_status,
+ "video_full_range_flag");
+
+ /* colour_description_present_flag */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_colour_description_present_flag, 1,
+ return_status, "colour_description_present_flag");
+
+ if(ps_vui->u1_colour_description_present_flag)
+ {
+ /* colour_primaries */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_colour_primaries, 8, return_status,
+ "colour_primaries");
+
+ /* transfer_characteristics */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_transfer_characteristics, 8,
+ return_status, "transfer_characteristics");
+
+ /* matrix_coefficients */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_matrix_coefficients, 8,
+ return_status, "matrix_coefficients");
+ }
+
+ }
/* chroma_loc_info_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_chroma_loc_info_present_flag, 1, return_status, "chroma_loc_info_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_chroma_loc_info_present_flag, 1,
+ return_status, "chroma_loc_info_present_flag");
+
+ if(ps_vui->u1_chroma_loc_info_present_flag)
+ {
+ /* chroma_sample_loc_type_top_field */
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_chroma_sample_loc_type_top_field,
+ return_status, "chroma_sample_loc_type_top_field");
+
+ /* chroma_sample_loc_type_bottom_field */
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_chroma_sample_loc_type_bottom_field,
+ return_status, "chroma_sample_loc_type_bottom_field");
+ }
/* timing_info_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_vui_timing_info_present_flag, 1, return_status, "timing_info_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_vui_timing_info_present_flag, 1,
+ return_status, "timing_info_present_flag");
+
+ if(ps_vui->u1_vui_timing_info_present_flag)
+ {
+ /* num_units_in_tick */
+ PUT_BITS(ps_bitstrm, ps_vui->u4_vui_num_units_in_tick, 32,
+ return_status, "num_units_in_tick");
+
+ /* time_scale */
+ PUT_BITS(ps_bitstrm, ps_vui->u4_vui_time_scale, 32, return_status,
+ "time_scale");
+
+ /* fixed_frame_rate_flag */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_fixed_frame_rate_flag, 1, return_status,
+ "fixed_frame_rate_flag");
+
+ }
/* nal_hrd_parameters_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_nal_hrd_parameters_present_flag, 1, return_status, "nal_hrd_parameters_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_nal_hrd_parameters_present_flag, 1,
+ return_status, "nal_hrd_parameters_present_flag");
+
+ if(ps_vui->u1_nal_hrd_parameters_present_flag)
+ {
+ hrd_params_t * ps_hrd_params = &ps_vui->s_nal_hrd_parameters;
+ WORD32 i;
+ /* cpb_cnt_minus1 */
+ PUT_BITS_UEV(ps_bitstrm, ps_hrd_params->u1_cpb_cnt_minus1,
+ return_status, "cpb_cnt_minus1");
+
+ /* bit_rate_scale */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u4_bit_rate_scale, 4, return_status,
+ "bit_rate_scale");
+
+ /* cpb_size_scale */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u4_cpb_size_scale, 4, return_status,
+ "cpb_size_scale");
+ for(i = 0; i < ps_hrd_params->u1_cpb_cnt_minus1; i++)
+ {
+ /* bit_rate_value_minus1[SchedSelIdx] */
+ PUT_BITS_UEV(ps_bitstrm,
+ ps_hrd_params->au4_bit_rate_value_minus1[i],
+ return_status, "bit_rate_value_minus1[SchedSelIdx]");
+
+ /* cpb_size_value_minus1[SchedSelIdx] */
+ PUT_BITS_UEV(ps_bitstrm,
+ ps_hrd_params->au4_cpb_size_value_minus1[i],
+ return_status, "cpb_size_value_minus1[SchedSelIdx]");
+
+ /* cbr_flag[SchedSelIdx] */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->au1_cbr_flag[i], 1,
+ return_status, "cbr_flag[SchedSelIdx]");
+ }
+
+ /* initial_cpb_removal_delay_length_minus1 */
+ PUT_BITS(ps_bitstrm,
+ ps_hrd_params->u1_initial_cpb_removal_delay_length_minus1, 5,
+ return_status, "initial_cpb_removal_delay_length_minus1");
+
+ /* cpb_removal_delay_length_minus1 */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u1_cpb_removal_delay_length_minus1,
+ 5, return_status, "cpb_removal_delay_length_minus1");
+
+ /* dpb_output_delay_length_minus1 */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u1_dpb_output_delay_length_minus1,
+ 5, return_status, "dpb_output_delay_length_minus1");
+
+ /* time_offset_length */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u1_time_offset_length, 5,
+ return_status, "time_offset_length");
+ }
/* vcl_hrd_parameters_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_vcl_hrd_parameters_present_flag, 1, return_status, "vcl_hrd_parameters_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_vcl_hrd_parameters_present_flag, 1,
+ return_status, "vcl_hrd_parameters_present_flag");
+ if(ps_vui->u1_vcl_hrd_parameters_present_flag)
+ {
+ hrd_params_t * ps_hrd_params = &ps_vui->s_vcl_hrd_parameters;
+ WORD32 i;
+ /* cpb_cnt_minus1 */
+ PUT_BITS_UEV(ps_bitstrm, ps_hrd_params->u1_cpb_cnt_minus1,
+ return_status, "cpb_cnt_minus1");
+
+ /* bit_rate_scale */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u4_bit_rate_scale, 4, return_status,
+ "bit_rate_scale");
+
+ /* cpb_size_scale */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u4_cpb_size_scale, 4, return_status,
+ "cpb_size_scale");
+ for(i = 0; i < ps_hrd_params->u1_cpb_cnt_minus1; i++)
+ {
+ /* bit_rate_value_minus1[SchedSelIdx] */
+ PUT_BITS_UEV(ps_bitstrm,
+ ps_hrd_params->au4_bit_rate_value_minus1[i],
+ return_status, "bit_rate_value_minus1[SchedSelIdx]");
+
+ /* cpb_size_value_minus1[SchedSelIdx] */
+ PUT_BITS_UEV(ps_bitstrm,
+ ps_hrd_params->au4_cpb_size_value_minus1[i],
+ return_status, "cpb_size_value_minus1[SchedSelIdx]");
+
+ /* cbr_flag[SchedSelIdx] */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->au1_cbr_flag[i], 1,
+ return_status, "cbr_flag[SchedSelIdx]");
+ }
+
+ /* initial_cpb_removal_delay_length_minus1 */
+ PUT_BITS(ps_bitstrm,
+ ps_hrd_params->u1_initial_cpb_removal_delay_length_minus1, 5,
+ return_status, "initial_cpb_removal_delay_length_minus1");
+
+ /* cpb_removal_delay_length_minus1 */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u1_cpb_removal_delay_length_minus1,
+ 5, return_status, "cpb_removal_delay_length_minus1");
+
+ /* dpb_output_delay_length_minus1 */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u1_dpb_output_delay_length_minus1,
+ 5, return_status, "dpb_output_delay_length_minus1");
+
+ /* time_offset_length */
+ PUT_BITS(ps_bitstrm, ps_hrd_params->u1_time_offset_length, 5,
+ return_status, "time_offset_length");
+ }
+
+ if(ps_vui->u1_nal_hrd_parameters_present_flag
+ || ps_vui->u1_vcl_hrd_parameters_present_flag)
+ {
+ /* low_delay_hrd_flag */
+ PUT_BITS(ps_bitstrm, ps_vui->u1_low_delay_hrd_flag, 1, return_status,
+ "low_delay_hrd_flag");
+ }
/* pic_struct_present_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_pic_struct_present_flag, 1, return_status, "pic_struct_present_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_pic_struct_present_flag, 1, return_status,
+ "pic_struct_present_flag");
/* bitstream_restriction_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_bitstream_restriction_flag, 1, return_status, "bitstream_restriction_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_bitstream_restriction_flag, 1,
+ return_status, "bitstream_restriction_flag");
if(ps_vui->u1_bitstream_restriction_flag == 1)
{
/* motion_vectors_over_pic_boundaries_flag */
- PUT_BITS(ps_bitstrm, ps_vui->u1_motion_vectors_over_pic_boundaries_flag, 1, return_status, "motion_vectors_over_pic_boundaries_flag");
+ PUT_BITS(ps_bitstrm, ps_vui->u1_motion_vectors_over_pic_boundaries_flag,
+ 1, return_status, "motion_vectors_over_pic_boundaries_flag");
/* max_bytes_per_pic_denom */
- PUT_BITS_UEV(ps_bitstrm,ps_vui->u1_max_bytes_per_pic_denom,return_status,"max_bytes_per_pic_denom");
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_max_bytes_per_pic_denom,
+ return_status, "max_bytes_per_pic_denom");
/* max_bits_per_mb_denom */
- PUT_BITS_UEV(ps_bitstrm,ps_vui->u1_max_bits_per_mb_denom,return_status,"max_bits_per_mb_denom");
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_max_bits_per_mb_denom,
+ return_status, "max_bits_per_mb_denom");
/* log2_max_mv_length_horizontal */
- PUT_BITS_UEV(ps_bitstrm,ps_vui->u1_log2_max_mv_length_horizontal,return_status,"log2_max_mv_length_horizontal");
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_log2_max_mv_length_horizontal,
+ return_status, "log2_max_mv_length_horizontal");
/* log2_max_mv_length_vertical */
- PUT_BITS_UEV(ps_bitstrm,ps_vui->u1_log2_max_mv_length_vertical,return_status,"log2_max_mv_length_vertical");
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_log2_max_mv_length_vertical,
+ return_status, "log2_max_mv_length_vertical");
/* max_num_reorder_frames */
- PUT_BITS_UEV(ps_bitstrm,ps_vui->u1_num_reorder_frames,return_status,"max_num_reorder_frames");
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_num_reorder_frames, return_status,
+ "max_num_reorder_frames");
/* max_dec_frame_buffering */
- PUT_BITS_UEV(ps_bitstrm,ps_vui->u1_max_dec_frame_buffering,return_status,"max_dec_frame_buffering");
+ PUT_BITS_UEV(ps_bitstrm, ps_vui->u1_max_dec_frame_buffering,
+ return_status, "max_dec_frame_buffering");
}
return return_status;
@@ -728,26 +929,20 @@
* @param[in] ps_codec
* pointer to encoder context
*
-* @param[out] ps_vui
-* pointer to vui params that needs to be populated
-*
* @return success or failure error code
*
******************************************************************************
*/
-IH264E_ERROR_T ih264e_populate_vui(codec_t *ps_codec, vui_t *ps_vui)
+IH264E_ERROR_T ih264e_populate_vui(codec_t *ps_codec)
{
- sps_t *ps_sps;
- ps_sps = ps_codec->ps_sps_base + ps_codec->i4_sps_id;
- ps_vui->u1_aspect_ratio_info_present_flag = 0;
- ps_vui->u1_overscan_info_present_flag = 0;
- ps_vui->u1_video_signal_type_present_flag = 0;
- ps_vui->u1_chroma_loc_info_present_flag = 0;
- ps_vui->u1_vui_timing_info_present_flag = 0;
+ vui_t *ps_vui = &ps_codec->s_cfg.s_vui;
+ sps_t *ps_sps = ps_codec->ps_sps_base + ps_codec->i4_sps_id;
+
+
ps_vui->u1_nal_hrd_parameters_present_flag = 0;
ps_vui->u1_vcl_hrd_parameters_present_flag = 0;
- ps_vui->u1_pic_struct_present_flag = 0;
+
ps_vui->u1_bitstream_restriction_flag = 1;
ps_vui->u1_motion_vectors_over_pic_boundaries_flag = 1;
ps_vui->u1_max_bytes_per_pic_denom = 0;
@@ -766,6 +961,7 @@
ps_vui->u1_max_dec_frame_buffering = ps_sps->u1_max_num_ref_frames;
+
return 0;
}
@@ -968,7 +1164,7 @@
if (ps_sps->i1_vui_parameters_present_flag)
{
/* populate vui params */
- ih264e_populate_vui(ps_codec,&(ps_codec->s_vui));
+ ih264e_populate_vui(ps_codec);
}
return i4_err_code;
diff --git a/encoder/ih264e_process.c b/encoder/ih264e_process.c
index fce7e35..796c983 100644
--- a/encoder/ih264e_process.c
+++ b/encoder/ih264e_process.c
@@ -181,7 +181,8 @@
ps_entropy->i4_error_code = IH264E_SUCCESS;
/* generate sps */
- ps_entropy->i4_error_code |= ih264e_generate_sps(ps_bitstrm, ps_sps, &ps_codec->s_vui);
+ ps_entropy->i4_error_code |= ih264e_generate_sps(ps_bitstrm, ps_sps,
+ &ps_codec->s_cfg.s_vui);
/* generate pps */
ps_entropy->i4_error_code |= ih264e_generate_pps(ps_bitstrm, ps_pps, ps_sps);
@@ -371,8 +372,8 @@
if (1 == ps_entropy->i4_gen_header)
{
/* generate sps */
- ps_entropy->i4_error_code |= ih264e_generate_sps(ps_bitstrm, ps_sps, &ps_codec->s_vui);
-
+ ps_entropy->i4_error_code |= ih264e_generate_sps(ps_bitstrm, ps_sps,
+ &ps_codec->s_cfg.s_vui);
/* generate pps */
ps_entropy->i4_error_code |= ih264e_generate_pps(ps_bitstrm, ps_pps, ps_sps);
diff --git a/encoder/ih264e_structs.h b/encoder/ih264e_structs.h
index 074731e..6cbce7c 100644
--- a/encoder/ih264e_structs.h
+++ b/encoder/ih264e_structs.h
@@ -563,6 +563,9 @@
*/
UWORD32 u4_mb_info_type;
+ /** VUI structure */
+ vui_t s_vui;
+
}cfg_params_t;
@@ -2618,11 +2621,6 @@
rate_control_ctxt_t s_rate_control;
/**
- * VUI structure
- */
- vui_t s_vui;
-
- /**
* input buffer queue
*/
inp_buf_t as_inp_list[MAX_NUM_BFRAMES];
diff --git a/encoder/ive2.h b/encoder/ive2.h
index 411f376..b2c00d5 100644
--- a/encoder/ive2.h
+++ b/encoder/ive2.h
@@ -139,6 +139,7 @@
IVE_CMD_CTL_SET_PROFILE_PARAMS = 0XB,
IVE_CMD_CTL_SET_DEBLOCK_PARAMS = 0XC,
IVE_CMD_CTL_SET_IPE_PARAMS = 0XD,
+ IVE_CMD_CTL_SET_VUI_PARAMS = 0XE,
IVE_CMD_CTL_SET_NUM_CORES = 0x30,
IVE_CMD_CTL_RESET = 0xA0,
IVE_CMD_CTL_FLUSH = 0xB0,
@@ -235,7 +236,8 @@
IVE_ERR_OP_CTL_SETVBVPARAMS_API_STRUCT_SIZE_INCORRECT = 0x3D,
IVE_ERR_IP_CTL_SETPROFILE_API_STRUCT_SIZE_INCORRECT = 0x3E,
IVE_ERR_OP_CTL_SETPROFILE_API_STRUCT_SIZE_INCORRECT = 0x3F,
-
+ IVE_ERR_IP_CTL_SET_VUI_STRUCT_SIZE_INCORRECT = 0x40,
+ IVE_ERR_OP_CTL_SET_VUI_STRUCT_SIZE_INCORRECT = 0x41,
}IVE_ERROR_CODES_T;
diff --git a/test/encoder/main.c b/test/encoder/main.c
index 0c7d4f0..bc25e8d 100644
--- a/test/encoder/main.c
+++ b/test/encoder/main.c
@@ -1445,6 +1445,65 @@
return;
}
+
+void set_vui_params(app_ctxt_t *ps_app_ctxt)
+{
+ IV_STATUS_T status;
+
+ ih264e_vui_ip_t s_vui_params_ip;
+ ih264e_vui_op_t s_vui_params_op;
+
+ s_vui_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
+ s_vui_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_VUI_PARAMS;
+
+ s_vui_params_ip.u1_aspect_ratio_info_present_flag = 0;
+ s_vui_params_ip.u1_aspect_ratio_idc = 0;
+ s_vui_params_ip.u2_sar_width = 0;
+ s_vui_params_ip.u2_sar_height = 0;
+ s_vui_params_ip.u1_overscan_info_present_flag = 0;
+ s_vui_params_ip.u1_overscan_appropriate_flag = 0;
+ s_vui_params_ip.u1_video_signal_type_present_flag = 0;
+ s_vui_params_ip.u1_video_format = 0;
+ s_vui_params_ip.u1_video_full_range_flag = 0;
+ s_vui_params_ip.u1_colour_description_present_flag = 0;
+ s_vui_params_ip.u1_colour_primaries = 0;
+ s_vui_params_ip.u1_transfer_characteristics = 0;
+ s_vui_params_ip.u1_matrix_coefficients = 0;
+ s_vui_params_ip.u1_chroma_loc_info_present_flag = 0;
+ s_vui_params_ip.u1_chroma_sample_loc_type_top_field = 0;
+ s_vui_params_ip.u1_chroma_sample_loc_type_bottom_field = 0;
+ s_vui_params_ip.u1_vui_timing_info_present_flag = 0;
+ s_vui_params_ip.u4_vui_num_units_in_tick = 0;
+ s_vui_params_ip.u4_vui_time_scale = 0;
+ s_vui_params_ip.u1_fixed_frame_rate_flag = 0;
+ s_vui_params_ip.u1_nal_hrd_parameters_present_flag = 0;
+ s_vui_params_ip.u1_vcl_hrd_parameters_present_flag = 0;
+ s_vui_params_ip.u1_low_delay_hrd_flag = 0;
+ s_vui_params_ip.u1_pic_struct_present_flag = 0;
+ s_vui_params_ip.u1_bitstream_restriction_flag = 0;
+ s_vui_params_ip.u1_motion_vectors_over_pic_boundaries_flag = 0;
+ s_vui_params_ip.u1_max_bytes_per_pic_denom = 0;
+ s_vui_params_ip.u1_max_bits_per_mb_denom = 0;
+ s_vui_params_ip.u1_log2_max_mv_length_horizontal = 0;
+ s_vui_params_ip.u1_log2_max_mv_length_vertical = 0;
+ s_vui_params_ip.u1_num_reorder_frames = 0;
+ s_vui_params_ip.u1_max_dec_frame_buffering = 0;
+
+
+ s_vui_params_ip.u4_size = sizeof(ih264e_vui_ip_t);
+ s_vui_params_op.u4_size = sizeof(ih264e_vui_op_t);
+
+ status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_vui_params_ip,
+ &s_vui_params_op);
+ if(status != IV_SUCCESS)
+ {
+ CHAR ac_error[STRLENGTH];
+ sprintf(ac_error, "Unable to set vui params = 0x%x\n",
+ s_vui_params_op.u4_error_code);
+ codec_exit(ac_error);
+ }
+ return;
+}
#define PEAK_WINDOW_SIZE 8
void synchronous_encode(iv_obj_t *ps_enc, app_ctxt_t *ps_app_ctxt)
@@ -2477,6 +2536,11 @@
/*****************************************************************************/
set_enc_mode(&s_app_ctxt, 0, 0, IVE_ENC_MODE_PICTURE);
+ /*****************************************************************************/
+ /* Video usability information */
+ /*****************************************************************************/
+ set_vui_params(&s_app_ctxt);
+
#ifdef IOS
/* Correct file paths */
sprintf(filename_with_path, "%s/%s", documentdir, s_app_ctxt.ac_ip_fname);