aboutsummaryrefslogtreecommitdiff
path: root/encoder/ih264e_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'encoder/ih264e_api.c')
-rw-r--r--encoder/ih264e_api.c309
1 files changed, 117 insertions, 192 deletions
diff --git a/encoder/ih264e_api.c b/encoder/ih264e_api.c
index c4c6050..f76fbd1 100644
--- a/encoder/ih264e_api.c
+++ b/encoder/ih264e_api.c
@@ -30,36 +30,36 @@
* ittiam
*
* @par List of Functions:
-* - api_check_struct_sanity()
-* - ih264e_codec_update_config()
-* - ih264e_set_default_params()
-* - ih264e_init()
-* - ih264e_get_num_rec()
-* - ih264e_fill_num_mem_rec()
-* - ih264e_init_mem_rec()
-* - ih264e_retrieve_memrec()
-* - ih264e_set_flush_mode()
-* - ih264e_get_buf_info()
-* - ih264e_set_dimensions()
-* - ih264e_set_frame_rate()
-* - ih264e_set_bit_rate()
-* - ih264e_set_frame_type()
-* - ih264e_set_qp()
-* - ih264e_set_enc_mode()
-* - ih264e_set_vbv_params()
-* - ih264_set_air_params()
-* - ih264_set_me_params()
-* - ih264_set_ipe_params()
-* - ih264_set_gop_params()
-* - ih264_set_profile_params()
-* - ih264_set_deblock_params()
-* - ih264e_set_num_cores()
-* - ih264e_reset()
-* - ih264e_ctl()
-* - ih264e_api_function()
+* - api_check_struct_sanity
+* - ih264e_codec_update_config
+* - ih264e_set_default_params
+* - ih264e_init
+* - ih264e_get_num_rec
+* - ih264e_fill_num_mem_rec
+* - ih264e_init_mem_rec
+* - ih264e_retrieve_memrec
+* - ih264e_set_flush_mode
+* - ih264e_get_buf_info
+* - ih264e_set_dimensions
+* - ih264e_set_frame_rate
+* - ih264e_set_bit_rate
+* - ih264e_set_frame_type
+* - ih264e_set_qp
+* - ih264e_set_enc_mode
+* - ih264e_set_vbv_params
+* - ih264_set_air_params
+* - ih264_set_me_params
+* - ih264_set_ipe_params
+* - ih264_set_gop_params
+* - ih264_set_profile_params
+* - ih264_set_deblock_params
+* - ih264e_set_num_cores
+* - ih264e_reset
+* - ih264e_ctl
+* - ih264e_api_function
*
* @remarks
-* None
+* none
*
*******************************************************************************
*/
@@ -78,60 +78,57 @@
/* User Include Files */
#include "ih264e_config.h"
#include "ih264_typedefs.h"
-#include "ih264_size_defs.h"
#include "iv2.h"
#include "ive2.h"
-#include "ih264e.h"
#include "ithread.h"
+
#include "ih264_debug.h"
-#include "ih264_defs.h"
+#include "ih264_macros.h"
#include "ih264_error.h"
+#include "ih264_defs.h"
+#include "ih264_mem_fns.h"
+#include "ih264_padding.h"
#include "ih264_structs.h"
+#include "ih264_size_defs.h"
#include "ih264_trans_quant_itrans_iquant.h"
#include "ih264_inter_pred_filters.h"
-#include "ih264_mem_fns.h"
-#include "ih264_padding.h"
#include "ih264_intra_pred_filters.h"
#include "ih264_deblk_edge_filters.h"
+#include "ih264_common_tables.h"
+#include "ih264_cavlc_tables.h"
#include "ih264_cabac_tables.h"
-#include "ih264_macros.h"
-#include "ih264e_defs.h"
-#include "ih264e_globals.h"
#include "ih264_buf_mgr.h"
+#include "ih264_list.h"
+#include "ih264_dpb_mgr.h"
+#include "ih264_platform_macros.h"
+
+#include "ime_defs.h"
+#include "ime_distortion_metrics.h"
+#include "ime_structs.h"
+
#include "irc_mem_req_and_acq.h"
#include "irc_cntrl_param.h"
#include "irc_frame_info_collector.h"
#include "irc_rate_control_api.h"
+
+#include "ih264e.h"
+#include "ih264e_error.h"
+#include "ih264e_version.h"
+#include "ih264e_defs.h"
+#include "ih264e_globals.h"
#include "ih264e_time_stamp.h"
#include "ih264e_modify_frm_rate.h"
#include "ih264e_rate_control.h"
-#include "ih264e_error.h"
+#include "ih264e_rc_mem_interface.h"
#include "ih264e_bitstream.h"
-#include "ime_defs.h"
-#include "ime_distortion_metrics.h"
-#include "ime_structs.h"
#include "ih264e_cabac_structs.h"
#include "ih264e_structs.h"
#include "ih264e_utils.h"
#include "ih264e_core_coding.h"
-#include "ih264_platform_macros.h"
-#include "ih264e_platform_macros.h"
-#include "ih264_list.h"
-#include "ih264_dpb_mgr.h"
-#include "ih264_cavlc_tables.h"
#include "ih264e_cavlc.h"
-#include "ih264_common_tables.h"
#include "ih264e_master.h"
#include "ih264e_fmt_conv.h"
-#include "ih264e_version.h"
-
-
-/*****************************************************************************/
-/* Function Declarations */
-/*****************************************************************************/
-WORD32 ih264e_get_rate_control_mem_tab(void *pv_rate_control,
- iv_mem_rec_t *ps_mem,
- ITT_FUNC_TYPE_E e_func_type);
+#include "ih264e_platform_macros.h"
/*****************************************************************************/
@@ -1613,6 +1610,16 @@ static IV_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
return IV_FAIL;
}
+ if((ps_ip->s_ive_ip.u4_idr_frm_interval > ps_ip->s_ive_ip.u4_i_frm_interval) &&
+ (ps_ip->s_ive_ip.u4_idr_frm_interval % ps_ip->s_ive_ip.u4_i_frm_interval != 0))
+ {
+ ps_op->s_ive_op.u4_error_code |= 1
+ << IVE_UNSUPPORTEDPARAM;
+ ps_op->s_ive_op.u4_error_code |=
+ IH264E_INVALID_INTRA_FRAME_INTERVAL;
+ return IV_FAIL;
+ }
+
break;
}
@@ -1709,15 +1716,8 @@ static IV_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
if ((ps_ip->s_ive_ip.u4_i_qp > ps_ip->s_ive_ip.u4_i_qp_max)
|| (ps_ip->s_ive_ip.u4_p_qp > ps_ip->s_ive_ip.u4_p_qp_max)
- || (ps_ip->s_ive_ip.u4_b_qp > ps_ip->s_ive_ip.u4_b_qp_max))
- {
- ps_op->s_ive_op.u4_error_code |= 1
- << IVE_UNSUPPORTEDPARAM;
- ps_op->s_ive_op.u4_error_code |= IH264E_INVALID_INIT_QP;
- return IV_FAIL;
- }
-
- if ((ps_ip->s_ive_ip.u4_i_qp < ps_ip->s_ive_ip.u4_i_qp_min)
+ || (ps_ip->s_ive_ip.u4_b_qp > ps_ip->s_ive_ip.u4_b_qp_max)
+ || (ps_ip->s_ive_ip.u4_i_qp < ps_ip->s_ive_ip.u4_i_qp_min)
|| (ps_ip->s_ive_ip.u4_p_qp < ps_ip->s_ive_ip.u4_p_qp_min)
|| (ps_ip->s_ive_ip.u4_b_qp < ps_ip->s_ive_ip.u4_b_qp_min))
{
@@ -2301,7 +2301,8 @@ static IV_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
return IV_FAIL;
}
- if (ps_ip->s_ive_ip.u4_air_refresh_period == 0)
+ if (ps_ip->s_ive_ip.e_air_mode != IVE_AIR_MODE_NONE &&
+ ps_ip->s_ive_ip.u4_air_refresh_period == 0)
{
ps_op->s_ive_op.u4_error_code |= 1
<< IVE_UNSUPPORTEDPARAM;
@@ -2569,100 +2570,14 @@ IH264E_ERROR_T ih264e_codec_update_config(codec_t *ps_codec,
else if (ps_cfg->e_cmd == IVE_CMD_CTL_SET_IPE_PARAMS)
{
ps_curr_cfg->u4_enc_speed_preset = ps_cfg->u4_enc_speed_preset;
- ps_curr_cfg->u4_constrained_intra_pred = ps_cfg->u4_constrained_intra_pred;
- if (ps_curr_cfg->u4_enc_speed_preset == IVE_SLOWEST)
- {/* high quality */
- /* enable diamond search */
- ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
- ps_curr_cfg->u4_enable_fast_sad = 0;
-
- /* disable intra 4x4 */
- ps_curr_cfg->u4_enable_intra_4x4 = 1;
- ps_codec->luma_energy_compaction[1] =
- ih264e_code_luma_intra_macroblock_4x4_rdopt_on;
-
- /* sub pel off */
- ps_curr_cfg->u4_enable_hpel = 1;
-
- /* deblocking off */
- ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0;
-
- /* disabled intra inter gating in Inter slices */
- ps_codec->u4_inter_gate = 0;
- }
- else if (ps_curr_cfg->u4_enc_speed_preset == IVE_NORMAL)
- {/* normal */
- /* enable diamond search */
- ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
- ps_curr_cfg->u4_enable_fast_sad = 0;
-
- /* disable intra 4x4 */
- ps_curr_cfg->u4_enable_intra_4x4 = 1;
-
- /* sub pel off */
- ps_curr_cfg->u4_enable_hpel = 1;
-
- /* deblocking off */
- ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0;
-
- /* disabled intra inter gating in Inter slices */
- ps_codec->u4_inter_gate = 0;
- }
- else if (ps_curr_cfg->u4_enc_speed_preset == IVE_FAST)
- {/* normal */
- /* enable diamond search */
- ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
- ps_curr_cfg->u4_enable_fast_sad = 0;
-
- /* disable intra 4x4 */
- ps_curr_cfg->u4_enable_intra_4x4 = 0;
-
- /* sub pel off */
- ps_curr_cfg->u4_enable_hpel = 1;
-
- /* deblocking off */
- ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_0;
-
- /* disabled intra inter gating in Inter slices */
- ps_codec->u4_inter_gate = 1;
- }
- else if (ps_curr_cfg->u4_enc_speed_preset == IVE_HIGH_SPEED)
- {/* fast */
- /* enable diamond search */
- ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
- ps_curr_cfg->u4_enable_fast_sad = 0;
-
- /* disable intra 4x4 */
- ps_curr_cfg->u4_enable_intra_4x4 = 0;
-
- /* sub pel off */
- ps_curr_cfg->u4_enable_hpel = 0;
- /* deblocking off */
- ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_4;
-
- /* disabled intra inter gating in Inter slices */
- ps_codec->u4_inter_gate = 0;
- }
- else if (ps_curr_cfg->u4_enc_speed_preset == IVE_FASTEST)
- {/* fastest */
- /* enable diamond search */
- ps_curr_cfg->u4_me_speed_preset = DMND_SRCH;
- //u4_num_layers = 4;
-
- /* disable intra 4x4 */
- ps_curr_cfg->u4_enable_intra_4x4 = 0;
-
- /* sub pel off */
- ps_curr_cfg->u4_enable_hpel = 0;
-
- /* deblocking off */
- ps_curr_cfg->u4_disable_deblock_level = DISABLE_DEBLK_LEVEL_4;
+ ps_curr_cfg->u4_constrained_intra_pred = ps_cfg->u4_constrained_intra_pred;
- /* disabled intra inter gating in Inter slices */
- ps_codec->u4_inter_gate = 1;
+ if (ps_curr_cfg->u4_enc_speed_preset != IVE_CONFIG)
+ {
+ ih264e_speed_preset_side_effects(ps_codec);
}
- else if (ps_curr_cfg->u4_enc_speed_preset == IVE_CONFIG)
+ else
{
ps_curr_cfg->u4_enable_intra_4x4 = ps_cfg->u4_enable_intra_4x4;
}
@@ -2679,8 +2594,7 @@ IH264E_ERROR_T ih264e_codec_update_config(codec_t *ps_codec,
/* re-init air map */
ih264e_init_air_map(ps_codec);
- /*Effect intra frame interval change*/
-
+ /* Effect intra frame interval change */
irc_change_intra_frm_int_call(
ps_codec->s_rate_control.pps_rate_control_api,
ps_curr_cfg->u4_i_frm_interval);
@@ -2991,9 +2905,9 @@ static WORD32 ih264e_set_default_params(cfg_params_t *ps_cfg)
ps_cfg->e_cmd = IVE_CMD_CT_NA;
ps_cfg->i4_wd_mbs = ps_cfg->u4_max_wd >> 4;
ps_cfg->i4_ht_mbs = ps_cfg->u4_max_ht >> 4;
- ps_cfg->u4_entropy_coding_mode = CAVLC;
+ ps_cfg->u4_entropy_coding_mode = DEFAULT_ENTROPY_CODING_MODE;
ps_cfg->u4_weighted_prediction = 0;
- ps_cfg->u4_constrained_intra_pred = 0;
+ ps_cfg->u4_constrained_intra_pred = DEFAULT_CONSTRAINED_INTRAPRED;
ps_cfg->u4_pic_info_type = 0;
ps_cfg->u4_mb_info_type = 0;
ps_cfg->s_vui.u1_video_signal_type_present_flag = 0;
@@ -3101,7 +3015,8 @@ static WORD32 ih264e_init(codec_t *ps_codec)
ps_codec->i4_pps_id = 0;
/* Process thread created status */
- memset(ps_codec->ai4_process_thread_created, 0, MAX_PROCESS_THREADS);
+ memset(ps_codec->ai4_process_thread_created, 0,
+ sizeof(ps_codec->ai4_process_thread_created));
memset(&ps_codec->s_global_quality_stats, 0, sizeof(ps_codec->s_global_quality_stats));
@@ -3328,7 +3243,7 @@ static WORD32 ih264e_fill_num_mem_rec(void *pv_api_ip, void *pv_api_op)
max_mb_cnt = max_mb_rows * max_mb_cols;
/* profile / level info */
- level = ih264e_get_min_level(max_ht_luma, max_wd_luma);
+ level = ih264e_get_min_level(max_wd_luma, max_ht_luma);
/* validate params */
if ((level < MIN_LEVEL) || (level > MAX_LEVEL))
@@ -3592,6 +3507,25 @@ static WORD32 ih264e_fill_num_mem_rec(void *pv_api_ip, void *pv_api_op)
DEBUG("\nMemory record Id %d = %d \n", MEM_REC_MVBITS, ps_mem_rec->u4_mem_size);
/************************************************************************
+ * Frame level Intra Cost Map. During intra/inter analysis preserve the*
+ * intra mb cost for future complexity estimation. *
+ * NOTE: The cost map is a overlay on the previous frame. In case if an*
+ * mb is not intra analyzed, the cost here represents its collocated mb*
+ * intra cost. This traversal can go till the latest I frame at worse *
+ ************************************************************************/
+ ps_mem_rec = &ps_mem_rec_base[MEM_REC_INTRA_COST];
+ {
+ /* total size of the mem record */
+ WORD32 total_size = 0;
+
+ /* size in bytes to mb core coding status of an entire frame */
+ total_size = max_mb_cnt * sizeof(WORD32);
+
+ ps_mem_rec->u4_mem_size = total_size;
+ }
+ DEBUG("\nMemory record Id %d = %d \n", MEM_REC_INTRA_COST, ps_mem_rec->u4_mem_size);
+
+ /************************************************************************
* Request memory for SPS *
***********************************************************************/
ps_mem_rec = &ps_mem_rec_base[MEM_REC_SPS];
@@ -4508,6 +4442,11 @@ static WORD32 ih264e_init_mem_rec(iv_obj_t *ps_codec_obj,
}
}
+ ps_mem_rec = &ps_mem_rec_base[MEM_REC_INTRA_COST];
+ {
+ ps_codec->pi4_mb_intra_cost = ps_mem_rec->pv_base;
+ }
+
ps_mem_rec = &ps_mem_rec_base[MEM_REC_SPS];
{
ps_codec->ps_sps_base = (sps_t *) ps_mem_rec->pv_base;
@@ -5710,7 +5649,6 @@ static IV_STATUS_T ih264_set_ipe_params(void *pv_api_ip,
ps_cfg->u4_enable_intra_4x4 = ps_ip->s_ive_ip.u4_enable_intra_4x4;
ps_cfg->u4_enc_speed_preset = ps_ip->s_ive_ip.u4_enc_speed_preset;
-
ps_cfg->u4_constrained_intra_pred = ps_ip->s_ive_ip.u4_constrained_intra_pred;
ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
@@ -5755,6 +5693,8 @@ static IV_STATUS_T ih264_set_gop_params(void *pv_api_ip,
ps_cfg->u4_i_frm_interval = ps_ip->s_ive_ip.u4_i_frm_interval;
ps_cfg->u4_idr_frm_interval = ps_ip->s_ive_ip.u4_idr_frm_interval;
+ if (ps_cfg->u4_idr_frm_interval < ps_cfg->u4_i_frm_interval)
+ ps_cfg->u4_i_frm_interval = ps_cfg->u4_idr_frm_interval;
ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
ps_cfg->u4_timestamp_low = ps_ip->s_ive_ip.u4_timestamp_low;
@@ -5797,7 +5737,6 @@ static IV_STATUS_T ih264_set_profile_params(void *pv_api_ip,
ps_op->s_ive_op.u4_error_code = 0;
ps_cfg->e_profile = ps_ip->s_ive_ip.e_profile;
-
ps_cfg->u4_entropy_coding_mode = ps_ip->s_ive_ip.u4_entropy_coding_mode;
ps_cfg->u4_timestamp_high = ps_ip->s_ive_ip.u4_timestamp_high;
@@ -5884,50 +5823,36 @@ static WORD32 ih264e_set_vui_params(void *pv_api_ip,
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_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_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_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_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->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_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_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_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;