blob: 6c874bde44a772acc06baff96e9bfe63a35c46c6 [file] [log] [blame]
/******************************************************************************
*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/*!
******************************************************************************
* \file ihevce_enc_loop_utils.h
*
* \brief
* This file contains interface defination of frame proceswsing pass
*
* \date
* 18/09/2012
*
* \author
* Ittiam
*
******************************************************************************
*/
#ifndef _IHEVCE_ENC_LOOP_UTILS_H_
#define _IHEVCE_ENC_LOOP_UTILS_H_
/*****************************************************************************/
/* Constant Macros */
/*****************************************************************************/
#define INTRA_ENC_DBG_L0 1 // Frame Level
#define INTRA_ENC_DBG_L1 1 // CTB Row Level
#define INTRA_ENC_DBG_L2 0 // CTB/CU Level
#define INTRA_ENC_DBG_L3 0 // PU/TU Level
#define INTRA_ENC_DBG_L4 0 // Pixel Level
/*****************************************************************************/
/* Function Macros */
/*****************************************************************************/
#define CABAC_FRAC_BITS_Q_SHIFT (1 << CABAC_FRAC_BITS_Q)
#define LAMDA_Q_SHIFT_FACT 20
#define QUANT_ROUND_FACTOR(out, r1, r0, lambda) \
{ \
LWORD64 temp3_m; \
LWORD64 temp; \
temp3_m = (((r1 - r0) * lambda)); \
temp = (CLIP3( \
((CABAC_FRAC_BITS_Q_SHIFT - \
((((LWORD64)(temp3_m) + ((LWORD64)CABAC_FRAC_BITS_Q_SHIFT << LAMDA_Q_SHIFT_FACT)) / \
2) >> \
LAMDA_Q_SHIFT_FACT))), \
0, \
(CABAC_FRAC_BITS_Q_SHIFT >> 1))); \
out = ((WORD32)(temp * (1 << QUANT_ROUND_FACTOR_Q))) >> CABAC_FRAC_BITS_Q; \
}
/*****************************************************************************/
/* Typedefs */
/*****************************************************************************/
/*****************************************************************************/
/* Enums */
/*****************************************************************************/
/*****************************************************************************/
/* Structure */
/*****************************************************************************/
/*****************************************************************************/
/* Extern Variable Declarations */
/*****************************************************************************/
/*****************************************************************************/
/* Extern Function Declarations */
/*****************************************************************************/
void ihevce_get_cl_cu_lambda_prms(ihevce_enc_loop_ctxt_t *ps_ctxt, WORD32 i4_cur_cu_qp);
void ihevce_populate_cl_cu_lambda_prms(
ihevce_enc_loop_ctxt_t *ps_ctxt,
frm_lambda_ctxt_t *ps_frm_lamda,
WORD32 i4_slice_type,
WORD32 i4_temporal_lyr_id,
WORD32 i4_lambda_type);
void ihevce_compute_quant_rel_param(ihevce_enc_loop_ctxt_t *ps_ctxt, WORD8 i1_cu_qp);
void ihevce_compute_cu_level_QP(
ihevce_enc_loop_ctxt_t *ps_ctxt,
WORD32 i4_activity_for_qp,
WORD32 i4_activity_for_lamda,
WORD32 i4_reduce_qp);
WORD32 ihevce_scan_coeffs(
WORD16 *pi2_quant_coeffs,
WORD32 *pi4_subBlock2csbfId_map,
WORD32 scan_idx,
WORD32 trans_size,
UWORD8 *pu1_out_data,
UWORD8 *pu1_csbf_buf,
WORD32 i4_csbf_stride);
void ihevce_populate_intra_pred_mode(
WORD32 top_intra_mode,
WORD32 left_intra_mode,
WORD32 available_top,
WORD32 available_left,
WORD32 cu_pos_y,
WORD32 *ps_cand_mode_list);
void ihevce_intra_pred_mode_signaling(
WORD32 top_intra_mode,
WORD32 left_intra_mode,
WORD32 available_top,
WORD32 available_left,
WORD32 cu_pos_y,
WORD32 luma_intra_pred_mode_current,
intra_prev_rem_flags_t *ps_intra_pred_mode_current);
void ihevce_chroma_interleave_2d_copy(
UWORD8 *pu1_uv_src_bp,
WORD32 src_strd,
UWORD8 *pu1_uv_dst_bp,
WORD32 dst_strd,
WORD32 w,
WORD32 h,
CHROMA_PLANE_ID_T e_chroma_plane);
WORD32 ihevce_t_q_iq_ssd_scan_fxn(
ihevce_enc_loop_ctxt_t *ps_ctxt,
UWORD8 *pu1_pred,
WORD32 pred_strd,
UWORD8 *pu1_src,
WORD32 src_strd,
WORD16 *pi2_deq_data,
WORD32 deq_data_strd,
UWORD8 *pu1_recon,
WORD32 i4_recon_stride,
UWORD8 *pu1_ecd_data,
UWORD8 *pu1_csbf_buf,
WORD32 csbf_strd,
WORD32 trans_size,
WORD32 packed_pred_mode,
LWORD64 *pi8_cost,
WORD32 *pi4_coeff_off,
WORD32 *pi4_tu_bits,
UWORD32 *pu4_blk_sad,
WORD32 *pi4_zero_col,
WORD32 *pi4_zero_row,
UWORD8 *pu1_is_recon_available,
WORD32 i4_perform_rdoq,
WORD32 i4_perform_sbh,
#if USE_NOISE_TERM_IN_ZERO_CODING_DECISION_ALGORITHMS
WORD32 i4_alpha_stim_multiplier,
UWORD8 u1_is_cu_noisy,
#endif
SSD_TYPE_T e_ssd_type,
WORD32 early_cbf);
void ihevce_quant_rounding_factor_gen(
WORD32 i4_trans_size,
WORD32 is_luma,
rdopt_entropy_ctxt_t *ps_rdopt_entropy_ctxt,
WORD32 *pi4_quant_round_0_1,
WORD32 *pi4_quant_round_1_2,
double i4_lamda_modifier,
UWORD8 i4_is_tu_level_quant_rounding);
void ihevce_it_recon_fxn(
ihevce_enc_loop_ctxt_t *ps_ctxt,
WORD16 *pi2_deq_data,
WORD32 deq_dat_strd,
UWORD8 *pu1_pred,
WORD32 pred_strd,
UWORD8 *pu1_recon,
WORD32 recon_strd,
UWORD8 *pu1_ecd_data,
WORD32 trans_size,
WORD32 packed_pred_mode,
WORD32 cbf,
WORD32 zero_cols,
WORD32 zero_rows);
void ihevce_chroma_it_recon_fxn(
ihevce_enc_loop_ctxt_t *ps_ctxt,
WORD16 *pi2_deq_data,
WORD32 deq_dat_strd,
UWORD8 *pu1_pred,
WORD32 pred_strd,
UWORD8 *pu1_recon,
WORD32 recon_strd,
UWORD8 *pu1_ecd_data,
WORD32 trans_size,
WORD32 cbf,
WORD32 zero_cols,
WORD32 zero_rows,
CHROMA_PLANE_ID_T e_chroma_plane);
void ihevce_mpm_idx_based_filter_RDOPT_cand(
ihevce_enc_loop_ctxt_t *ps_ctxt,
cu_analyse_t *ps_cu_analyse,
nbr_4x4_t *ps_left_nbr_4x4,
nbr_4x4_t *ps_top_nbr_4x4,
UWORD8 *pu1_luma_mode,
UWORD8 *pu1_eval_mark);
LWORD64 ihevce_intra_rdopt_cu_ntu(
ihevce_enc_loop_ctxt_t *ps_ctxt,
enc_loop_cu_prms_t *ps_cu_prms,
void *pv_pred_org,
WORD32 pred_strd_org,
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
UWORD8 *pu1_luma_mode,
cu_analyse_t *ps_cu_analyse,
void *pv_curr_src,
void *pv_cu_left,
void *pv_cu_top,
void *pv_cu_top_left,
nbr_4x4_t *ps_left_nbr_4x4,
nbr_4x4_t *ps_top_nbr_4x4,
WORD32 nbr_4x4_left_strd,
WORD32 cu_left_stride,
WORD32 curr_buf_idx,
WORD32 func_proc_mode,
WORD32 i4_alpha_stim_multiplier);
LWORD64 ihevce_inter_rdopt_cu_ntu(
ihevce_enc_loop_ctxt_t *ps_ctxt,
enc_loop_cu_prms_t *ps_cu_prms,
void *pv_src,
WORD32 cu_size,
WORD32 cu_pos_x,
WORD32 cu_pos_y,
WORD32 curr_buf_idx,
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
cu_inter_cand_t *ps_inter_cand,
cu_analyse_t *ps_cu_analyse,
WORD32 i4_alpha_stim_multiplier);
LWORD64 ihevce_inter_tu_tree_selector_and_rdopt_cost_computer(
ihevce_enc_loop_ctxt_t *ps_ctxt,
enc_loop_cu_prms_t *ps_cu_prms,
void *pv_src,
WORD32 cu_size,
WORD32 cu_pos_x,
WORD32 cu_pos_y,
WORD32 curr_buf_idx,
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
cu_inter_cand_t *ps_inter_cand,
cu_analyse_t *ps_cu_analyse,
WORD32 i4_alpha_stim_multiplier);
LWORD64 ihevce_inter_rdopt_cu_mc_mvp(
ihevce_enc_loop_ctxt_t *ps_ctxt,
cu_inter_cand_t *ps_inter_cand,
WORD32 cu_size,
WORD32 cu_pos_x,
WORD32 cu_pos_y,
nbr_4x4_t *ps_left_nbr_4x4,
nbr_4x4_t *ps_top_nbr_4x4,
nbr_4x4_t *ps_topleft_nbr_4x4,
WORD32 nbr_4x4_left_strd,
WORD32 curr_buf_idx);
void ihevce_intra_chroma_pred_mode_selector(
ihevce_enc_loop_ctxt_t *ps_ctxt,
enc_loop_chrm_cu_buf_prms_t *ps_chrm_cu_buf_prms,
cu_analyse_t *ps_cu_analyse,
WORD32 rd_opt_curr_idx,
WORD32 tu_mode,
WORD32 i4_alpha_stim_multiplier,
UWORD8 u1_is_cu_noisy);
LWORD64 ihevce_chroma_cu_prcs_rdopt(
ihevce_enc_loop_ctxt_t *ps_ctxt,
WORD32 rd_opt_curr_idx,
WORD32 func_proc_mode,
UWORD8 *pu1_chrm_src,
WORD32 chrm_src_stride,
UWORD8 *pu1_cu_left,
UWORD8 *pu1_cu_top,
UWORD8 *pu1_cu_top_left,
WORD32 cu_left_stride,
WORD32 cu_pos_x,
WORD32 cu_pos_y,
WORD32 *pi4_chrm_tu_bits,
WORD32 i4_alpha_stim_multiplier,
UWORD8 u1_is_cu_noisy);
void ihevce_set_eval_flags(
ihevce_enc_loop_ctxt_t *ps_ctxt, enc_loop_cu_final_prms_t *ps_enc_loop_bestprms);
void ihevce_final_rdopt_mode_prcs(
ihevce_enc_loop_ctxt_t *ps_ctxt, final_mode_process_prms_t *ps_prms);
WORD32 ihevce_set_flags_to_regulate_reevaluation(
cu_final_recon_flags_t *ps_cu_recon_flags,
ihevce_enc_cu_node_ctxt_t *ps_enc_out_ctxt,
UWORD8 *pu1_deviant_cu_regions,
WORD32 i4_num_deviant_cus,
WORD8 i1_qp_past,
WORD8 i1_qp_present,
UWORD8 u1_is_422);
void ihevce_err_compute(
UWORD8 *pu1_inp,
UWORD8 *pu1_interp_out_buf,
WORD32 *pi4_sad_grid,
WORD32 *pi4_tu_split_flags,
WORD32 inp_stride,
WORD32 out_stride,
WORD32 blk_size,
WORD32 part_mask,
WORD32 use_satd_for_err_calc);
void ihevce_determine_children_cost_of_32x32_cu(
block_merge_input_t *ps_merge_in,
WORD32 *pi4_cost_children,
WORD32 idx_of_tl_child,
WORD32 cu_pos_x,
WORD32 cu_pos_y);
WORD32 ihevce_determine_children_cost_of_cu_from_me_results(
block_merge_input_t *ps_merge_in,
cur_ctb_cu_tree_t *ps_cu_tree_root,
WORD32 *pi4_ref_bits,
WORD32 *pi4_cost_children,
WORD32 idx_of_tl_child,
CU_SIZE_T e_cu_size_parent);
void *ihevce_tu_tree_update(
tu_prms_t *ps_tu_prms,
WORD32 *pnum_tu_in_cu,
WORD32 depth,
WORD32 tu_split_flag,
WORD32 tu_early_cbf,
WORD32 i4_x_off,
WORD32 i4_y_off);
WORD32 ihevce_shrink_inter_tu_tree(
tu_enc_loop_out_t *ps_tu_enc_loop,
tu_enc_loop_temp_prms_t *ps_tu_enc_loop_temp_prms,
recon_datastore_t *ps_recon_datastore,
WORD32 num_tu_in_cu,
UWORD8 u1_is_422);
UWORD8 ihevce_intra_mode_nxn_hash_updater(
UWORD8 *pu1_mode_array, UWORD8 *pu1_hash_table, UWORD8 u1_num_ipe_modes);
#if ENABLE_TU_TREE_DETERMINATION_IN_RDOPT
WORD32 ihevce_determine_tu_tree_distribution(
cu_inter_cand_t *ps_cu_data,
me_func_selector_t *ps_func_selector,
WORD16 *pi2_scratch_mem,
UWORD8 *pu1_inp,
WORD32 i4_inp_stride,
WORD32 i4_lambda,
UWORD8 u1_lambda_q_shift,
UWORD8 u1_cu_size,
UWORD8 u1_max_tr_depth);
#endif
void ihevce_populate_nbr_4x4_with_pu_data(
nbr_4x4_t *ps_nbr_4x4, pu_t *ps_pu, WORD32 i4_nbr_buf_stride);
void ihevce_call_luma_inter_pred_rdopt_pass1(
ihevce_enc_loop_ctxt_t *ps_ctxt, cu_inter_cand_t *ps_inter_cand, WORD32 cu_size);
LWORD64 ihevce_it_recon_ssd(
ihevce_enc_loop_ctxt_t *ps_ctxt,
UWORD8 *pu1_src,
WORD32 i4_src_strd,
UWORD8 *pu1_pred,
WORD32 i4_pred_strd,
WORD16 *pi2_deq_data,
WORD32 i4_deq_data_strd,
UWORD8 *pu1_recon,
WORD32 i4_recon_stride,
UWORD8 *pu1_ecd_data,
UWORD8 u1_trans_size,
UWORD8 u1_pred_mode,
WORD32 i4_cbf,
WORD32 i4_zero_col,
WORD32 i4_zero_row,
CHROMA_PLANE_ID_T e_chroma_plane);
WORD32 ihevce_chroma_t_q_iq_ssd_scan_fxn(
ihevce_enc_loop_ctxt_t *ps_ctxt,
UWORD8 *pu1_pred,
WORD32 pred_strd,
UWORD8 *pu1_src,
WORD32 src_strd,
WORD16 *pi2_deq_data,
WORD32 deq_data_strd,
UWORD8 *pu1_recon,
WORD32 i4_recon_stride,
UWORD8 *pu1_ecd_data,
UWORD8 *pu1_csbf_buf,
WORD32 csbf_strd,
WORD32 trans_size,
WORD32 i4_scan_idx,
WORD32 intra_flag,
WORD32 *pi4_coeff_off,
WORD32 *pi4_tu_bits,
WORD32 *pi4_zero_col,
WORD32 *pi4_zero_row,
UWORD8 *pu1_is_recon_available,
WORD32 i4_perform_sbh,
WORD32 i4_perform_rdoq,
LWORD64 *pi8_cost,
#if USE_NOISE_TERM_IN_ZERO_CODING_DECISION_ALGORITHMS
WORD32 i4_alpha_stim_multiplier,
UWORD8 u1_is_cu_noisy,
#endif
UWORD8 u1_is_skip,
SSD_TYPE_T e_ssd_type,
CHROMA_PLANE_ID_T e_chroma_plane);
void ihevce_update_pred_qp(ihevce_enc_loop_ctxt_t *ps_ctxt, WORD32 cu_pos_x, WORD32 cu_pos_y);
#endif /* _IHEVCE_ENC_LOOP_UTILS_H_ */